Академический Документы
Профессиональный Документы
Культура Документы
INTRODUCTION TO MASSIVE
Massive is a program for the creation of behavioural simulation. A Massive scene consist of one or more autonomous
agents which can react to each other and their environment. Agents consist of a body and a brain. Their environment
consists of the other agents and an optional terrain model. The body is a hierarchy of connected segments, each
represented by a solid geometric primitive. The brain is a fuzzy logic network which can sample information from the
body and activate various parameters in the body.
Massive runs cdl files and mas files. Cdl stands for creature description language. A cdl file contains a complete
description of the body and brain of one agent. A mas file is a Massive setup file. It typically contains global settings
and placement data.
There are three ways to create motion in massive:
These three approaches can be combined. So a rigid body dynamic (RBD) simulation could be attached to an agent
which is controlled by actions, and forces could be applied from output nodes in the brain. Also the brain can be used
to modify actions to enable behaviour such as terrain adaptation and parametric variation of motion.
The brain page of the icons window can be used to create and modify the brains and observe their operation as a
directed graph of icons. The main menu is also in the icons window.
The view window displays a perspective image of the simulation. The camera position and orientation can be
controlled interactively, the camera can be constrained to the agents in various ways, and cameras can be read from
and written to files.
The physical aspects of an agent are edited in the body page of the icons window. This includes the dynamics
properties, cloth, geometry, shaders etc.
To run massive enter massive at the command line, or massive and the name of a cdl file or a mas file. For example:
massive CDL/boxy.cdl
massive MAS/boxes.mas
Running massive with -h will invoke command line help.
To run a simulation select Run -> Go from the menu or hit the spacebar. If the simulation runs slowly, it is possible to
view it in real time by recording images to disk. See Sim Dialog for details.
Massive
The general idea of fuzzy logic is to represent continuously valued inputs such as temperature as fuzzy values such
as cold, warm and hot, and then combine them in rules to control outputs. The possible output values are also
represented with fuzzy values, such as stop, slow and fast. A rule in a fuzzy logic air cooling system might then be "if
hot then fast".
Here's a more complete description of a fuzzy logic air cooling system:
Inputs: temperature
Outputs: fan speed
Fuzzy input values representing temperature: cold, warm, hot
Fuzzy output values for fan speed: stop, slow, fast
Rules:
If hot then fast
If warm then slow
If cold then stop
Of course the behaviour of such as system could easily be modeled with a simple expression, but as the required
behaviour becomes more detailed and subtle then the advantages of fuzzy logic become apparent.
Now for a more relevant example. This is a fuzzy logic system for controling the lean of an agent due to turning:
Inputs: speed, turning
Outputs: lean
Fuzzy input values based on speed: fast, slow
Fuzzy input values based on turning: left, straight, right
Fuzzy output values for lean: lean left, upright, lean right
Rules:
If fast and left then lean left
If fast and right then lean right
If slow or straight then upright
The interesting thing about this system is that the degree to which any of the three rules is true affects the degree to
which the fuzzy output values are asserted. This provides nice smooth control over the range of possible lean angles.
It also allows for interactive editing of the definitions of the fuzzy values. The resultant behaviour can be further fine
tuned by adjusting the weights of the rules.
Fuzzy values are defined by a membership function which is basically a simple curve. By applying the membership
function to the input values, a degree of truth between 0 and 1 is generated. Fuzzy values usually correspond to a
linguistic symbol such as hot or cold and sometimes they just represent a fuzzy version of a real number such as 0 or
8.
The membership function is often a triangular or bell shaped curve. For example a fuzzy zero might be .3 true if the
input value is -.07, which is close to `crisp' zero.
Defuzzification is the process of turning fuzzy output values into 'crisp' output values. In most cases this means
combining several fuzzy output values (such as zero slow medium fast) to determine an output value (eg: speed in
meters per second). The actual output value is dependent on the strengths of the rules which are activating the fuzzy
output values.
There are different methods of defuzzification. Some methods use an averaging function to produce a compromise
value as the output whereas others make a clear decision between the fuzzy values. For example an averaging
function might be good for determining foot placement to maintain balance but it could lead to problems if applied to
turning left or right at a T intersection.
The fuzzy logic nodes in Massive represent a fuzzy logic network, which comprises an agent's brain. For an
introduction to fuzzy logic see An Introduction To Fuzzy Logic or read a good book on the subject*.
To create a fuzzy logic network the user edits a connected graph of icons which represent various nodes in the
network (see Node Window).
Input data is accessed via input nodes.
Fuzzy input values are defined in fuzz nodes.
Rules are represented by the connections made with AND nodes and OR nodes.
Fuzzy output values are set in defuzz nodes.
Outputs are resolved and assigned in output nodes.
The timer node and noise node are really special purpose input nodes.
Every icon has an activity bar which indicates the output value for the node. Positive values are displayed in red and
negative values in blue.
Below is a simple fuzzy network for controlling leaning into turns for an agent.
On the left are the input nodes which sample information from the agent's senses and internal states. These are
connected to the fuzz nodes where the fuzzy speed values fast and slow and fuzzy turn values left, straight and
right are defined. These are then combined in rules which infer the following:
if fast and left then lean left
if slow or straight then upright
if right and fast then lean right
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/massive_fuzzy.html (1 of 2) [13/05/2007 01:37:09]
The fuzzy output values are defined in the three defuzz nodes on the right (lean left, upright, lean right) and they are
defuzzified and applied to the agent in the output node named rz.
A good way of building fuzzy logic is to make rules that represent sensible statements in English such as the ones
above. Then it's easy to follow what a brain is doing and it also makes it easier to spot mistakes.
It is not necessary to connect the icons in the order above. AND nodes can be connected to other AND nodes.
Almost any order of connection can be made, but loops are not recommended. For instance an input node can be
connected directly to an AND, and a fuzz node can be connected to an output. Also output nodes can be used as
input nodes to fuzz nodes, thus allowing layers of fuzzy logic to be represented in the directed graph.
___________
* Fuzzy Logic & NeuroFuzzy Applications Explained ISBN 0-13-368465-2.
Installing Massive
INSTALLING MASSIVE
Installation
NOTE: Massive is only tested and supported on Redhat versions 7.3 and 9.
Make a directory called /usr/local/massive.
Download the three archive files from the download page into /usr/local/massive: http://www.massivesoftware.com/
distrib/download.html
Cd into /usr/local/massive and extract the files:
tar -xvzf v1.2.3.tgz (or the name of the version you have downloaded)
tar -xvzf manual.tgz
tar -xvzf demo.tgz
Please note that once you choose the machine that will serve the license, you will not be able to serve the license
from another machine until the term of the key is up. If you think you might need to change license server machines,
feel free to designate a shorter term for the key and we can then re-up it later for the new machine.
On the host to be the license server, cd into the bin directory and run this command:
./mhost -id
Then email the line that appears in the console to key@massivesoftware.com .
Note to our customer's systems engineers:
Please use key@massivesoftware.com to submit any systems related support requests. Put these lines in the file .
cshrc in your home directory if using a csh or tcsh shell:
setenv MSERVER servername
setenv MASSIVE_HOME /usr/local/massive
setenv RMAN_SHADER_PATH shaderpath
set path = ($path /usr/local/massive/bin)
or these lines if using a bash shell:
export MSERVER=servername
export RMAN_SHADER_PATH=shaderpath
export MASSIVE_HOME=/usr/local/massive
PATH=$PATH:/usr/local/massive/bin
where servername is the name of the machine that mhost is running on and shaderpath is a path in which to find .sl
Installing Massive
Troubleshooting
Mouse clicks have no effect.
If mouse events seem to have no effect in Massive it's likely to be due to a Sawfish shortcut. The default window
manager settings for Gnome remap mouse clicks so it may be necessary to edit the shortcuts in the Sawfish window
manager. Remove any shortcuts in Global and Window that have "Left" "Middle" or "Right" as the Key.
Font not found
Some installations of X contain different fonts. Sometimes this will cause Massive to be unable to find a font. The .
Xdefaults file in the user's home directory can be used to specify the fonts that Massive will load. These lines in ~/.
Xdefaults will specify the default fonts:
Massive*menu.font:
Massive*font:
Massive*smallFont:
Massive*fixedFont:
Massive*textportFont:
-adobe-helvetica-bold-o-normal-*-14-*-*-*-*-*-iso8859-*
-adobe-helvetica-bold-r-normal-*-12-*-*-*-*-*-iso8859-*
-adobe-helvetica-medium-r-normal-*-8-*-*-*-*-*-iso8859-*
-*-fixed-bold-r-normal-*-18-*-*-*-*-*-iso8859-*
-*-clean-bold-r-normal-*-16-*-*-*-*-*-*-*
view window
VIEW WINDOW
orbit
middle mouse
scroll
right mouse
dolly in/out
zoom
extreme scroll
camera follow
ik end effectors
sticks mode
s shaded
S shadows
V view all
view window
@ sound emission
The simulation time is displayed in the lower right corner. If the simulation is running in real time (default 24 fps) then
the time will be displayed in white, otherwise it is displayed in red.
Picking
The current agent and segment can be selected by shift-left-clicking in the view window. Picking is context sensitive
so for instance when the place tool is active generators become the selectable items instead of agents and segments.
Lassoo selections are made by shift-left-dragging to draw a lassoo selection area. Lassoo drawing happpens when
the drag starts away from any selectable item. Lassoo selection currently only works for agents, locators and springs.
Dragging selectable items is acheived with a shift-left-drag when the mouse is over an item. Dragging works for flow
fields, generators, locators and springs.
To add to a selection use shift-middle-click or shift-middle-drag.
To subtract from a selection use alt-shift-middle-click or alt-shift-middle-drag.
As with camera controls, the current functions of the mouse buttons are shown as a message in the lower left corner
of the icon window.
Pose Mode
Pose Mode can be used to create specific poses by moving selected segments in the View Window. This is
especially useful for editing an agent's bind pose. See Segment - Pose
1. press Tab to switch View Window to Pose Mode
2. select a segment
3. alt-drag to rotate selected segment
ctrl-drag to translate selected segment
Node Window
NODE WINDOW
Node Window
The main menu is at the top of the icons window. Most of the dialog boxes are called from this menu. The sub menus
are:
File | Edit | Run | View | Camera | Fuzzy | Terrain | Options
FILE MENU
Save setup
Invokes a dialog box for saving the current setup. The setup includes display options,
sequencer lists, groups, placement and any other data that is not saved in CDL files.
Save agent
Invokes a dialog box for saving a CDL of the current agent. Note that if the current
agent is an instanced agent then the original agent from which the current agent was
instanced is saved. Any changes made to an instanced agent's body are not saved.
Save ASF
Invokes a dialog box for saving an acclaim format skeleton file. Dummy bones are
added where required.
Load setup
Invokes a dialog box for loading an agent. There are three ways the setup can be
loaded:
replace current setup - deletes the existing setup and load the new one.
merge with current setup - combines the existing setup with the new one.
child of current setup - loads the new setup as a child of the current setup. The new
setup is then available in the place tool so that multiple instances of the setup can be
created.
Load agent
Invokes a dialog box for loading an agent. A new placement group is created for the
resultant agent.
New agent
Invokes a dialog box for loading a Maya ascii light, camera, skeleton, or motion. (See
Maya integration.)
Saves an ascii file that contains the skinning data for all of the segments of the current
agent.
Saves an ascii file that contains the skinning data for the selected segments of the
current agent.
Load actions
Loads an action file (.amc, .act or .actb) and adds it to the list of actions for the current
object. Multiple files can be selected with shift-drag or shift-click.
Save actions
Invokes a dialog box for saving all actions for the current object.
load tree
Loads a motion tree which is then editable in the motion page of the icon window.
save tree
Load terrain
Invokes a dialog box for loading a Tiff or an SGI rgb image as a terrain map. SGI
format is not currently supported under Linux.
Invokes a dialog box for saving the terrain map as a Tiff or an SGI rgb image. SGI
format is not currently supported under Linux.
load callsheet
Invokes a dialog box for loading a callsheet. This will result in the creation of locators
for each entry of the callsheet.
save callsheet
Exit
EDIT MENU
Action
Dynamics
Flow field
Locator
Paint
Place
Symetric
Vision
delete instances
Removes all instanced agents from the scene and makes the template
agents visible again. ctrl-d has the same effect.
RUN MENU
Go
record action
Reset
Resets all objects to rest positions and all timers to zero [alt-r]
Sequencer
Sim
VIEW MENU
agent axes
agent names
all
axes
backfaces
blocky
cameras
clipping
dynamics
flow field
grid
lights
locators
motion blur
playbacks
RBD axes
segment names
shaded
smooth
sound emission
sound reception
sprites
sticks
standins
time
vision
wind
CAMERA MENU
Crop filmback
Toggles clipping of filmback against the view window. Default is for filmback to be
entirely visible within view window
display filmback
display masks
heads up
Resolution
Save
Invokes a dialog to save the current camera as a single frame camera file. Autodetects plod and Weta (.wcam) camera formats
Shadows
render
FUZZY MENU
Find
Add comment
Upon the next mouse click a new comment node will be made.
Connected
Edit selected
fuzz background
Graph selected
Links
Swap and/or
Transform
TERRAIN MENU
alpha channel
display
flip normals
lines
normals
shade
texture map
texture move
visible to agents
RenderMan shader
RenderMan
displacement
OPTIONS MENU
Bones window
View port
UV window
Toggles display of the UV window. This window displays the UV space geometry over
the texture map for the selected geometry node
Grid size
Handle size
Light size
List playbacks
Invokes a dialog that displays all active action playbacks for the current agent.
List variables
Toggles printing of all variables for the current agent to stdout. Primarily useful for
debugging a brain but could be used to pipe output from a brain to another program.
Material links
Toggles display of links in body page of icon window between material nodes and
geometry nodes.
Render
Time Warp
Units
Image compression
Invokes a dialog to set compression level of JPEG files output through the Sim dialog.
Scene Page
SCENE PAGE
The scene page is used to edit the lights, cameras, and groups in the scene.
Agents can also be edited by selecting their node in the scene page or by clicking on empty space in the body page
while the agent is selected.
Scene Page
Light Node
LIGHT NODE
A Massive scene has 4 lights by default, a key light, a sky light, a bounce light, and an ambient light, each represented
with a light node. Lights can be added, selected, deleted, and modified in the scene page.
To see the lights in the scene, select View->Lights from the Main Menu.
Lights can be imported from Maya as .ma files (see Maya Integration for details).
LIGHT ATTRIBUTES
r/g/b
intensity
x, y, and z rotation
x, y, and z translation
Light Node
constraint types
off
look at
light does not translate but rotates in place to keep target agent in center of view
agent
segment
pov
follow XZ
follow 3D
other attributes
agent
Light GL Tab
light types
ambient
directional
point
spot
Light Node
shadows
turns on/off shadows in OpenGL view. Only one light can be the shadow-casting light
in the OpenGL view. If no lights have "shadow" toggled on, and View->shadows is on,
Massive will generate default shadows in a direction of (1,-1,1).
znear
zfar
shadow height
spotlight options
spot angle
spot exponent
shader
when off, light is assigned a default shader by Massive. When on, a custom shader
can be assigned to the light through a shader dialog box or by manually typing the
shader information into the text box.
appears if "shader" button is toggled on - clicking this button opens a shader dialog
box containing shaders and parameters
- | shadow map |
raytraced
shadow type, either - (none), shadow map, or raytraced. Text field contains name of
shadow map file to create. Extension will automatically be changed when writing ribs
to be suitable for the specific renderer.
resolution
Camera Node
CAMERA NODE
A Massive scene has 4 cameras by default, each represented with a camera node. Cameras can be selected and
modified in the scene page.
The View window will show the view from the currently selected camera. To make the cameras themselves visible,
select View->Cameras from the Main Menu.
Cameras can be imported from Maya as .ma files (see Maya Integration for details), either animated or nonanimated. Massive saves animated camera data as a .cam file.
CAMERA ATTRIBUTES
x, y, and z rotation
x, y, and z translation
Camera Node
constraint types
off
look at
camera does not translate but rotates in place to keep target agent in center of view
agent
segment
pov
follow XZ
follow 3D
other attributes
agent
smooth
delay on camera following, for smoother movement. can be toggled on/off, and amount
of smoothness can be adjusted.
fov
specifies pixel aspect ratio seen in View window and used for rendering
filmback
35 mm
zmin
zmax
Camera Node
file
offset
file
agent node
Agents can be selected for editing while in the body page by clicking on empty space in the node window, or by
selecting the agent node in the scene page. Agents can be deleted from a scene by selecting their node in the scene
page and deleting it.
AGENT
process: brain
process: replay
process: remote
colour
Specifies colour of agents skeleton. Colours are able to be seen (become input data) using
agent vision. In Massive colours are assigned a value between 0 & 1
view geometry
AGENT TABS
The following tabs are available when an agent is selected:
rest
bind
dynamics
standin
vision
vary
variables
DSO
ODE
agent node
x y z rotation
specify the rotations of the entire agent with respect to World Space
x y z translation
specify the translations of the entire agent with respect to World Space
bind pose
saves the bind pose. This does not save the current pose
drag
specifies the amount of force exerted on the agent as they move through the atmosphere.
This depends on the size, shape and motion of the segments and on the movement of the
wind
gravity
agent node
steps
Collision
Whenever a collision is detected between a segment and something else forces are applied to prevent
interpenetration of the colliding objects. see collisions
force
specifies a constant used to determine how much force to apply perpendicular to the collision
surface to prevent interpenetratrion
damper
damper reduces the relative velocity of the colliding objects effectively making the collisions
less bouncy
friction
specifies the amount of force applied parallel to the collision surface opposing the relative
velocity of the colliding objects
Rotation Limits
Rotations can be constrained to stay within the segment rotation limits. Constraint forces are applied to each
rotational degree of freedom for any segments that have a non-zero rotation spring constant.
force
specifies the amount of force applied to constrain objects moving beyond particular rotational
limits
friction
specifies a force opposing rotation of the segments effectively making joints stiffer
field of view
resolution
render slices
specifies the number of separately rendered subimages to reduce the wide angle distortion of
the image
z factor
determines how the infinite set of z values (distance from agent in z) are mapped into the
fuzzy values between 0 & 1 according to an exponential function of the variable z factor as
follows:
z = exp(-z factor*distance)
This maps distant pixels to 0 and close pixels to 1 as if distance was related to intensity of a
depth image
agent node
Assigns agent variables to scale, thickness and translation parameters of the agent.
scale
thick
translate
add button
delete button
variables list
variable specifics
name text field
default
range
expr
agent node
value
file name
add
delete
plug-in list
lists plugins
These parameters apply when ODE is selected as the dynamics solver for the scene.
cfm
Constraint force mixing. "Softens" constraints set by erp setting. A cfm of 0 indicates a hard
constraint while increasing positive values indicate softer constraints. Suggested values are
small positive values in the order of 0.0001. Use this in conjunction with erp parameter to
adjust for stability.
ODE ff
Adjusting this value can help decrease joint popping by scaling down the force used to move
joints away from a stop. Recommended values are between 0 and 1, but any positive value is
possible as well.
erp
Error reduction parameter. Specifies what proportion of a joint constraint violation ODE will
attempt to fix in the next step. Ranges from 0 to 1. Values too large result in instability while
values too small result in joints drifting apart. Recommended range is 0.1 to 0.8.
Group Node
GROUP NODE
Every time an agent is loaded into the scene, a group is created for it. This is depicted in the scene page by an agent
node and group node with one connection between them. If the same agent file (.cdl) is loaded into the scene multiple
times, each time a new agent node will be created and assigned to a new group.
Groups come into effect during placement of agents. See the Placement page for more details.
GROUP ATTRIBUTES
colour buttons
file
locator scale
select locators
Group Node
add
delete
variables list
variable specifics
name text field
default
range
expr
body page
BODY PAGE
The body page is used to edit the physical characteristics of an agent such as its segments, springs, geometry,
cloth, materials, options and variation.
The layout is similar to the brain page with the central node work area, the new node bar at the left, and the node
edit area at the bottom of the window.
are made by dragging one of the icons in the icon box onto the work area. If a node is already
selected then the new node will be attached to the selected node where appropriate.
body page
Select nodes
by left clicking on them or box select with the left mouse. To unselect all nodes click on the
work area background. This makes agent parameters appear in the editor area.
Add to a selection
Lock a selection
by clicking on the grey rectangle to the right of an icon in the icon box. This locks the current
selection for the particular type of node. This is useful when selecting various segments for
Bones skinning editing whilst maintaining the geometry selection.
Move
Delete
Connect
nodes by holding down the ctrl key while selecting first the from node then the to node. For
hierarchies of segments the to node is the parent. Reparenting a connected segment keeps
the segment in the same world space location. To prevent this from happening disconnect the
segment from it's parent first.
Disconnect
nodes by holding down ctrl alt while clicking the nodes to disconnect. Segments cannot be
disconnected. Segments can be deleted or reconnected to a new parent.
Frame selected nodes Use ctrl-s to view and center selected nodes
BODY NODES
Sphere
Tube
Disc
Box
Spheres, tubes, discs, and boxes are all types of segments which form the agent's skeleton.
Spring
Springs connect between segments. They affect an agent's rigid body dynamics.
Cloth
Cloth is a dynamic primitive for fast cloth simulation.
Geometry
Geometry is read from files and can be attached to segments either rigidly or with Bones skinning.
Option
Option nodes switch or between attached geometry or cloth nodes.
body page
Material
Materials can be attached to geometry. They are used to control how the geometry will look in both hardware and
software renders.
segment node
SEGMENTS
Segments are similar to bones or links in other animation systems except that they are solid primitives and they do not
need to be connected end to end.
Skeletons can be created in Massive or imported from Maya as a Maya ascii file. Skeletons imported from Maya do
not contain any 3D shape information, so Massive fills in the information with a best guess estimate. Segments usually
need some adjustment after initial import from Maya.
Not all combinations of segment-to-segment collisions are currently supported. Also, boxes will collide with the ground
plane but not with a terrain model.
SEGMENT ATTRIBUTES
segment icon
represents segment primitive type which can be sphere, tube, disc or box
Clicking on this icon cycles through the primitive types
colour
segments can be assigned their own colour if the inherit button is off.
Otherwise they inherit the colour of the agent. See colour.
Sphere
radius
translation in x y z
segment node
length
radius
axis
rotation in x y z
translation in x y z
Box
x y z dimensions
translation in x y z
x y z rotations
specify the rotations of the segment with respect to it's parent in the rest pose
segment node
x y z translations
specify the translations of the segment with respect to it's parent in the rest pose
enable
order
Specifies the order in which transformations are applied (read from left to right)
the arrows are used to swap dof's with their neighbours
limits
min
max
i.k.
Specifies the type of I.K. applied to the segment see Inverse Kinematics
normal
Selects the I.K. solver that rotates 2 segments to move the goal segment towards the goal location.
This is useful for limb I.K.
single
Selects the I.K. solver that rotates one segment to move the goal segment towards the goal location.
This is similar to a lookat constraint.
skip
When set, the solver skips this segment and uses the next segment up the hierarchy in determining
the segments for which to solve. For example, if r_toes is used as the I.K. end effector then r_foot
should have skip on set so that the solver applies rotations to r_low_leg and r_up_leg.
segment node
x y z rotations
x y z translations
drag
specifies the amount of force exerted on the segment as it moves through the atmosphere. This
depends on the size shape and motion of the segment and on the movement of the wind.
density
specifies the density of the segment. Changing the density causes changes in mass
mass
specifies the mass of the segment. Changing the mass causes changes in density
Collisions
Whenever a collision is detected between the segment and something else forces are applied to prevent
interpenetration of the colliding objects. See collisions.
These can be inherited from the agent (toggle inherit on) or set for individual segments.
force
specifies a constant used to determine how much force to apply perpendicular to the collision
surface to prevent interpenetration of the segment
damper
damper reduces the relative velocity of the colliding objects effectively making the collisions involving
the segment less bouncy
friction
specifies the amount of force applied parallel to the collision surface opposing the relative velocity of
the colliding objects
Rotation Limits
Rotations can be constrained to stay within the segment rotation limits. Constraint forces are applied to each
segment node
rotational degree of freedom if the segment has a non-zero rotation spring constant.
force
specifies the amount of force applied to constrain objects moving beyond particular rotational limits
friction
specifies a force opposing rotation of the segments effectively making joints stiffer
lock
Volume of Influence
Each segment has an inner and an outer ellipsoid representing the segments influence on the geometry.
Adjustments to the ellipsoids can be made by dragging the ellipsoids in the Bones Window or adjusting the
parameters in the Bones Tab for the segment.
scale bar
scales the size of the outer limit of the bones volume of influence in x y & z simultaneously
x y z scale
scales the inner limit of the bones area of influence individually in x y & z
x y z rotations
x y z translations
delete
initialize
segment node
scale
thick
spring node
SPRINGS
Springs, based on Hookes Law springs, can be connected between segments of an agent. At least one of the
connected segments must have dynamics active for a spring to have any effect.
The spring force is a restoring force, i.e. the force is applied to return the spring to its original rest length.
The stiffness of the spring is controlled by the spring constant. The appropriate value could be anywhere from around
1 to tens of thousands. It's best to start with something like 100 and experiment.
Damper reduces the rate of change of the length of the spring, effectively making the spring less bouncy. Zero is
maximum bouncyness. A good starting point is about 10% of the spring constant.
Collisions can occur between a spring and one or more segments, but not between springs. By default collisions is
switched on for a spring.
There are 5 types of springs in Massive:
normal
This is a standard Hooke's law spring. It resists any change to it's rest length.
stretch
squash
pin
This is a constraint rather than a spring. This constraint tries to keep both ends together. Any number
of these can be attached to a segment.
attach
This is also a constraint rather than a spring. This constraint can be used to attach a dynamics
segment to it's non-dynamics parent. The reason for this seemingly nonsensicle constraint is that a
segment with dynamics active moves independently of it's parent if the parent does not have
dynamics active.
SPRING ATTRIBUTES
name text field
spring node
spring
damper
specifies the ratio used to scale the target length of the spring relative to the original rest
length. The default length of the spring is determined from the rest pose. Typical values
would be between 0.1 and 2.0, with 1.0 having no effect.
collision radius
specifies the thickness of the spring for the purpose of collisions with segments
Pin
Pin springs only have a translate parameter. This specifies the maximum force to be used to keep the ends of the
spring together.
Any number of these can be attached to a segment.
translate force
specifies the amount of force applied to keep the attachment point of segment A
coincident with the attachment point of segment B. Typical values are between 1000 and
10000.
Parent
Parent Springs attempt to keep the attached segment at it's rest position in relation to it's parent. When applying rigid
body dynamics to a segment rather than the entire agent the segment is effectively disconnected from its parent (see
dynamics). A segment cannot have more than one Parent constraint.
translation force
specifies the amount of force applied to maintain the segments location relative to the
parent. Typical values are between 1000 and 10000.
x y z rotation force
specifies the amount of force applied to maintain the segments orientation relative to the
parent
friction
specifies the amount of force applied to resist change in the orientation of the parent
Attaching Springs
x y z co-ordinates
specify the location of the attachment points of the spring to the segment in segment
space.
SELECTING SPRINGS
The current functions of the mouse buttons are displayed as a message in the lower left corner of the main window.
Springs can be selected by shift-left clicking on a spring in the view window or by clicking on it in the icon window. To
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/spring_node.html (2 of 3) [13/05/2007 01:37:44]
spring node
pick or drag springs in the view window the icon window must be in the body page and a spring must be currently
selected.
To add to a selection use shift-middle click and to subtract from a selection use alt-shift-middle click.
In the view window a lassoo selection can be made by shift-dragging from somewhere away from any springs and
dragging around the springs to be selected. It is not necessary to draw a completely closed shape.
Lassoo selection can also be used to add to or subtract from the selection with the shift-middle mouse and alt-shiftmiddle mouse combinations. Any changes made to the current spring are applied to all selected springs.
To alter a spring's attachments shift drag the ends of the spring in the view window. The ends of the spring will always
move along the surface of the segment under the mouse. Spring ends can be dragged across empty space between
segments.
cloth node
CLOTH
Cloth geometry can be read from a Wavefront .obj file, or specified as a rectangular triangle mesh. It can be attached
to segments with bones skinning. Any parts of the cloth that are not attached to segments become dynamic.
CLOTH ATTRIBUTES
grid
x y resolution
x y size
file
cloth node
x y z rotation
x y z translation
x y z scale
Stretch Resistance
force
Collision
force
thickness
specifies the thickness of the cloth for the purpose of collisions with other objects
terrain
skeleton
toggle on for cloth to collide with the any skeletons in the scene
geometry
toggle on for cloth to collide with the agent's polygonal geometry not currently supported
Steps
steps
drag
specifies the amount of force exerted on the cloth as it moves through space
GEOMETRY
Geometry is polygonal geometry read from Wavefront .obj files. It can be attached to segments either rigidly or with
bones skinning.
Massive does not save the geometry with the agent. The agent cdl file just contains a link to the .obj file.
Multiple geometry nodes can be connected to an option node to facilitate switching of geometry for agent variation.
There is some support for subdivision surfaces. They are displayed as a polygonal control hull except in RenderMan
renders (currently broken).
ATTACHING GEOMETRY
To rigidly attach geometry to a segment attach the geometry node to one segment node.
To skin geometry to all segments attach the geometry node to no segments.
To skin geometry to selected segments attach the geometry node to the required segments.
Geometry nodes that are connected to option nodes use the option node's connections to segments to determine
attachment.
file
smooth
flip normals
Geometry - rest
Specifies the initial transformation of the Geometry.
Rigidly attached geometry is transformed relative to the segment it is attached to.
Skinned geometry is transformed relative to world space.
Any number or transforms can be added to a geometry node. Each one can be a scale, a rotate or a translate
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/geometry_node.html (1 of 3) [13/05/2007 01:37:49]
transform. The order of transforms can be edited with the arrows in the transform list. The order of rotation for a
rotate transform can be selected from an option menu.
Each of the three components of a transform can be controlled by agent variables.
add
delete
transformation
xyz
world space
This button is used to attach the geometry to a segment while maintaining the world
space location and orientation of the geometry.
Rotate and translate transforms are automatically generated.
This is useful when attaching geometry that was modelled in world space in reference to
the skeleton.
Geometry - Blend
Allows addition of blend shapes to a geometry node.
Blend shape targets must be an .obj mesh with the same number of vertices in the same numbered vertex order as
the original geometry.
One geometry node can have multiple blend shape targets, which can be activated separately or in combination.
Blend shapes can be activated in the brain by creating an output node with the channel [name of geo node]:[name of
blend shape], such as face:smile.
add
delete
name
type
type of blend - with linear, the vertices take a linear path between targets, while with
radial, vertices take a radial path about the centre specified by centre.
file
centre
active
Geometry - Weights
The weights tab allows a weight file of Massive vertex weight format (.w) to be imported or exported. Vertex weights
can be imported from any outside program (such as Maya) if a script is made to write them out from that program in
Massive's weight format. For more information on a Massive weight file, see the appendix on Massive weight files.
Save weights allows you to save the current weighting scheme to a .w file.
File allows you to choose a weight file to import.
option node
OPTION NODE
The Option node allows a choice of geometry to be used according to a specified variable by switching or blending
between different geometry. It works with geometry and cloth nodes.
If the attached geometry has the same number of points and polygons and the option value is non-integer then a
blend occurs (not currently implemented). Options are attached to segments in the same way that geometry is
attached to segments. Geometry that is connected to an option is connected to segments via the option node rather
than directly.
manual
used to allow direct control of the option node by overriding the variable with the slider
variable
inputs list
option node
material node
MATERIAL NODE
Material nodes are for assigning shaders & textures to connected geometry nodes. They control the appearance of
geometry and cloth in OpenGL renders and RenderMan renders.
The ambient, diffuse, specular & environment parameters affect the OpenGL shading. Set specific values for hue,
saturation and value or use the variable pop-up lists to assign agent variables to affect hue, saturation & value.
Texture maps and environment maps can be referenced using the file browsers under the diffuse tab and environment
tab. Environment mapping is not currently implemented.
MATERIAL ATTRIBUTES
nametext field
colour swatch
variables
material node
colour swatch
variables
texture map
rbga buttons
colour swatch
variables
material node
surface
displacement
shadow surf
shadow displ
displacement bounds
matte object
Shader parameters can be selected and edited through the menu or by typing them manually in the text box at the
top.
References to texture map files can be made through the browse dialog or by typing in the path and filename
manually. These can be relative or absolute path names. Massive recognizes texture map files by the .tif, .tiff, or .tex
extensions and will be able to interpret them as relative paths.
material node
Shader parameters with numeric values can be set in the dialog or assigned an agent variable. Above, assigning the
variable "rough" to the shader parameter "roughness" allows different instances of this agent to be rendered with
varying degrees of roughness.
Additionally, agent variables can be used in filenames and should be enclosed in single quotes. For example, if
shirtMap is an agent variable with a range of 1 to 4:
shirt'shirtMap'.tif
would result in instanced agents with four varying shirt textures ranging from shirt1.tif to shirt4.tif.
Brain Page
BRAIN PAGE
The brain page is used for editing an agent's brain. The brain for the current agent (the agent whose name appears at
the top of the window) is displayed.
If the current agent is an instance agent then editing actually modifies the template agent that the current agent is
made from. All instances of this template agent are also modified.
connect nodes
disconnect nodes
select a node
left-click
left-drag in the icon window over the area to box select icons
Brain Page
add to a selection
shift-left-click
[delete] key
alt-C
paste nodes
alt-V
zoom
right-drag
scroll
ctrl-a
ctrl-s
Notes:
To cycle through the agents hit alt-O and shift-alt-O to cycle back. While the view window is in wireframe mode
the currently selected object will be displayed more brightly.
Alt-connections appear in black and represent a fuzzy logic NOT when appearing as an input to an AND or OR
node. When connected to other nodes, they may have specialized functions.
Macros
Macros are a way of organizing a complex brain by grouping associated nodes together into modules. To create a
macro, select the group of nodes you wish to make into a macro and hit alt-g.
Below is a list of macro-related commands.
enter a macro node
[enter] key
exit a macro
[backspace] key
alt-G
expand a macro
shift-alt-G
externalize a node
alt-X
Externalizing a node means to make a node inside a macro node accessible for connection on the macro node 's
icon. Alt-X toggles this property on and off. External nodes appear lighter than other nodes when inside the macro
node.
The layout of external nodes on the macro depends on the layout type chosen in the menu as well as their relative
position within the macro. When Fuzzy -> macro column layout is selected in the main menu, each external node
will appear on either the right or left side of the macro, depending on which side they are closer to within the macro.
When the option is unselected, Massive will arrange the nodes around the edge of the macro, depending on their
relative position within the macro.
Brain Page
This is the column of icons down the left side of the icons
window. To create a new brain node, drag one out of
the `new node bar' onto the node work area. The new
node can be edited and connected with the rest of the
network.
input node
INPUT NODE
An input node gets a floating point value from the simulation. If the source string is empty then the slider on the left
can be used to set the current value. The source string can contain expressions, references to channels and
references to variables.
eg:
head:ry
time
head:ry + neck:ry
The name of the input node can be any string. It is set by default to whatever channel is entered into the source field,
but can be changed at any time.
The pos/speed buttons select whether the actual value or the current rate of change of the value is returned. This
only works for certain channels at the moment.
The range fields are user editable and determine the minimum and maximum values for the slider bar and the input
range of any attached fuzz nodes.
input node
timer node
TIMER NODE
Timer nodes can be thought of as a special kind of input. They provide a value that varies over time. Fuzz nodes can
be attached to provide fuzzy time values. For example such a fuzz node could be used in a walk cycle where `raise
left' is a fuzzy time value.
Timers start their cycle if the input to the timer is greater than 0.5, or if it has no input. Once started the timer will
increase its output value at every increment by the rate amount until it reaches the range value. The range value
defaults to 1.0 but can be set to any positive number.
The endless button is used to prevent the timer from wrapping at the range value.
Timers have two trigger modes: `if stopped' and `always'. `if stopped' means that the timer will only restart if it has
finished its cycle. This is good for cyclic events such as walk cycles. `always' means that the timer is constantly at the
start while the input is greater than the threshold. Then when the input drops below the threshold the timer will
continue its cycle. This is good for creating a delay signal. For example delay signals might be used to determine if a
left or a right turn was taken recently.
The rate of the timer can be set by dragging the rate slider. If the timer has an alt input (see node window) then the
rate is controlled by the output value of the connected node and dragging the slider will have no effect. Rate values
are in units per second, so timers are reasonably invariant under different frame rates.
timer node
noise node
NOISE NODE
Noise nodes are another special kind of input node. They provide a unique pseudo random value that is usually
between 0 and 1 and is centered on 0.5. The output value of a noise node can vary monotonicaly over time. The rate
slider controls the frequency of the variation.
The manual button is used to make the output value directly editable by the user.
The rate value can be controlled by an input to the node.
noise node
fuzz node
FUZZ NODE
The fuzz nodes convert input values into fuzzy values. A membership function is applied to the input value to
determine the output value of the fuzz node. The range of input values is set in the input node.
The four standard membership functions are available as well as a singleton function. These are selected from the
buttons in the lower right of the edit area.
The graph on the right of the edit area displays the membership function in red. Other membership functions for the
same input are displayed in a darker red. If graph selected is on then all other selected fuzz nodes will be display in
dark red instead of those sharing the same input.
Drag the control points to edit a membership function. The x value of the currently edited point is displayed in the
number field in the lower right. Use the middle mouse button to drag an entire membership function. The right and left
arrow keys select the point to edit. The up and down arrow keys switch to other fuzz nodes with the same input.
A blue line represents the current input value and the current output value is displayed in the slider bar and it's number
field.
The "linear" button selects linear membership functions. The default is cosine or smooth membership functions.
The "wrap" button causes the membership function to wrap beyond the input range. This is useful for input data that
wraps at the minimum and maximum range values.
An alt (black) input connection defines the x-value of one of the points on the fuzzy membership curve. Each
successive connection defines the subsequent point. A bell-curve (lambda) membership curve would need three
incoming alt connections to define all three of its points. This allows the user to dynamically define fuzzy membership
curves and is an alternative to statically placing the points, as is usual.
fuzz node
and node
AND NODE
The AND node implements fuzzy AND logic. AND and OR nodes are called rule nodes because are used to make
fuzzy rules. The degree to which the rule is true is determined from the combination of the node's inputs using either
the min or the prod function. The min function takes the minimum input value as the output value. The prod function
multiplies the inputs together to determine the output value.
The final output value is scaled by the weight. This allows the user to control the strength of the effect that the rule
has. Negative weights are allowable and can be used to create inhibitory controls.
Fuzzy NAND (negative AND) is also possible with the AND node. This is acheived by making an alt connection to the
node (see brain page for alt connections). Alt inputs are inverted (subtracted from 1) before being combined in the
rule, thereby implementing NAND. For example this could be used to create a rule that means:
and node
or node
OR NODE
The OR node implements fuzzy OR logic. AND and OR nodes are called rule nodes because they are used to make
fuzzy rules. The degree to which the rule is true is determined from the combination of the node's inputs using either
the max or the sum function. The max function takes the maximum input value as the output value. The sum function
adds the inputs together and limits the sum to 1 to determine the output value.
The final output value is scaled by the weight. This allows the user to control the strength of the effect that the rule
has. Negative weights are allowable and can be used to create inhibitory controls.
Fuzzy NOR (negative OR) is also possible with the OR node. This can be acheived by making an alt connection to
the node (see brain page for alt connections). Alt inputs are inverted (subtracted from 1) before being combined in
the rule, thereby implementing NOR. For example this could be used to create a rule that means:
or node
defuzz node
DEFUZZ NODE
Defuzz nodes usually connect between rule nodes and output nodes. The defuzz value (set by the user) is used by
the output node to determine the `crisp' output value (see fuzzy logic and output node).
The degree to which the defuzz value is being inferred is called the weight. This is displayed in the upper slider bar
and number field (not user editable).
The defuzzification method is set in the output node.
In fuzzy logic theory this type of defuzz value would be called a singleton value. Normally defuzz values could also
cover a range of real numbers, however this functionality is not currently available in Massive fuzzy logic.
Fuzzy else can be implemented by switching on the else button. The weight of an else defuzz node is automatically
set to 1 - max, where max is the maximum weight of any other defuzz attached to the same output node. This is
handy for default values (eg. hand position at side). Fuzzy else provides a way of under-specifying rules whilst
maintaining stability although it is not generally recommended in orthodox fuzzy logic theory.
An incoming alt (black) input into the defuzz node sets the defuzz value to the value of the input, overriding the one
specified by the user. The weight is still set by the normal incoming input.
defuzz node
output node
OUTPUT NODE
Output nodes are normally used to affect the agent by assigning a value to a channel. The channel is specified by the
channel string (see channels). Here are some examples of channels that are useful in output nodes:
head:ry
[head:ry]:offset
Offsets the values set by actions for the angle of the x rotation of the
segment named "head".
r_hand:ik.y
ry
[ry]:scale
Scales the values set by actions for the rate of ry for the agent.
walk
walk->sidestep
dynamics.active
Translation and rotation channels can be used for the agent or it's segments, ik channels only apply to segments.
Translations and rotations are different for agents and their segments. Segments use the value according to the pos/
speed buttons. Agents apply the values in object space (local to the agent) generating movement in much the same
way as logo turtle graphics. This means that agent channels are effectively rates of change which are applied relative
to the position at the previous frame.
The name of the output node can be any string. It is set by default to whatever channel is entered into the channel
field, but can be changed at any time.
The pos speed and accel buttons are used to determine how to apply the output value to the chosen channel.
pos - set the absolute value.
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/output_node.html (1 of 2) [13/05/2007 01:38:11]
output node
Outputs can also affect brain variables. The user can put any name into the channel string as long as the name does
not conflict with existing channel names. The value of this variable will then be available to be referenced in input
nodes.
The defuzzification method ("defuzz") is selected with the average and max buttons (see defuzz node). Average
results in the output node taking the weighted average of all the incoming defuzz nodes. Max only takes input from the
defuzz node with the highest activation value.
It is possible to connect an input directly into an output in which case the defuzz function has no effect.
Motion Page
MOTION PAGE
Overview
The Motion Page is used to design the motions of an agent in the form of one or more motion trees. This tree is part
of the agent and when triggered from the brain, causes the agent to transition from action to action in a logical and
easily controllable manner. The motion page also generates a motion capture session Take List from the motion tree.
For the majority of agents, only one motion tree is needed. However, some agents may run actions on separate
tracks, such as a horse-and-rider agent. Massive allows the user to create more than one tree per agent and assign
each tree to its own track.
To add a new tree, choose the track you wish to create the tree for (from the eight numbered track buttons on the
lower left side of the screen) and click the add button. To delete a tree, select the track you want to delete the tree
from and click the delete button.
To go between trees, click the numbered button corresponding to the track whose tree you want to view.
To turn off the tree, turn off the active trees button at the bottom.
The tree default action for the current tree is listed at the bottom of the motion page.
The tree default action can be assigned by selecting the action node you wish to make the default and clicking the
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/motion_page.html (1 of 9) [13/05/2007 01:38:19]
Motion Page
default button beside the name field. This is the action which the agent will run at the beginning of the simulation and
will continue to run if no other action is triggered.
The agent default actions buttons allow you to select certain actions and associate them with corresponding agent
variables. The default action for each instanced agent will be the action whose corresponding agent variable has the
highest value.
Default actions chosen this way will override the tree default action.
Motion trees are built from transition nodes and actions. These can both be selected from the node area on the left.
Transition Nodes
In the motion page the term node is used to refer to transition nodes.
A transition node is a pose where two actions meet. It is the start of one action and the end of another - the pose
where the agent transitions from one action to another.
colour swatches
entries
Actions
An action is the motion that takes the agent from one transition pose to another. It is an actual motion that will be
motion captured or keyframed and imported into Massive.
Actions with the same name are automatically numbered incrementally.
default
specifies comments regarding the action. These can be displayed in the action nodes in the
Work Area by toggling comments in the Tree menu. These will also appear in the action list
and take list.
dir
entries
highlighted letters indicate entries corresponding to the directions of the preceding actions
Motion Page
omit
triggers
modifiers
latch
blends
outputs
Activating Actions
In order to activate and control actions through the tree, actions need to be assigned varying combinations of triggers,
modifiers, latches, and blend activators.
Activating a trigger output node in the brain causes the motion tree to select one of the actions associated with that
trigger.
Activating a modifier output node further qualifies that selection.
Activating a latch output node qualifies the selection as well by specifying which latch of the previous action to
activate on, if the previous action has multiple latches.
Thus, the motion tree selects an action according to the particular combination of triggers, modifiers and latches.
Additionally, the motion tree can activate blend actions according to the degree that their associated blend activator
output nodes are set to.
Triggers
The Trigger Dialog Box from the Tree menu is used to define triggers.
Click add to add a new trigger and then type the name of the new trigger into the text field at the top of the window.
Click delete to delete the selected trigger.
These triggers can then be assigned to specific actions using the triggers pop-up list in the actions parameters.
Motion Page
Modifiers
The Modifiers Dialog Box from the Tree menu is used to define modifiers. It works exactly the same as the Trigger
Dialog Box.
These modifiers can then be assigned to specific actions using the modifiers pop-up list in the actions parameters.
Examples of modifiers could be such things as quickly, high, left.
Modifiers are used in conjunction with triggers to activate a greater variety of actions than the trigger alone. For
example, the trigger "block", activated at the same time as the modifier "high", would trigger an action such as
block_high, the same trigger with the modifier "middle" would trigger an action like block_middle, and changing the
modifier to "low" would trigger block_low.
Modifier names cannot contain spaces.
Latches
The Latches Dialog Box from the Tree menu is used to define latches. It is different from the other tree dialog boxes
in that in addition to defining a name for the new latch, you must also define a range in which the latch is active.
Motion Page
When a new latch is added, a graph will appear, displaying the latch curve of the currently selected action. Some
actions, such as "walk", may have multiple latch lows representing different phases of the action where it is possible to
exit the action and begin a new one.
You can define and label these regions in the Latches Dialog by adjusting the blue area to correspond to the phase of
the action to be associated with this latch. This area is adjusted by left-mouse-dragging either of the edges, or middlemouse-dragging the entire area.
Associating a latch, such as "rightfoot", with an action, such as "walk_to_standR", allows the user to specify that the
action is only to activate in the case that the previous action (walk) is in the "rightfoot" defined phase of the action.
Blends
The motion blending engine in Massive handles the transition of one action to another to produce an agent's motion.
It is also capable of blending an action over another action to alter the agent's motion.
The motion tree controls the activation of these 'blend' actions. The blends are represented in the motion tree as
actions which connect (one-way) to other actions rather than between transition nodes. To allow for high level control
of blends in the brain, blend activator names are assigned to the blend action nodes in much the same way as triggers
are assigned to action nodes.
Blend activator names are defined using the Blends Dialog Box from the Tree Menu, a dialog that works similarly to
the trigger and modifier dialog boxes. Blend names cannot contain spaces.
These blend activators can then be assigned to specific actions using the blends pop-up list in the actions parameters.
An example of a Blend would be 'up' for uphill motion. Uphill motion is often captured for the purpose of terrain
adaptation, whereby uphill and downhill actions are blended over 'on-the-flat' actions to varying degrees. In this case
there might be several such uphill actions such as walk_up to blend over walk and march_up to blend over march.
The blend name 'up' would be assigned to each of the uphill actions so that one output node can be used to control
all such blends.
Outputs
Output names are created in the same way as triggers, modifiers, and blend activators.
Motion Page
Outputs provide information to the agent's brain concerning which actions are active. For example, the actions "walk",
"run", and "march" might all be associated with a single output called "locomotion", which can indicate to the agent's
brain whether the agent is moving or not.
Outputs do not affect the decision made by the motion tree, but rather are used to indicate the current state of the
agent's actions to the rest of the brain.
To access a motion tree output in the brain, create an input node with the output name listed in the source box.
Output names should not contain spaces.
the direction specifies the overall inertia of an action, especially towards the end of the action
entry
Entries and directions are generally used to specify the momentum (or weight) of an agent coming into an action.
Depending on the different types of momentum coming into an action, there may need to be one or more variations of
that action to result in realistic transitions.
When the types of possible "weights" for each action are specified using entries and directions, the number of
variations of each action needed is calculated by Massive and listed in the take list or action list.
A quick example based on a swordfighting agent:
Suppose you have a "ready" pose. Connected to this ready pose are looped actions "ready", "lunge_forward", and
"dodge_right". (not the most efficient names, but just here for description's sake).
If you think about it, you may want to capture two "lunge_forward" actions, depending on the momentum of the action
that came before. For example, if the previous action was another "lunge_forward", this current "lunge_forward" would
have a certain forward momentum to begin with, whereas if the previous action was "dodge_right", this current
"lunge_forward" action would begin with a rightward momentum and require a subtle correction by the swordsman as
he goes into a forward lunge.
In this case, you would assign different directions to each action, such as "a" (forward) to "lunge_forward" and
"ready" and "b" (right) to "dodge_right". (This is done by toggling the associated letter under dir in the action's
parameters.) Upon doing so, you will notice that "lunge_forward" now has two incoming entries, "a" and "b", as do the
other two actions.
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/motion_page.html (6 of 9) [13/05/2007 01:38:19]
Motion Page
If you made a take list from this tree, it would consist of 6 actions to capture, two variants of each action with
incoming rightward or forward momentum.
Suppose you decided the action "ready" is really generic enough that it doesn't require different forward and rightward
variants. You could click on "b" next to "omit" in the "ready" action node, and now "ready" will come out as a single
action to capture in the take list. Omitting entries can greatly reduce the number of motions generated by the Take
List.
The Entry Dialog Box from the Tree Menu is used to assign directions to letters.
Enter the name of the direction to be associated with each letter in the text edit
box beside it.
The currently running action, as well as the next action selected for activation, appear with their names in red.
The arrow associated with the currently running action appears in yellow, and a moving yellow dot along the arrow
depicts the progress of the action.
Motion Page
Active blend actions appear highlighted in yellow. The intensity of the highlighting corresponds to the degree of
activation of the blend.
Take Lists
A Take List is a list of motion needed to be captured to realize the Motion Tree.
Motion Planner generates this list automatically by analysing the entries of actions and calculating all the variations of
motion needed for each Action.
The order of actions is optimized for efficiency of the capture session.
Save take list under the Tree Menu creates an ascii file including the action number (a unique identifier for each
action), action name, entry type, the 'from' transition pose, action comments and the 'to' transition pose.
The Take List also includes room for take information and comments to be noted during the capture session.
ACTION
ENTRY
FROM COMMENT TO
_________________________________________________________________________________
3 | march_lower_pike | static | march_raised || march_lowered |
--------------------------------------------------------------------------------Take:
Notes:
_________________________________________________________________________________
1 | march_raised
| static | march_raised | much variation | march_raised |
--------------------------------------------------------------------------------Take:
Notes:
_________________________________________________________________________________
Action Lists
An action list is a summarized version of the take list in numeric order.
Save Action List under the Tree Menu creates an ascii file list including the action number, action name, entry type,
Motion Page
Sequencer List
The sequencer list option under the Tree Menu will generate a random list for the sequencer based on the tree. For
more details, see the sequencer page.
Actions
ACTIONS
Motion capture and keyframe animation can be imported as actions. An action consists of any number of curves which
affect an agent's degrees of freedom. Actions are processed by the motion blending engine under the control of the an
agent's brain to provide smooth transitions, layered blends, and multiple independent tracks of motion. Actions can be
edited in the action editor .
TRIGGERING ACTIONS
Actions are triggered when an output node containing just the action name in it's channel string goes high (above .5).
eg:
walk
There are two special curves in an action that are used for controling the triggering and transitions of actions. The first
is the transition curve which determines the fading in of the triggered action and the fading out of the previous action.
A typical transition curve will start at 0 and reach 1 within about half a second and stay at 1 for the rest of the action
The second special curve is the latch curve which, when high, prevents the triggering of other actions. The latch curve
is therefore useful for specifying when it's ok to allow a transition to another action. A typical latch curve is 1 for most
of the action and 0 for a few frames about half a second from the end. For an agent that constantly tries to trigger the
most appropriate action for the current context, these curves are all that is required to ensure smooth and sensible
transitions between actions.
Setting a trigger value greater than 1 will override the action latch. In this way actions can be forced to occur
immediately.
When an action is triggered, the action data itself remains unaffected but a "playback" is started locally for the agent. It
is possible to have mutiple playbacks for any one action, so an action can transition into itself if required. To see all of
the playbacks for an agent, select the Playbacks item in the View menu.
There are 2 flags that also affect playback of actions; the "one shot" flag and the "no retrigger" flag.
If the one shot flag is set then the action will not loop when played. This should be on for non-cyclic actions to avoid
possible jumps in the motion while transitioning to another action.
If the no retrigger flag is set then only one playback of the action can be active for an agent at a time. This prevents an
action from transitioning to itself and from playing multiple times concurrently. This flag should be on for most cyclic
actions.
MODIFYING PLAYBACK
An output node containing action_name :rate will affect the playback rate of the action for the agent. Wildcards can
be used for action names. eg:
walk:rate
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/actions.html (1 of 3) [13/05/2007 01:38:21]
Actions
strike?:rate
*:rate
A value of 1 maintains the original rate and a value of .5 halves the playback rate.
The effect of actions on any particular degree of freedom can be scaled with this output node string: [channel ]:scale
and offset with this output node string: [channel ]:offset . The origin for scaling can be set with this output node
string: [channel]:origin.
eg:
[head:ry]:scale
[head:ry]:offset
[hand:ik.y]:origin
These are evaluated in this order: origin scale offset. So it's possible to scale a channel down to zero
and then apply an offset. In this way the effect of actions can be temporarily overriden for any particular
channels.
BLENDING
Blending is used to mix an action with another action that is already running. For example, an agent may
be walking in a relaxed gait (walk1) and a more aggressive walk cycle (walk2) can be blended to varying
degrees on top of the relaxed walk. Two output nodes would be required to acheive this, containing the
following channel strings:
walk1
walk1 -> walk2 By setting the first output node's output value to 1 the action walk1 is
triggered, and the second output blends walk2 with walk1. When the second output node's
value is 0.5 the motion will be halfway between the two actions, and at 1.0 the motion will
be identical to walk2. When blending, the second action is slaved to the first action so that
they are in sync with each other. Also the rate of the first action is interpolated between
the rates of the two actions. So as the blend value approaches 1.0 the resultant playback
rate approaches that of the second action.
Multiple actions can be blended on top of an action. Rather than averaging the actions,
the blending engine combines the differences between each blend and the base action. In
this way both an uphill walk and a sideways walk could be blended over a base walk
action whilst retaining the full effect of both blended actions.
TRACKS
Each action can be assigned to any one of 8 tracks. By default each action operates on
track 1. By using tracks actions can operate independently of other actions on the same
agent. For example, a horse-and-rider agent (a single skeleton in Massive), could have
horse actions, such as gallop, on track 1 and rider actions, such as sit, draw_bow, or
shoot_arrow, on track 2.
An action should be assigned a track using the control at the top of the action editor.
It should also appear in the proper tree in the motion page - the tree associated with its
track.
When using multiple tracks, keep in mind that each track should control a certain subset
of segments and it is best that these not overlap with another track's segments. So, for
example, all the horse segments in the skeleton (including the root segment) would be
controlled by track 1 actions. The action "gallop" would contain curves for all the segments
in the horse portion of the skeleton, and should not contain any curves for the rider
portion. If any exist, they should be deleted.
Actions on track 2, or the rider's track in this case, should control only rider-related
segments. This means that they will not contain root curves, as those belong to the horse.
Actions
FEEDBACK
The following channel strings can be used in input nodes to get information about the
currently active actions:
action
action:rate
action:running
action:phase
phase
phase2
latch
Note that action can contain wildcard characters. Below are some examples of input node
strings:
walk
walk:rate
strike?:phase
strike*
phase
phase3
Action Editor
ACTION EDITOR
The action editor is called from the Edit menu. Each agent can have any number of actions. Actions consist of
curves which affect channels, or degrees of freedom in the agent.
At any time the action can be played and stopped by hitting the space bar, or renamed by entering a new name in the
text field at the top.
The action editor has seven tabs:
actions
curves
edit
loop
agent
IK
transform
Action Editor
track
rate
solo
disables the agent's brain and enables only the current action
IK
The rate variable only affects the playback rate of the action while editing. The default rate, shown above the number
field, is unaffected. See actions for information on affecting playback rates outside the editor.
Actions can start and end playback at points other than the start and end of the action. Two vertical green lines
represent the start and end times. These values are also used as the loop start and loop end for looped actions.
The action editor has infinite undo/redo. Alt-U is the undo key and shift-alt-U is the redo key. The undo/redo is
initialized upon entering the action editor so it will not remember changes while the editor is switched off.
The actions tab is for selecting actions. Only one action can be selected at a time.
Actions in white are actions that also appear in the motion tree. Actions in grey do not appear in the motion tree. This
helps identify misspellings and missing actions.
copy action
delete action
move up
move down
The curves tab is for selecting action curves. Any combination of curves can be selected at once. The curve selection
is the same for all of the actions for the agent.
The edit tab is for editing curves. Curves are colour coded according to axis. x curves are red, y curves are green,
and z curves are yellow.
The current phase of the action is displayed as a white vertical line when solo is on.
The start and end points of the action are displayed as vertical green lines. These default to 0 and 1 respectively so
they are not usually visible.
The x and y values of the point being edited appear at the right below the graph of the point currently being edited.
These number fields can be directly edited.
Editing curves
select points
left-click
ctrl-left-drag
move points
left-drag
move curve
middle-drag
right-click or right-drag
alt-left-drag
alt-middle-drag
right arrow
left arrow
next curve
up arrow
prev curve
down arrow
To move a range of points first select them with ctrl-left-drag and then drag them with left-drag.
The up and down arrows cycle through the selected curves.
hierarchy
used for editing the orientation of a segment while leaving the
compensation orientation of attached segments unaffected
soft
edit
brings up the soft edit curve (in blue) and the soft edit
controls. While soft edit is on dragging points affects other
points with a smooth falloff. Points further away from the
selection are affected less. The falloff and bias sliders can be
used to control the range of influence. The wrap button
should be on for cyclic actions.
set
start
used to make the current phase the start of the action. This
can be used to synchronize loops.
reverse
interp
reverses the order of the action so that the start becomes the
end and the end becomes the start
linearly interpolates the selected range of points
Loop mode can be used to set the start and end of an action, or to permanently clip the ends of an action, or to
perform destructive cross fade looping. It is also used to set the 'one shot' and 'no retrigger' attributes for the action.
The start and end points determine the start and end of playback for the action. Altering them does not affect the
actual length of the action itself or the data it contains, only the apparent length when played back.
The loop start and loop end points are represented by green vertical lines.
The cross fade value determines the length of the action used to cross fade the start of the loop with the end. The
result of the cross fade is evident while in the loop tab but will be lost if the apply button is not used.
The cross fade sections are represented by light green vertical lines.
The apply button crops the action at the start and end. If cross fade is non-zero then the cross faded section will be
'baked' into the action data. The apply button does affect the actual length of the action.
loop start
loop end
cross fade
static
turning
locomotion
ramp
crossfade root curves These buttons determine which of the root segment curves will
have cross fade looping.
For example it would make no sense to loop tz for an action that
walks along the Z axis, since the agent would then be sliding
back to the start location on each cycle.
one shot
If the one shot flag is on the the action will not loop when
triggered from the brain.
Any action that is not cyclic should have this flag set.
no retrigger
apply
This button truncates the action and 'bakes in' the cross fade.
Action Editor: IK
ACTION EDITOR: IK
The IK tab is used to create inverse kinematic curves, IK hold curves, and rotation constraint curves.
IK curves
IK curves creation involves the conversion of existing rotation curves into the equivalent inverse kinematic curves.
Selecting a curve for a segment in the curves tab specifies the segment as the end effector.
More than one set of IK curves can be generated at once by selecting curves for multiple segments.
The original rotation curves are retained and can be deleted later if so desired. If the original rotation curves are
present they will have no effect while IK is active.
The knee/elbow bend direction is determined by the IK solver from the rotation limits of the knee/elbow joint.
The bend axis buttons are used to determine which axis to use as the bend axis for knee/elbow.
RC curves
Action Editor: IK
keeping feet flat to the ground when either the foot or toe bones are controlled by IK
maintaining the angle of a weapon while modifying the motion of the hand in which it is held
Note: When using RC curves and IK curves in the same limb it is best to create the RC curves before creating the IK
curves.
Hold curves
Hold curves are used to 'hold' the IK segment in world space. This is most useful for preventing slipping of feet.
When making hold curves at least one IK curve of the corresponding segment should be selected.
The appropriate curves are already selected if the IK curves have just been created.
More than one hold curve can be generated at once by selecting curves for multiple segments.
a dark orange curve representing the speed of one of the selected segments appears
a dark green curve representing the height of one of the selected segments appears
the hold curves are automatically derived from the speed and height of the segments
There are two thresholds used in generating the hold curves. The green line represents the speed threshold (actually
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/ae_ik.html (2 of 3) [13/05/2007 01:38:31]
Action Editor: IK
marked distance) and the yellow line represents the height threshold. Adjusting these thresholds modifies the hold
curves accordingly.
The speed threshold can be moved with left-drag.
The height threshold can be moved with middle-drag.
The hold off time is used to give an ease out to the hold curves.
When the curves are close enough they can be fine tuned in the edit tab.
The agent tab is used to create agent curves and the timing curves used in transitioning from one action to another.
Agent curves are velocity curves that affect agent translation and rotation. For example, if an action contains a tz
agent curve with a value of 1 then it will cause the agent to move forward continuously at a rate of 1 unit per second.
Usually when an action is first imported, the overall translation is in the root segment. For agents to be able to travel
about by repeatedly executing actions, it's necessary to convert the overall translation and rotation of the actions into
agent curves.
Different kinds of actions work best with different combinations of agent curves. For example a walking action would
require tx and tz curves, and so that it can be used with turning and uphill actions it would also need ty and ry curves
that are set to zero. Knowing which sorts of curves are best for each action can get complicated so the action category
buttons automatically select the appropriate agent curve settings.
Interface
static
turning
locomotion
ramp
other
apply
makes all of the selected agent curves, including the transition and latch curves.
The other button selects all translation and rotation agent curves for generation. Note that it's not recommended to
have rx and rz curves for a typical bipedal agent since it may gradually drift from upright over time.
The graph depics the offset curves for each of the agent transformation channels. The offsets can be used to offset
the position and orientation of the agent from its origin if you don't like where the origin is automatically placed. Use
the up and down arrow keys to toggle between the available offset curves. Usually, there is no need to use these.
Advanced Settings
It is possible to specify the exact combination of agent curves produced. The
accessible.
The tx ty tz rx ry rz columns specify the kind of data to generate for each agent curve. The possible values for each
curve are:
none
no curve is generated
static
constant
varied
Varied agent curves contain a smoothed version of the overall motion of the action. The difference between the
smoothed motion and the original motion ends up in the root curves.
Filtered agent curve motion is useful for providing a more stable agent space, which can make for more stable
behaviour since the agent's frame of reference moves smoothly. It also provides a slight improvement in motion
quality when the agent curves are scaled by the agent's brain.
transition
latch
Rotate mode is used to transform the entire action in world space. This is useful for aligning motion with a world axis,
adjusting for tilted ground planes, offsetting in world space, and scaling.
It is recommended that any tranformation required be done before generating agent curves or IK curves.
Importing Motion
IMPORTING MOTION
Massive stores motion data in .act and .actb files. These are action and action binary files. Action files are ascii and
are designed to be easily read and written by scripts. For efficient saving and loading it's best to store all of the
actions for an agent in one action binary .actb file.
There are two ways to get .amc and .bvh motion files into Massive. The first is to use the File -> load actions menu
option. This brings up a browser for selecting .act, .actb, .bvh, and .amc files. Multiple files can be selected by holding
down the shift key. The second way is through the command line.
A single .amc file can be read into Massive with the -amc command line option. The -amcrate command line option
can be used to specify the sample rate of the amc files.
eg:
massive -amcrate 100 -amc shot1.amc agent.cdl
The agent has to have the correct segments and degrees of freedom for the .amc files. Normally .amc files are
accompanied by an .asf skeleton file. To generate an agent from an .asf skeleton just load the .asf into Massive like
this:
massive skeleton.asf
and then save the resultant agent. It's a good idea to adjust the radii of the agent's segments to get a better overall
shape before saving it. See segment - shape for details.
A single .bvh file can also be read into Massive using the -bvh command line option. Unlike the .amc files, reading a .
bvh file into Massive through the command line will result in a new agent for every separate skeleton in the .bvh file.
However, .bvh files imported through the load actions dialog will import the motion from the first skeleton into the
current agent, just like it imports .amc files.
A single Maya ascii (.ma) keyframed action can be read into Massive through the File -> Import Maya ascii menu
option. See Maya integration for more details.
Importing Motion
transform
loop/trim
create agent curves
create rotation constraint curves
create inverse kinematic curves
create IK hold curves
adjust transition and latch curves
save the action
Start the action editor by selecting Edit | Action from the menu. Click on the curves tab and hilight a few curves to
be used as a visual reference (usually the root segment curves will suffice).
Make sure the solo button is on then hit the space bar. Use alt-F to make the camera follow the agent. Shift-alt-F will
toggle filtering of the camera follow constraint.
TRANSFORM
Often the action will need to be rotated to align with world Z. This is done in the transform tab. Just drag the rotate Z
slider while the action is running until the agent is facing down positive Z.
LOOPING
Click on the loop tab. First the action can be trimmed to roughly the start and end of the required motion. Set the start
and end points appropriately, leaving some room for later adjustment.
If the action does not need to loop continuously then hit the apply button and you're ready to move on to agent curves.
For actions that will be looped continuously, such as a walk or a run, cross fade looping can be applied. Cross fade
looping blends the start of the action with the end to make seamless continuous motion. Next click on the loop tab
and make sure that the solo button is on. When in loop mode, playing an action (by hitting the space bar) will display
the looped motion. This is a preview of the loop which will not be permanent until the apply button is clicked.
To be able to watch the loop properly switch on camera follow with alt-f and then switch off the follow smoothing with
shift-alt-f. Adjust the loop start, end and cross fade parameters until the desired loop is acheived. To crossfade at the
start of the loop, the cross fade parameter should be a positive number. To crossfade at the end of the loop, the cross
fade parameter should be negative. All channels will be looped except the root segment channels NOT selected by
the loop root buttons. This is to allow the action to take the object somewhere in world space while looping smoothly.
Normally only the tx and tz channels will be unselected. Once the loop is optimal, click on the apply button to "bake"
the cross fade looping into the action.
Importing Motion
turning
locomotion
ramp
CREATING IK CURVES
Before making IK curves for an agent it's important to ensure that the segments have the appropriate settings. For
legs it's recommended to apply IK at the toe bone rather than the foot bone, so that agents turn on the ball of the foot
rather than the heel. To make this work it's necessary to let the IK solver know that the foot is not the lower limb
segment. This is done by setting the i.k. skip flag in the dof tab of the foot segment node on the body page. See
segment - dof for details.
To create IK curves, click on the curves tab to get to curves mode, select one or more curves of the end effector
segment (eg: r_toes:rx), go into IK mode, and click the ik curves button.
It's ok to select curves for more than one segment (e.g. r_toes:rx l_toes:rx). IK curves will be made for each segment.
Usually the correct bend axis for the knee/elbow joint will be automatically selected upon entering IK mode. If the
wrong axis is selected just select the desired bend axis by clicking on the X Y or Z button, before clicking on the IK
curves button. To display segment axes in the view window, hit alt-a.
Clicking on the IK curves button more than once will result in multiple sets of IK curves for the segment which is not
very useful. If this happens then go back to the curves tab, select the unwanted IK curves and hit the delete selected
button.
Importing Motion
For actions to transition properly the transition and latch curves need to be set to appropriate values.
An action becomes active as it's transition curve goes from 0 to 1.
No other actions can be triggered while an active action's latch curve is at 1.
The Sequencer can be used to observe the effect of these curves as the actions transition from one to another.
First select the transition and latch curves in the curves tab. Then click on the edit tab. Start the Sequencer from the
Run menu. Build up a list of 2 or 3 actions and hit the space bar (make sure the action editor solo button is off). Now
slide the transition and latch curve points in X to get the desired results.
SAVING AN ACTION
Use File | Save actions to save all of the agents actions in an action binary file. Once this has been done, save the
agent (.cdl). Next time the agent is loaded it will get the action binary file loaded along with it.
Actions can also be saved as part of the .cdl file itself. This is not normally recommended, as it greatly increases the
size of the .cdl file. In order to save the .cdl file with actions embedded, do not save an action binary (.actb) file before
saving the .cdl.
The Sequencer
THE SEQUENCER
append
adds action currently selected on the left hand list to the bottom of the right hand list.
insert
adds action currently selected on the left hand list to the spot above the selected action in
the right hand list.
replace
replaces action currently selected on the right hand list with selected action in the left hand
list.
delete
Playing the simulation while the Sequencer dialog is open will cause the actions on the right hand side of the list to
play in order. The current action being played will be indicated by a red progress bar moving across the name of the
action.
When playing actions with the sequencer, make sure the solo button is off in the Action Editor and no actions are
being activated by the brain. If there are nodes in the brain that are triggering actions, make sure to disable these
nodes before running the Sequencer. These cases will lead to conflicts with the Sequencer.
The Sequencer
This dialog allows you to select the number of actions you want for the list. Upon clicking the accept button, the
Sequencer will be filled with a list of actions beginning with the current action you have selected in the tree. These
actions will be selected in an order consistent with the layout of the tree.
In order to get a different sequence, select a different starting action.
Bones
BONES
Skinning in massive is done using an algorithm called Bones. Bones uses ellipsoids to specify the influence that the
segments have on the geometry.
An alternative to using Bones is to import weights from another program after converting them to Massive's weight
format. See the section on the weights tab in the Geometry Node page.
The bones window is invoked from the Option menu.
Volumes of Influence
Each segment has 2 ellipsoids representing the bones volume of influence on the geometry.
The volume inside the inner ellipsoid represents the area of the geometry that is completely
affected by that bone.
The degree of influence on the geometry decreases between the inner & outer ellipsoids
The geometry outside the outer ellipsoid is not affected by the segment at all.
The degree of influence a ellipsoid exerts on the geometry is represented by a colour range
where blue indicates a low influence & yellow a high influence.
Bones
Segment Symmetry
Ellipsoids for a mirrored segment will be updated to match its mirror segment if symmetry is on.
Mirrored Segments are 2 segments with the same name with the excepition of an exchanged upper or lower case L
and R anywhere in the name eg. L arm and R arm.
Symmetry can be turned off by toggling the Symmetry Icon at the bottom right of the Bones Window.
Symmetry on
Symmetry off
Channels
CHANNELS
Channels are used to pass information between an agent's brain and it's body. There are channels for all of an
agent's degrees of freedom, vision, sound, actions, and information about the terrain beneath the agent. Some
channels such as segment rotations are input and output channels, others such as terrain channels are input only and
some are output only. Input nodes containing the name of the channel are used to obtain values from a channel.
Output nodes containing the name of a channel are used to set channel values.
The wildcard characters ? and * can be used in input nodes when referring to action names. See actions for details.
Sending output values to a non-existent channel creates a user variable which can be referenced in input nodes.
SYNTAX
Most channels refer to a parameter that is associated with a segment or an action. A colon seperates the name of the
segment or action from the rest of the channel name.
eg:
head:ry
walk:rate
Channels directly associated with the agent are called agent channels. These contain no colon.
eg:
ry
ground
Some channels such as IK channels form a group of channels. A fullstop is used to seperate the members of the
group.
eg:
ground.r
ground.g
ground.flow
r_hand:ik.x
r_hand:ik.y
r_hand:ik.active
When modifying the effects of actions the channel name is enclosed in square brackets.
eg:
[head:ry]:scale
[r_hand:ik.x]:offset
Channels
CHANNEL REFERENCE
AGENT CHANNELS
channel
description
input / output
min
max
example
tx ty tz
both
-inf
inf
ty
rx ry rz
both
-inf
inf
ry
lx ly lz
input
-1
ly
collide
input
inf
collide
collide.v
velocity of collision
input
inf
collide.v
input
-inf
inf
collide.x
input
-int
int
collide.vx
input
-1
collide.nx
ground
input
-inf
inf
ground
input
ground.r
ground.dx ground.dz
input
-inf
inf
ground.dx
ground.r.dx ground.g.dx
ground.b.dx
ground.r.dz ground.g.dz
ground.b.dz
input
-inf
inf
ground.r.dx
balance.x balance.z
input
-inf
inf
balance.x
sound.f sound.a
sound.f1f sound.f1a
sound.f2f sound.f2a
both
inf
sound.f
Channels
see sound
input
both
-inf
inf
wind.x
wind.a wind.f
output
inf
wind.a
dynamics.active
output
dynamics.active
output
vision.active
output
active
vision.active
active
sound.d
parent
output
parent
keyboard
input
65535
keyboard
controller.joy1.x
controller.joy1.y
controller.joy2.x
controller.joy2.y
controller.joy3.x
controller.joy3.y
controller.slider
controller.b1
.
.
controller.b8
input
controller.joy3.x
(see joystick/keyboard
controls)
servo.force
output
inf
servo.force
level of red/green/blue/alpha
channels that agent paints on
the ground
output
paint.r
paint.size
output
inf
paint.size
colour
input/output
colour
SEGMENT CHANNELS
channel
description
input / output
min
max
example
tx ty tz
segment translation
both
-inf
inf
head:ty
rx ry rz
segment rotation
both
-inf
inf
head:ry
Channels
xyz
input
-inf
inf
head:y
lx ly lz
input
-1
head:ly
input
-inf
inf
r_hand:h
mass
segment mass
output
inf
head:mass
dynamics.active
output
head:dynamics.active
force.x
force.y
force.z
output
-inf
inf
r_shoulder:force.z
force.px
force.py
force.pz
output
-inf
inf
r_shoulder:force.px
force.rx
force.ry
force.rz
output
-inf
inf
head:force.ry
ground
input
-inf
inf
r_foot:ground
vision.x vision.y
vision.h vision.i
see vision
input
-1
head:vision.x
both
r_hand:ik.x
both
r_hand:rc.x
collide
input
inf
head:collide
collide.v
velocity of collision
input
inf
head:collide.v
input
-inf
inf
head:collide.x
collide.vx collide.vy
collide.vz
input
-int
int
head:collide.vx
collide.nx collide.ny
collide.nz
input
-1
head:collide.nx
spawn
output
arrow:spawn
Channels
servo.force
output
inf
head:servo.force
servo.force.x servo.force.
y servo.force.z
output
inf
head:servo.force.x
output
-inf
inf
head:servo.rx
colour
colour of segment
input/output
head:colour
ACTION CHANNELS
channel
description
input / output
min
max
example
action
output
walk
action
input
walk
action1->action2
output
walk->sidestepL
[channel]:scale
output
-inf
inf
[head:ry]:scale
[channel]:offset
output
-inf
inf
[head:ry]:offset
[channel]:origin
output
-inf
inf
[r_toes:ik.y]:origin
action:rate
both
-inf
inf
walk:rate
action:running
input
walk:running
action:phase
input
walk:phase
phase
input
phase
input
phase5
action:phase_offset
output
walk:phase_offset
latch
intput
latch
Channels
LEAN CHANNELS
The lean channels ( lx ly lz) for agents and segments work like this..
lx - the Y component of the X axis in world space
ly - the Y component of the Y axis in world space
lz - the Y component of the Z axis in world space
...which basically means 'how vertical is this axis'.
In laymans terms..
lx - leaning to the left or right (-ve = left, +ve = right)
ly - how upright (1 = upright, -1 = upside down)
lz - leaning forwards or backwards (-ve = forward, +ve = back)
Dynamics
DYNAMICS
An agent, or part of an agent, can have rigid body dynamics activated at any time by setting a dynamics channel to
1.0. An output node to do this for an entire agent would contain this string:
dynamics.active
To switch on dynamics for a sub-hierarchy of an agent, for instance a tail, an output string like this one would be
used:
tail_1:dynamics.active
For dynamics to work properly the dynamics attributes of the agent must be set to appropriate values.
These attributes are edited in the body page under agent dynamics and segment dynamics.
Note that making dynamics active for a segment, rather than the whole agent, effectively detaches the segment and
it's children from the segment's parent. The parent constraint is used to maintain the relationship of the dynamic
segment to it's parent segment. This constraint is only required for the first segment in the sub-hierarchy, e.g. if tail_1
dynamics is active then it would need a parent constraint, but tail_2 and tail_3 would not.
The Dynamics dialog box, accessed through Edit -> Dynamics in the main menu, allows the user to enable or disable
various dynamics options at a global level, thereby overriding dynamics at an agent or segment level.
terrain collisions
Dynamics
agent collisions
self collisions
toggles on/off collisions of segments with other segments within the agent
rotation constraints
spring
spring collisions
drag
quickstep
toggles on/off quickstep stepping function for the ODE solver. Quickstep is a
faster but less accurate stepping function.
SOLVERS
Massive offers two options when it comes to the dynamics solver, Glowworm and ODE. The dynamics dialog box
contains the option to choose one or the other. The selected solver is saved with the agent (.cdl) file. However, only
one solver can be used in a scene, so if two agents with different solvers are loaded into a scene, the more recently
loaded agent will set the solver for the scene.
DYNAMICS IN MASSIVE
Collisions
There are several types of collisions that can occur in massive; terrain collisions, self collisions, agent collisions and
spring collisions. Inter-penetration is avoidable by use of the collision constraint which uses the collision constants to
scale the constraint forces.
Terrain collisions are collisions between any segment and the terrain model. Where there is no terrain model the
collisions occur at the Y=0 plane.
Self collisions occur between segments of the same agent. Collisions do not occur between a segment and it's
parent. This is so that segments which partially overlap their parents are not continually being forced apart from their
parent segment.
Agent collisions are those that occur between two segments from different agents.
Spring collisions occur with the line between the spring endpoints, and any segment within the same agent that the
spring is not attached to. Springs can have a collision thickness. Collisions are not detected between springs. Note
that a spring can collide with the child or parent of an attached segment, so it's best to ensure that springs do not
penetrate segments in the rest pose other than those to which they are attached.
Box primitives do not yet collide with terrain geometry, but they do collide with most other segments and the ground
plane (when there is no terrain geometry).
Rotations
Rotations can be constrained to stay within the segment rotation limits. Constraint forces are applied to each
rotational degree of freedom for any segments that have a non-zero rotation spring constant.
Springs
Springs can be connected between segments of an agent. At least one of the connected segments must have
dynamics active for a spring to have any effect. Springs can be created and edited using the body page .
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/dynamics.html (2 of 3) [13/05/2007 01:38:48]
Dynamics
Springs can collide with segments. By default collisions is switched on for a spring.
Drag
All segments can be affected by drag. Drag acts on segments as they move through the atmosphere. This depends
on the size, shape and motion of the segments and on the movement of the wind (see wind).
Forces
Forces can be applied to segments when dynamics is active. These forces are useful for controling the behavior of
agents during rigid body dynamic simulation. There are two types of forces that can be applied: external and torque.
External forces are specified with x y and z force values and an x y and z location relative to the segment. Any
combination of the three can be set. Specifying the location is optional and the default location is the centre of the
segment. e.g.
r_shoulder:force.z
r_shoulder:force.px
Torque forces are specified with an x y and z value. e.g.
head:force.ry
SMART STUNTS
Smart stunts can be used to combine dynamics with actions to create a realistic stunt agent.
The action in question should be set to run in the brain, and at the same time, dynamics should be set to active for the
agent.
The amount of effect the action has on the agent is determined by the magnitude of servo forces set using the servo
channels. See the channels page for a full listing of agent and segment servo channels.
Massive will use the forces specified through the servo.force channels to try to rotate the selected segments into
whatever position is specified by the running action on that particular frame.
This can be used to create an agent which is falling or being hit while simultaneously trying to block or protect itself,
among many other applications.
Expressions
EXPRESSIONS
Expressions can be used in input nodes to modify or combine variables and channel values. See channels or
variables for more information. Brackets can be used to control order of evaluation. Spaces are ignored.
Supported operators:
operator
*/%
operation
precedence
+-
add subtract
<<
>>
>>>
relational
== !=
comparisons
&
bitwise AND
bitwise XOR
bitwise OR
&&
logical AND
logical OR
||
Expressions are evaulated left to right with precedence as per the above table.
Supported functions:
sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
abs(x)
absolute value of x
min(a,b)
minimum of a and b
Expressions
max(a,b)
maximium of a and b
sqrt(x)
square root of x
noise(x)
noise(x,y)
noise(x,y,z)
examples:
r_arm:rx - abs(ArmAngle)
(.5 + lhand:y) * 2
(.5+lhand:y)*2
Flow Field
FLOW FIELD
The flow field is directional information embedded into the alpha channel of the terrain map, which is useful for guiding
agents around the terrain. It is made by placing flow splines onto the terrain and then clicking on the apply button to
encode the flow field into the terrain map.
The flow field represents angles about the world Y axis from 0 to 360 degrees. When this data is referenced in an
agent's input node (see terrain) it is given relative to the agent's heading. The flow field can also be used to orient
agents during placement by switching on the orient to flow flag for a generator (see place tool).
The flow field as defined by the flow splines is visible as vectors called "indicators" in the view window while the flow
field editor is active. To see the indicators at other times select the Flow field option under the View menu. Note that
the indicators do not necessarily agree with the flow field in the terrain map. The actual flow field data can be seen by
switching on texture map and alpha channel under the Terrain menu.
The flow splines are saved in the setup file. It is recommended to save the terrain map also (save terrain map under
the File menu) after the flow field has been "applied".
Splines
When the top left button is selected the flow field editor is ready to add, delete or edit flow splines.
This is how to make a flow spline:
Make sure the spline button in the top left of the flow field editor is selected
Click on the add button (or hit the space bar)
Left click on the terrain, once for each control point along the spline
Right click to finish (or Esc to cancel)
Flow Field
The flow field will point in the direction in which the spline was drawn. The brighter ends of the flow field indicators
point in the flow direction.
The radius slider is used to control the width of the spline.
The angle slider is used to set the angle of flow away from parallel with the spline.
The edge angle slider can be used to feather the edges in or out. The edge width slider controls the width of the
feathering.
To select a spline shift left click on the spline. To drag a spline shift left drag the spline.
Points
Individual spline points can be added, deleted or moved when the point button is selected.
Shift left click to select a point. Shift left drag to move a point. Radius, angle, edge angle and edge width can all be
edited per point.
Flow Field
Gaps
Flow gaps can be added, deleted or edited when the top gap button is selected.
Flow Field
Flow gaps have a radius of influence and a weight. Select a flow gap with shift left click and move a flow gap with shift
left drag.
To add a flow gap:
Inverse Kinematics
INVERSE KINEMATICS
There are two inverse kinematics (IK) constraints in Massive; the first is a limb constraint useful for arms and legs, and
the second is a single segment constraint which points a segment at the specified location. The specified location for
an IK constraint is called the goal. Alt-i can be used to toggle visibility of IK goals in the view window.
The rotation constraint is also described below since it can be used with the IK constraints.
Limb IK
This is the simplest hierarchy that could be used with Limb IK:
root
upper_leg
lower_leg
foot
The upper leg and lower leg segments would be rotated to locate the foot (the goal segment) at the goal. For the
upper_leg rx ry and rz would be solved and for the lower leg only one of rx ry or rz would be solved. The rotation of
the foot doesn't matter at this stage since it's the origin of the foot that is constrained to be at the goal. To constrain
the rotation of the foot in agent space use the rotation constraint. The goal is specified in agent space (i.e. local to the
agent) rather than world space.
The bend axis of the lower limb segment is controlled by the availability of degrees of freedom. The bend direction of
the lower limb segment is controlled by the rotation limits. If the +ve limit is larger than the -ve limit then the bend will
be in the positive direction. Limits are set in the body page . The rotations that are affected by an IK constraint are
indicated in the view window if the goal segment is selected (shift left click to select), and if IK goal display is on.
Here are the channels that need to be set:
channel
value
foot:ik.active
foot:ik.x
foot:ik.y
foot:ik.z
foot:ik.twist
Optional IK channels:
Inverse Kinematics
foot:ik.hold
foot:ik.grab
All IK channels can be controlled from the brain or from actions. Forward kinematic rotation curves in an action can
be converted to IK curves in the Action Editor . IK hold curves can also be created in the action editor.
Setting ik.active to a value between 0 and 1 will result in a blend between the values already set for the rotations and
those set by the IK solver, so that IK can be smoothly switched on and off as required. The blending uses quaternion
interpolation to avoid pops in the motion.
Since the goal is set in agent space rather than world space it is necessary to set ik.hold to keep the goal stationary in
world space. The goal widget turns red when ik.hold is on, and a blue widget appears at the location where the goal
would be if hold were off.
IK grab can be used to constrain part of an agent to be attached to another part of itself, or to another agent. The
segment that the goal is attached to is determined by the maximum depth of collision between the goal segment and
any other segment. If there are no colliding segments then the goal will not be set. The goal may be set at a later
frame if a collision occurs and the IK grab is still set to 1. The IK goal widget turns green when ik.grab is on.
The Limb IK solver can also deal with more complicated hierarches For example:
shoulder
upper_arm
lower_arm
wrist
hand
In this case the solver would know which segment to treat as the upper limb and which to treat as the lower limb by
the state of the wrist IK skip flag. This is set in the body page (from the Edit menu) and is saved in the CDL. Any
segment can have IK skip set so that the solver knows to use the next segment up the hierarchy. The rotations of
skipped segments are taken into account in the solve, so rotating a skipped segment does not usually compromise the
solve. But in some cases rotations of a skipped segment can result in ambiguous solves.
Single IK
The Single IK constraint is applied if the goal segment's IK single flag is on. This flag is set in the body page . The
Single IK constraint only rotates one segment to move the goal segment towards the goal location, so it functions
much like a lookat constraint. The rotated segment will be the parent of the goal segment unless the parent's IK skip
flag is on. The functions of the channels and the goal display are the same as for Limb IK.
Rotation Constraint
Normally segments are rotated relative to the parent segment, or in the case of the root segment relative to agent
space. The Rotation Constraint is used to rotate any segment in agent space, irrespective of the rotation of the
parent. This is especially useful for keeping hands and feet at specified angles. When controlling a leg with Limb IK
from an action it is recommended to use the Rotation Constraint to control the foot rotations, so that scaling and
offseting the foot IK channels does not affect the angle of the foot. The rotations are euler rotations applied in the
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/ik.html (2 of 3) [13/05/2007 01:38:57]
Inverse Kinematics
order specified for the segment in the CDL. The rotation order is not yet editable in the segment editor.
There are 4 channels which need to be set for the Rotaion Constraint:
foot:rc.active
foot:rc.x
foot:rc.y
foot:rc.z
Joystick/Keyboard Control
JOYSTICK/KEYBOARD CONTROL
Massive allows real-time control over agents using joystick and keyboard input. This allows Massive users to choose
certain key agents and control their movements in real time during the simulation.
Gamepad Channels
Massive recognizes input from most buttons and controls on the standard joystick or gamepad.
Channels corresponding to controls such as analog sticks and sliders have a range of 0 to 1, where 0.5 represents
the center while 0 and 1 represent the extremes (right/left, up/down).
Channels corresponding to buttons will return values of 0 if the button is not pressed and 1 when it is depressed.
Below is a list of joystick input channels and an approximate description of which controls they correspond to on a
standard gamepad. If your gamepad is different in any way, it is easy to quickly discover which controls map to which
channels by opening the file joy.cdl, which is included in the Demo package.
To use joy.cdl, open the file, begin running the simulation by pressing spacebar, and then press any of the controls on
your gamepad while seeing which input channels are activated. Click on the input node in question to select it and see
the name of the corresponding channel. Note: the name that appears on the input node is not the channel name. See
the "source" text box to the right of the "name" text box to see the channel.
In joy.cdl, only the joy1 and joy2 controls are connected to agent behavior (body movement and head movement
respectively). The other input channels are not connected to anything to begin with and, until connected, are only
there to help you see which channels correspond to which controls.
controller.joy1.x
The x position of the joy1 control - any value from 0 (left) to 1 (right). The
joy1 control corresponds to the left analog stick on a standard dual-analog
gamepad.
controller.joy1.y
The y position of the joy1 control - any value from 0 (down) to 1 (up). The
joy1 control corresponds to the left analog stick on a standard dual-analog
gamepad.
Joystick/Keyboard Control
controller.joy2.x
The x position of the joy2 control - any value from 0 (left) to 1 (right). The
joy2 control corresponds to the right analog stick on a standard dualanalog gamepad.
controller.joy2.y
The y position of the joy2 control - any value from 0 (down) to 1 (up). The
joy2 control corresponds to the right analog stick on a standard dualanalog gamepad.
controller.joy3.x
The x position of the joy3 control. The joy3 control usually corresponds to
the directional pad and if so, returns x values of 0, 0.5, and 1 for left,
center, and right.
controller.joy3.y
The y position of the joy3 control. The joy3 control usually corresponds to
the directional pad and if so, returns y values of 0, 0.5, and 1 for down,
center, and up.
controller.b1
The status of button 1 - on (1) or off (0). This is the left button on the front
face of a Logitech Dual Action gamepad.
controller.b2
The status of button 2 - on (1) or off (0). This is the bottom button on the
front face of a Logitech Dual Action gamepad.
controller.b3
The status of button 3 - on (1) or off (0). This is the right button on the front
face of a Logitech Dual Action gamepad.
controller.b4
The status of button 4 - on (1) or off (0). This is the top button on the front
face of a Logitech Dual Action gamepad.
controller.b5
The status of button 5 - on (1) or off (0). This is the top right button at the
back on a Logitech Dual Action gamepad.
controller.b6
The status of button 6 - on (1) or off (0). This is the top left button at the
back on a Logitech Dual Action gamepad.
controller.b7
The status of button 7 - on (1) or off (0). This is the lower right button at the
back on a Logitech Dual Action gamepad.
controller.b8
The status of button 8 - on (1) or off (0). This is the lower left button at the
back on a Logitech Dual Action gamepad.
Keyboard Control
Massive also recognizes keyboard input with the keyboard input channel. This channel returns the ascii value of the
current key being pressed and can also be used for real-time input.
MAYA INTEGRATION
Massive is capable of importing and exporting certain data from Maya through the File->Import Maya ascii, File>Export Maya ascii, and Sim dialog options.
Importing Lights
To import a Maya light, select the light, choose File->Export Selection, and export the light as an .ma file.
The subsequent .ma file can be imported into Massive through the Import Maya ascii dialog shown above, with the
"lights" option selected.
Information imported from a Maya camera file include rotation, translation, colour, spot angle (from cone angle in
Maya, for a spotlight), and spot exponent (from dropoff in Maya, for a spotlight).
Importing Cameras
Before importing, a Maya camera should have its animation baked (if animated) and be exported as an .ma file using
File->Export Selection in Maya.
The subsequent .ma file can be imported into Massive through the Import Maya ascii dialog shown above, with the
"cameras" option selected.
Information imported from a Maya camera file include rotation, translation, filmback (called Camera Aperture in Maya),
and focal length.
Once imported, Massive will save out the camera in its own file format (.cam) in the directory specified in the camera
file output directory field. This is where the camera data will be stored.
Importing Skeletons
Any skeleton can be imported directly from Maya. The skeleton should be selected and exported as an .ma file, and
then imported into Massive using the Import Maya ascii dialog with "skeleton" switched on.
The skeleton must be one continuous skeleton descended from one root joint.
Another important thing to take note of is that the root joint's local rotation axis must match the world axis, or agent
curves will not be correctly oriented when applied.
Importing Motion
Maya ascii files containing baked keyframe animation can be imported through the Import Maya ascii dialog with
"motion" switched on. The result will be similar to importing an .amc action through Load->action. See Importing
Actions for more details.
It is important to make sure the keyframes have been baked, and also take note of root axis orientation as mentioned
in "Importing skeletons" above.
Curves imported from Maya which are connected to a joint (such as joint1:rotatex) will be applied directly to that
skeleton segment. All other curves are treated as auxiliary curves, accessible as a brain channel but not immediately
connected to any behavior. See the action curves page for more on different types of curves.
A third type of curve is the blendshape curve. When importing blendshape animation from Maya, the first step is to
import the base mesh and the blend shape meshes, setting them up in a geo node as described in the geo node
page. The geo node must have the same name as the blend shape node in Maya, and the blend shapes within it
should have the same names as the blend shape targets within the node in Maya.
Now, making sure the blendshape keys are baked along with the rest of the keys, save the .ma and import it into
Massive using the Import Maya ascii dialog. If the names match up, the imported blendshape curves will appear as
blue curves in the Action editor and will control the animation of the blendshapes.
Exporting to Maya
Exporting Skeletons
An agent's skeleton can be exported to Maya ascii format by selecting the desired agent and then choosing File>Export Maya ascii from the main menu.
This skeleton is exported in the zero pose. If the intention is to use the skeleton as a reference for modeling and the
bind pose differs from the zero pose, then you will need to write out one frame of animation as a Maya ascii (see
below) and use that as your reference.
Exporting Motion
An agent's motion (skeleton included) can be exported to Maya ascii format through the Sim dialog output option
Sim, selecting "maya" as the file format. See the Sim dialog page for more information.
Paint Editor
PAINT EDITOR
The paint tool is used for painting the RGB channels of the terrain map. The terrain map can be used for placement of
agents (see generators ) and as input data for agents (see terrain ).
The current brush colour is picked by shift left clicking in the view window. There are 3 types of brushes; square
round and soft. These are selected with the 3 buttons at the top of the paint tool. The left mouse button is used for
painting in the view window. Painting only happens when the paint button is on. Apart from clicking on the paint
button, painting can be switched on with the space bar and switched off with a right click in the view window. The left
mouse button paints with colour 1 and the middle mouse paints with colour 2. To select a colour for editing click on it's
swatch next to the paint button.
size
Agents themselves can also paint on terrain. See the channels page for details about agent paint channels.
Paint Editor
Placement
PLACEMENT
Loading a CDL results in the presence of a single original agent in the scene. The most efficient way of creating
multiple agents from one CDL is to create "instances" of the original agent. Instanced agents can differ from the
original agent by the use of agent variables. Instances are made by first generating locators and then calling the
"place" function, either with ctrl-p or the apply button in the Place Editor. The place function creates an instanced
agent at each locator, and hides the orginal agents. To delete the instanced agents from the scene use ctrl-d. After
deleting the instanced agents the original agents become visible again.
Each instance shares data from the original agent to conserve memory and processor resources. An original agent
will get default values for any agent variables. Instances are assigned their own values for the agent variables which
can be used to vary segments, geometry, cloth, shader, textures and behaviour. See variables for more on agent
variables.
Something important to note during placement is that if View->geometry is off (either using the View->geometry
menu option or the alt-m hotkey) at the moment of placing, the geometry is not merely invisible, but is not even
instanced for each agent. This can save considerably on processing time in any circumstance where geometry is not
immediately necessary (such as writing out rib and sim files).
Once agents have been placed with View->geometry toggled off, the only way to view geometry on them is to delete
all the instances with Ctrl-D, toggle View->geometry on, then Ctrl-P to place them again.
Groups
An original agent and it's instances, along with some additional data, constitute a group.
A group contains the following data:
group name
CDL filename (see below)
variables (see below)
locators
a number of instanced agents
CDL filename
The CDL filename refers to the original agent's file. Group and agent in the scene page are associated by this field.
Variables
Group variables can be used to override the agent variables. In this way the same original agent can be used with
different variables in different places in the scene.
Locators
Locators are used to specify the placement of instanced agents in the scene. Each locator stores the starting location,
rotation, and instanced template variables for an agent. Locators are produced by generators.
Locators can be individually edited. The location, rotations and variables of each locator can be modified (see locator
Placement
editor). Editing of a locator results in a locked locator, so called because it's values are no longer affected by
changes to generators. Locators can also be deleted. Deleted locators are not actually deleted but no instance will
be created for a deleted locator even though the locator is still visible. Deleted locators are also unaffected by
changes to generators.
If a locator has it's brain flag switched off then the instance made at the locator will have brain processing switched
off. If a loactor has the replay flag switched on then the instance made at the locator will also have it's replay flag
switched on. When an agent's replay flag is switched on it causes the agent to replay it's motion data as pointed to by
the input sim path, set at the command line or in the sim dialog.
For example, setting replay flags on and brain flags off could be used to mix agents from a previous run of a sim with
active agents. Also switching on both flags could be used for running a secondary pass for dynamics.
locator with
replay flag on
locked locator
with brain flag
off and replay
flag on
The names of the agents that are to be created for each locator are displayed when agent names is switched on.
Locked locators, killed locators and the brain and replay flags are saved in the setup file.
Generators
There are several different types of generators. They appear as widgets in the view window while the Place Editor is
active. Each type of generator can be used to create locators in different ways.
point
circle
Creates a line of locators along a spline, or rows and columns along a spline.
colour
Creates locators on the specified colour on the terrain. This type of generator
requires a terrain map and does not appear as a widget.
A generator can create locators for any combination of the groups in the scene. The number of locators and the ratios
of locators per group are specified in the Place Editor.
Generators are saved in the setup file.
Hierarchical Placement
In addition to placing instances of individual agents, Massive also allows placing of setups in the same way.
First, a setup file (.mas) is loaded through File -> load setup with the "child of current setup" option selected, as below:
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/place.html (2 of 3) [13/05/2007 01:39:06]
Placement
A group will be created for this setup, as well as separate groups for the agents if there is more than one type of agent
in that setup. The group created for the setup now appears as a placeable group in the Place Editor, and can be
placed just like a regular group.
Spawning
Agents can also spawn from other agents using the spawn channel. For spawning to work, there need to be two
existing agents, the spawner and the spawnee. One of the segments on the spawner agent must have the same
name as the group of the spawnee. The group usually has the same name as the agent itself, but this can be doublechecked and changed if necessary in the scene page.
Once these two agents are both loaded into a scene, the output channel:
segment:spawn
where "segment" is the name of both the spawning segment and the spawnee's group, will cause an agent to spawn
every time it is triggered.
Place Editor
PLACE EDITOR
The place editor is used for creating and editing generators. Generators generate locators. Locators specify the
locations of all instanced agents in the scene. See place for details.
generator
number
distance
noise
Jittering of locators
noise frequency
angle
angle variation
height
height variation
orient to flow field Set angle about Y to align locator with flow field
orient to terrain
groups
scrolled list
of groups
add | delete
no update
fast
full
place
A group exists for any CDL that has been read into the scene, or any setup file (.mas) that has been loaded with the
option "child of current setup". Groups appear as nodes in the scene page where they can be edited. The CDLs may
Place Editor
have been specified on the command line or from the load CDL dialog or by reading a setup file. Locators are
coloured according to the group colours.
To put locators into the scene, select a type of generator, click on the add button (or press the space bar) and left click
in the view window. A single click is all that's required to create a point generator, see the table below for other types
of generators. Adjust the number slider or type a number into the number field beside the slider to set the number of
locators that the generator generates.
This table describes the steps required to make a generator after clicking on the add button (or pressing the space
bar):
generator type
creation steps
point
circle
Left drag in the view window. The start of the drag operation
determines the centre of the circle.
polygon
Left click in the view winodw, once for each vertex of the polygon.
Right click to finish.
spline
Left click in the view window, once for each control point of the spline.
Right click to finish.
colour
Selection
Once a generator has been made it can be selected by shift left clicking on the generator's widget in the view window.
Colour generators are selected by shift left clicking on the colour on the terrain.
To add to a selection shift middle click on a generator. See the message line in the icons window for mouse function
hints.
Generators can be lasso selected by shift draging around them in the view window.
Dragging
Generators can be moved by shift left dragging. The button in the top right corner of the place editor selects between
dragging of the selected generators and dragging of a single point of the current generator. For the point generator
this makes no difference, for the circle generator it allows dragging of the edge of the circle to change the radius, and
for the polygon and spline generators it allows for dragging of the individual points.
Groups
Each generator has a list of groups for which it will generate locators. The list can be changed by clicking on the
groups in the scrolled list. In this way it is possible to generate locators for different types of agents from a single
generator.
The number of locators generated for each group is determined by the number value of the generator and the ratios in
the groups slider.
By default the ratios are even. The ratios can be changed by dragging the bars in the groups slider.
Locator Editor
LOCATOR EDITOR
Locator Editor
Selection
To select locators shift left click on a locator or left drag a selection lassoo around locators. To add to a selection use
shift middle click or drag, and to subtract from a selection use alt shift middle click or drag. The message in the lower
left corner of the icon work area displays the current functions of the mouse buttons.
Locators can also be selected for editing by selecting a locator selection set in the selections tab, then returning to
the edit tab.
Moving
To move locators left drag on the locator to be moved. If multiple locators are selected then the other selected
locators will also be dragged. Locators are moved along the terrain and can be dragged across gaps in the terrain.
When multiple locators are selected any changes made to the values in the locator editor are applied relatively to all
selected locators. For example if there are multiple locators selected that all point in different directions and the ry
slider is moved then the amount that it is moved is added to the ry values of all of the selected locators, and they don't
all end up pointing in the same direction.
Deleted locators are not actually deleted but they become placeholders to prevent the instancing of an agent at their
location.
To unlock or undelete a locator click on the free button.
locator
free
lock
delete
brain
replay
rx ry rz
height offset
select all
Locator Editor
*What actually happens is slightly more complicated; the locators are all regenerated and an edit list of locked locators
is aplied to the new locators to ensure that locked locators with the locked values appear at the appropriate locations.
It's a subtle difference but it helps to explain some otherwise strange behaviour.
Rendering
RENDERING
Agent geometry and terrain geometry can be rendered using RenderMan renderers. Massive explicitly supports Air,
3Delight, and Pixar's Prman renderer. Agent geometry is specified and attached to agents using geometry and cloth
nodes. Nothing is rendered for an agent if there are no geometry or cloth nodes. Shaders are specified and assigned
to geometry with material nodes in the body page. Terrain shader assignment is accessible from the Terrain menu.
Light shaders can edited in the light node and they can also be generated automatically from the OpenGL light
parameters.
PREVIEW RENDER
To generate a preview render of the scene as it is select Render from the Camera menu. The renderer can be
selected under Render in the Options menu.
SEQUENCE RENDER
The Sim dialog is used to generate a sequence of RIB files. If the ribs button is on then RIB files will be generated
when the go button is clicked. The padding of frame numbers in the filenames of the generated RIB files is specified
by the use of '@' or '#' characters. e.g.
pattern
Rib/a@.rib
Rib/a#.rib
Rib/a###.rib
padding
filenames
no padding
Rib/a1.rib
Rib/a2.rib
.
.
.
Rib/a10.rib
Rib/a0001.rib
Rib/a0002.rib
.
.
.
Rib/a0010.rib
Rib/a001.rib
Rib/a002.rib
.
.
.
Rib/a010.rib
Several types of RIB files are written when the Sim dialog is run.
One file per frame is generated for each light that requires a shadow map. (Example: a._key0001.rib)
One agents archive RIB file is generated per frame, each file containing one procedural primitive call for each
Rendering
The resultant RIB files do not contain the geometry and shader data for the agents. Instead they contain
procedural primitive calls. The programs required to generate the geometry and shader data during the render are
supplied with Massive. Huge savings in disk space and memory usage are realised by using procedural primitives in
this way.
The procedural primitive programs will refer to the set of motion files or "sim" for the sequence. These files may have
been generated previously or may be generated while writing out the RIB files. Either way it's essential that they exist
when rendering.
If the agents have cloth then the cloth also needs to be output as .mgeo files before the sequence can be rendered,
otherwise the cloth primitive will all be in their rest pose in the final images.
Another important thing to take note of is that RIB archive bounding boxes are generated based on the extents of the
segments, rather than the extents of the geometry. If the bounding boxes being generated are too small, segment size
should be adjusted to better match the geometry.
RENDER OPTIONS
renderer
When Prman is selected all texture maps referenced
by shaders should be in Pixar's .tex format. The
massive.so procedural primitive DSO will be called
during the render to generate geometry and shader
data for the agents.
When Air is selected all texture maps should be in .tif
format. run_program.exe will be called during the
render.
When 3Delight is selected all texture maps should be
in .tif format.
resolution
The resolution can be set to predetermined values or
to custom values. When set to custom the resolution
dimensions are editable. When set to viewport the
resolution dimensions track the size of the view
window.
pixel samples
Pixel samples corresponds to the RenderMan
RiPixelSamples options.
shading rate
Shading rate corresponds to the RenderMan
RiShadingRate attribute. The rate specifies the area in
pixels per shading sample. A value of 1 indicates at
least once per pixel.
shadows
Rendering
Sim Dialog
SIM DIALOG
The sim dialog is used to run a simulation or sim. The sim dialog allows the user to specify the different types of data
that are read in or written out when running a sim.
INPUT
Input files can be:
Motion from a previous run of the sim in any of four forms of data
Acclaim Motion Capture (.amc)
Compressed .amc (.amc.gz)
AMC, 1 file per frame (.apf)
Compressed .apf (.apf.gz)
Just the directory containing the motion files needs to be specified.
Cloth simulation data from a previous run of the sim, in .mgeo (Massive cloth) format.
A camera file. This will override the cameras in the scene.
OUTPUT
Output files can be:
Sim Dialog
Negative start frames can be used if the camera file doesn't allow sufficient run up.
It's often useful to break a sim into passes. The first pass would be just the overall action of the agents. The second
pass might be the cloth and attached rigid body dynamics. A third pass could be used for writing out rib files.
Note that the second pass need not contain all of the agents. Running just one agent at a time makes it easy to farm
out the dynamics to multiple machines.
frame range for sim I/O, also causes auto execution of sim.
-iapf path
-iapfz path
-icloth file
-isim path
See -iamc
Sim Dialog
-iamc path
-iamcz path
-oapf path
-oapfz path
-ocall file
-ocloth file
-orib path
-osim path
See -oamc
-oamc path
-oamcz path
-opics pattern
Sound
SOUND
Agents can emit sounds which are transmitted to all other agents within audible range. The range is dependent on the
amplitude of the sound. Amplitudes are measured in dB SPL at 1 meter from the object origin. 0dB represents the
threshold of audible sound and 120 dB represents the threshold of pain, so most sounds should be emitted within this
range. If the receiving agent is within 1m then the sound is received at the 1m level. The frequency of sound can vary
over the entire floating point range but physically realistic values are encouraged (positive values from 100 Hz to 20
KHz). Sounds diminish over distance due to spherical radiation and all frequencies diminish similarly. So far media
transmission loss is not modeled. The receiving agent has a number of sound registers in which incoming sounds are
stored. When the number of audible sounds exceeds the number of registers, louder sounds overwrite quieter sounds.
Currently the sounds are only audible to other agents.
TRANSMITTING SOUND
Setting amplitude and frequency are all that is required for an agent to produce sound. To see a graphic
representation of the sounds being emitted select the sound emission item from the View menu. A ring describing
the 0 dB level of each transmitted sound is displayed coloured according to frequency.
Here is the list of output channels that can be used in output nodes for sound transmission:
sound.a
amplitude in dB SPL
sound.f
frequency in Hz
sound.f1f
sound.f1a
sound.f2f
sound.f2a
RECEIVING SOUND
Fuzzy AND nodes which depend on information from sound channels are called sound rules. Sound rules differ from
ordinary rules in that they are applied to all of the sounds that the agent can hear, and then the node is assigned the
maximum value obtained over all of the sound sources.
For example, a sound AND rule with the inputs "near" (from sound.d) and "left" (from sound.x) would activate only if a
single target was heard both near and to the left. If the agent heard only a target near but not left, and at the same
time heard another left but not near, the rule would not activate.
IMPORTANT NOTE: Sound rules only work properly when the connections are: input -> fuzz -> AND ->. Connecting
a sound fuzz node directly to a defuzz node will not work properly. Connecting sound rules as the input to further AND
nodes works fine.
Sound
When editing a fuzz node that has a sound input, the values of all of the sounds that the agent can currently hear are
displayed as vertical lines in the background of the membership graph, coloured according to frequency. This display
can be disabled by deselecting the fuzz background item in the Fuzzy menu.
To see data in the view window from the sounds that an agent can hear select the sound reception item from the
View menu. A list of sound register data is displayed above each agent.
As an aid to debugging brains, an input node that connects to nothing but refers to a sound channel will receive the
value for the loudest audible sound.
Here is the list of input channels used for sound reception:
channel
description
min
max
sound.a
inf
sound.f
inf
sound.f1f
inf
sound.f1a
inf
sound.f2f
inf
sound.f2a
inf
sound.x
-180
180
sound.y
-90
90
sound.d
sound.o
-180
180
sound.ox
-180
180
sound.oy
-90
90
The channels sound.a, sound.f, and sound.d can be used in input nodes with the speed button on. This provides
the value of the change of amplitude, frequency and distance rather than the absolute values. Currently this does not
work with any other sound channels.
When the channels sound.a, sound.f, and sound.d are used in input nodes, there is also the choice of the average
and max buttons. The max button causes AND/OR rules referring to this input to use the value of the single input with
the highest value. The average button causes AND nodes referring to this input to use the average value of inputs that
fit any other descriptions connected to the AND.
For example, suppose sound.x has a fuzz node called 'right' and sound.d has a fuzz node called 'near', combined in
an AND rule called 'right' and 'near'. If the sound.x input node is set to average, and the sound.d input node is set to
max, then the 'right' fuzz node will pass to the AND node the average value of everything heard to the right that is in
the 'near' range.
This is good for having agents follow the trend of a group rather than follow the nearest individual. Note that only one
of the inputs should be set to 'average'. The others will set the range of which inputs are averaged.
IMPORTANT NOTE: The sound.a, sound.f1a, and sound.f2a inputs are not recommended for determining distance.
Sound
The channel sound.d is not entirely realistic but was included largely because our own hearing provides us with some
information concerning the distance of sound sources. The relative orientation channels (sound.o sound.ox and sound.
oy) were included for convenience only.
The sound.d channel is mapped to world values in the same exponential scale as vision.z using the following formula.
d = exp(-z_factor * distance)
This maps distant sounds to 0 and close sounds to 1. So it might help to think of sound.d as closeness.
SOUND OUTPUT
You can actually output the agents' sounds through your speaker as well. In order to do this, open the Sound Output
dialog by selecting Options->sound output through the main menu.
Terrain
TERRAIN
A terrain model can be loaded from the load terrain dialog available from the File menu or from the command line.
The filename will be saved in the setup file. Terrain models are polygonal Wavefront .obj files. They do not need to be
a single continuous mesh. If texture coordinates are present they will be used for mapping terrain texures.
TERRAIN MAPS
Terrain texture maps can be loaded from the load terrain map dialog and are applied with an XZ orthographic
projection unless texture coordinates are present in the terrain model. Texture images should be in Tiff format.
The alpha channel is used for storing flow field data. If there is no flow field then the alpha channel can be used for
arbitrary data.
Terrain texture maps have no effect on what appears in the render.
TERRAIN SHADERS
Shaders can be assigned to terrain using a dialog similar to the one for assigning shaders to a material node.
This dialog is available from the main menu, through [ Terrain -> RenderMan shader ]. Displacement shaders can be
assigned through [ Terrain -> RenderMan displacement ].
TERRAIN CHANNELS
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/terrain.html (1 of 2) [13/05/2007 01:39:22]
Terrain
There are several object and segment channels which can be used in input nodes to get local information
about the terrain.
ground
ground.dx
ground.dz
ground.r
ground.g
ground.b
ground.a
ground.flow
ground.r.dx
ground.g.dx
ground.b.dx
ground.r.dz
ground.g.dz
ground.b.dz
Ground channels work for agents and segments whereas the ground colour, flow, and colour gradient
channels only work for agents.
eg:
ground.r.dxl_foot:ground
Variables
VARIABLES
Variables are used to store data, usually a number. Some variables, such as time, are predefined variables and are
set by the program. Brain variables are set in output nodes in the brain. Agent variables are used for variation when
making instanced agents (see Placement) and are created in the variables tab of the agent node in the body page.
Predefined variables, brain variables and agent variables can all be referenced in input nodes, whether alone or in
expressions.
Predefined variables
The values of these variables are set by the program:
variable
description
time
id
input
keyboard
The ascii value of a key that was pressed. The value is zero if no key has been
pressed. A keypress gives a value for one frame.
Brain Variables
When an output node sends a value to a channel that does not exist then a brain variable is created to store the
value. This variable is then available for use in input nodes. Brain variables are floating point so they can be
fractional and can vary from very large negative numbers to very large positive numbers. The value of a brain variable
is undefined after reset and will be reported as 0 if referenced in an input node on the first frame.
Brain variable names can be any string that does not start with a number, does not include a space, and does not
match an existing channel or variable name.
Agent Variables
Agent variables are used by the program when creating instanced agents. They are stored in the CDL files as part of
the agent.
Variables
They can be assigned a default value and a range over which they can vary.
They can be assigned an expression which may refer to another variable. (Note, if this is the case, the variable
to which the expression refers must appear before the current variable in the list. This is in order to prevent
circular references.)
When locators are generated (see Placement) the agent variables are given values for each locator. Then when
agents are instanced at the locators the instanced agents receive the variables from the locators. These agent
variables may be used to provide variation in the segments, geometry, cloth, shaders, textures and behaviour of the
agents.
Agent variables are created and edited in the body page. Click on the background to access agent parameters such
as agent variables.
Agent variable names, like brain variables, can be any string that does not start with a number, does not include a
space, and does not match an existing channel or variable name.
Vision
VISION
Vision is implemented as a scanline render that is processed by fuzzy rules. Colours can vary continuously between
white, red, yellow, green, cyan, blue, magenta and black. The vision is rendered every frame for each agent that has
any references to vision channels and does not have vision.active set to zero. The point of view is the origin of the
segment referred to in the vision channels. The line of sight is the +ve z axis of the segment.
The vision information is available to the fuzzy network through 5 input channels:
channel
description
min
max
vision.x
-1
vision.y
-1
vision.z
distance
vision.h
hue or colour
vision.i
-1
vision.active
Vision
activate only if a single target was seen both near and to the left. If the agent saw only a target near but not left, and at
the same time saw another left but not near, the rule would not activate.
IMPORTANT NOTE: Vision rules only work properly when the connections are: input -> fuzz -> AND ->. Connecting
a vision fuzz node directly to a defuzz node will not work properly. Connecting vision rules as the input to ordinary
rules works fine.
In most cases the fuzzy zones should be defined using vision.x and vision.y. This causes the sense of direction to be
aligned with the object z axis. To implement eye tracking (or head tracking) use the vision.i (image space x) channel
instead of the vision.x channel.
Any number of rules can be used with vision channels, and non-vision channels can be combined with vision
channels.
The colour values are as follows:
0.0
white
0.1
red
0.2
yellow
0.3
green
0.4
cyan
0.5
blue
0.6
magenta
0.7
red
0.8
black
The vision.z channel is mapped to world values in the same exponential scale as sound.d using the following formula.
z = exp(-z_factor * distance)
This maps distant pixels to 0 and close pixels to 1, as if distance was related to intensity of a depth image. The
z_factor variable is stored in CDL files.
Wind
WIND
Wind in Massive affects dynamics and the local wind values can be read in input nodes in the brain. The wind defines
the speed and direction of the atmosphere at any point in the world and therefore affects the drag forces that are
exerted on any dynamic segments. The wind can be visualized by switching on Wind under the View menu.
This specifies the amplitude of the noise which produces variation in the wind.
Wind
This specifies the frequency) of the noise which produces the variation.
-aa
switch on antialiasing.
-act file
-alf
-amc file
-amcrate n
-apf
-bg r g b
-bgpic file
-bind file
-blur samples
-bones file
-brains
-bvh file
-call file
-camN file
-collide
-compare file
-cm
set units to cm
-fps
-g file
-geo
-geometry [W][xH][+X][+Y]
-grid
-gui
-h
-iapf path
-iapfz path
-icloth file
-inch
-isim path
See -iamc
-iamc path
-iamcz path
-loops
-m
-n first-last
-net g
-o file
-obj file
-oapf path
-oapfz path
-ocall file
-ocloth file
-old_numbers
-orib path
-osim path
See -oamc
-oamc path
-oamcz path
-opics pattern
-place
-posfile file
-quiet
-res x y
-s selection
-shadow
-shadow_colour r g b
-shutter x
-sim start-end
frame range for sim I/O, also causes auto execution of sim.
-single
-standin
-terrain file
-time
-v
-z min max
Keyboard Shortcuts
KEYBOARD SHORTCUTS
Esc
Tab
Left arrow
Right arrow
Up arrow
Down arrow
Page up
Page down
Delete
Spacebar
Keyboard Shortcuts
reset
toggle shade
S toggle shadows
u undo (only for action editor)
U redo (for action editor)
v
Importing Motion
PYTHON SCRIPTING
Python scripting through the Massive textport allows the user to access many functions of Massive with customized
scripts. The textport is accessed from the main menu, through [ Options -> textport ].
SETUP
Two versions of Python are supported with Massive, Python 1.5 and Python 2.2.
Python 1.5 is selected by default when starting Massive. To change to the Python 2.2 scripting implementation, from
the textport enter:
#!pyscript22
To return to Python 1.5, type:
#!pyscript15
You will need to have Python installed in 'the usual place'. This is off /usr in a standard Redhat distribution. If this is not
the case then the PYTHONHOME environment variable must be set (you will get a warning on stdout when you start
Massive if this is the case):
export PYTHONHOME=/usr
Where '/usr' is where the base of the Python installation is.
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/python.html (1 of 15) [13/05/2007 01:39:35]
Importing Motion
GENERAL
Single line scripting commands are evaluated as soon as 'enter' is pressed. Entering:
>print 1+2
results in:
3
Multiple lines must follow the correct Python indenting rules. The heuristic that decides whether something is 'multiple line'
is if it starts with one of these keywords: for, if, while, class or def. A multiple line statement ends when 'enter' is pressed
on an empty line.
The following multiple line statement:
>class Blah:
. def write(self, message):
. massive.text_port_out(message)
.
creates a class that can be called in a following statement:
>Blah().write("test\n")
which results in the output:
test
Note the 'dot' character is the prompt for multiline statements.
To run a script from a file, use this command in the textport:
execfile("make_ik.py")
where "make_ik.py" would be the name of your script file.
Importing Motion
The following functions, constants, methods, and attributes in Massive are accessible through Python scripting and can
be called in your script.
GLOBAL FUNCTIONS
All global functions are in fact located under a 'massive' namespace but all items in this namespace are loaded
automatically so you don't need to prefix things with 'massive'. The following is a list of the global functions available:
FUNCTION
DESCRIPTION
text_port_out(text)
Output text to the text port. This is unlikely to be used as all standard output goes to
the textport anyway (which is implemented using text_port_out):
>text_port_out("Hello Massive!\n")
Hello Massive!
reset_all()
Resets the simulation, same as Run -> reset in the main menu, or the alt-r shortcut.
>reset_all()
find_agent(name)
Find and return the agent with the given name. If no agent with that name exists,
returns 'None'.
>print find_agent("man")
Agent{man}
get_agents()
Massive stores agents as a linked list. This function returns the first agent in that list.
>print get_agents()
Agent{man}
Importing Motion
find_group(name)
Find and return the group with the given name. If no group with that name exists,
returns 'None'.
>print find_group("test")
Group{test}
quit()
Exits Massive.
>quit()
redraw_view()
next_frame(integer)
Advances to the next frame. The argument indicates whether or not there is a forced
wait (1: so the simulation runs no faster than real time) or no wait (0: the simulation will
run as fast as Massive can perform the calculations).
>next_frame(1)
str_to_order(string)
noise1(float)
Applies a one-dimensional noise function to a float and returns the result as a float.
>print noise1(0.5)
-0.1396484375
noise2(float,float)
Applies a two-dimensional noise function to two floats and returns the result as a float.
>print noise2(0.5,0.5)
-0.0204986333847
Importing Motion
noise3(float,float,float)
Applies a three-dimensional noise function to three floats and returns the result as a
float.
>print noise2(0.5,0.5,0.5)
0.129479967058
abs(float)
cos(float)
sin(float)
tan(float)
sqrt(float)
min(float,float)
max(float,float)
set_action_agent_chans(integer)
Sets whether transition and/or latch curves are created upon creating agent curves.
>set_action_agent_chans(TRANS_CHANNEL | LATCH_CHANNEL)
(both transition and latch curves will be created)
>set_action_agent_chans(TRANS_CHANNEL)
(only transition curves will be created)
Importing Motion
get_ik_hold_d()
Returns the value of the "speed" threshhold when editing IK hold curves in the IK tab.
>print get_ik_hold_d()
-1.0
set_ik_hold_d(float)
Sets the value of the "speed" threshhold when editing IK hold curves in the IK tab.
>set_ik_hold_d(-0.5)
>print get_ik_hold_d()
-0.5
get_ik_hold_y()
Returns the value of the "height" threshhold when editing IK hold curves in the IK tab.
>print get_ik_hold_y()
0
set_ik_hold_y(integer)
Sets the value of the "height" threshhold when editing IK hold curves in the IK tab.
>set_ik_hold_y(1)
>print get_ik_hold_y()
1
get_ik_hold_soft()
Returns the value of the "IK hold off time" in the IK tab.
>print get_ik_hold_soft()
0.2
set_ik_hold_soft(float)
Sets the value of the "IK hold off time" in the IK tab).
>set_ik_hold_soft(0.3)
>print get_ik_hold_soft()
0.3
GLOBAL CONSTANTS
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/python.html (6 of 15) [13/05/2007 01:39:35]
Importing Motion
Importing Motion
OBJECTS
Agents, segments, actions, curves, groups, and locators are all objects in Massive accessible through Python scripting.
They have a number of attributes and member functions. Attributes can be set and get using normal Python syntax:
>a = find_agent("man")
>print a.name
man
>a.name = "test"
>print a.name
test
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/python.html (8 of 15) [13/05/2007 01:39:35]
Importing Motion
>a.colour=0.5
>print a.colour
0.5
AGENT ATTRIBUTES
attribute type
description
readable/writeable
colour
float
agent colour
read/write
name
string
agent name
read/write
read
actions
Action
read
next
Agent
read
prev
Agent
read
rest
Matrix
read/write
tm
Matrix
read/write
AGENT METHODS
METHOD
DESCRIPTION
load_amc(string)
Importing Motion
find_action(string)
create_agent_curves(action)
find_segment(name)
Finds the segment with the given name. If no segment exists, returns None.
>print find_agent("man").find_segment("root")
Segment{root}
TERM
DEF
EXAMPLE
SEGMENT ATTRIBUTES
attribute type
description
readable/writeable
colour
float
segment colour
read/write
name
string
name of segment
read/write
density
float
read
mass
float
read/write
type
integer
read/write
Importing Motion
primitive
integer
read/write
axis
integer
read/write
length
float
read/write
radius
float
read/write
lx
float
read/write
ly
float
read/write
lz
float
read/write
cx
float
read/write
cy
float
read/write
cz
float
read/write
tx
float
read/write
ty
float
read/write
tz
float
read/write
rx
float
read/write
ry
float
read/write
rz
float
read/write
dof
integer
read/write
long
read/write
Importing Motion
parent
read
sibling
read
child
read
next
read
prev
read
rest
Matrix
read/write
tm
Matrix
read/write
SEGMENT METHODS
None.
ACTION ATTRIBUTES
attribute
type
description
readable/writeable
name
string
agent name
read/write
select
integer
read/write
next
Action
read
prev
Action
read
curves
Curve
read
ACTION METHODS
METHOD
DESCRIPTION
Importing Motion
create_rc_curves(segment)
create_ik_curves(segment)
create_hold_curve(segment)
delete_curve(Curve)
convert_rotation_order(segment, from_integer,
to_integer)
CURVE ATTRIBUTES
attribute
type
description
readable/writeable
Importing Motion
channel
string
read/write
next
Curve
read
prev
Curve
read
select
integer
read/write
CURVE METHODS
None.
GROUP ATTRIBUTES
attribute type
description
readable/writeable
name
string
group name
read/write
cdl
string
read/write
cre
integer -
read/write
read
locators
read
agent
Agent
read
select
read/write
GROUP METHODS
METHOD
DESCRIPTION
add_locator()
Importing Motion
LOCATOR ATTRIBUTES
attribute
type
description
readable/writeable
px
float
position in x
read/write
py
float
position in y
read/write
px
float
position in z
read/write
rx
float
rotation in x
read/write
ry
float
rotation in y
read/write
rz
float
rotation in z
read/write
process
integer
read/write
agent
Agent
read
group
Group
read
select
integer
read/write
lock
integer
read/write
LOCATOR METHODS
METHOD
DESCRIPTION
create_instance()
Camera Files
CAMERA FILES
Camera files can be loaded into a camera from the scene page, or specified on the comand line. For example the
following line would load a camera file into camera 1:
fov
transform
filmback
A Massive camera file contains at least one transformation matrix and optional fov and frame numbers.
The filmback is also optional and can only occur once per camera file. The default filmback is 35mm full gate (24.892
x 18.669 mm).
eg:
filmback 24.892 18.669
frame 1
#focal length 35
fov 29.97002051
transform
0.7071067812 -0.3312945782 0.6246950476 0
-2.775557562e-17 0.8834522086 0.4685212857 0
-0.7071067812 -0.3312945782 0.6246950476 0
3560.565558 -2127.414591 3464.230949 1
frame 2
#focal length 35
fov 29.97002051
transform
0.7071067812 -0.3312945782 0.6246950476 0
-2.775557562e-17 0.8834522086 0.4685212857 0
-0.7071067812 -0.3312945782 0.6246950476 0
3560.565558 -2127.414591 3464.230949 1
frame 3
#focal length 35
fov 29.97002051
transform
0.7071067812 -0.3312945782 0.6246950476 0
-2.775557562e-17 0.8834522086 0.4685212857 0
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/camera_file.html (1 of 2) [13/05/2007 01:39:37]
Camera Files
The white space characters are optional and anything starting with a '#' is considered to be a comment.
Massive also reads and writes Weta camera files. This format is auto-detected by the use of the ".wcam" suffix.
CDL Files
CDL FILES
Cdl files are ASCII decriptions of an object (also referred to as an agent). See CDL Statement Reference . An object
in a cdl file has at least one physical segment and any number of fuzzy nodes. Cdl files can be thought of as
consisting of various types of blocks:
world
object
segment
dynamics
fuzzy
action
There are also spring, cloth, material, geometry and option blocks which are not yet detailed in this page.
Before any "object" statement is encountered, the current block is the world block. After an "end object" statement the
world block is resumed. When a "segment" statement is encountered the segment block starts and continues until the
next "segment", "fuzzy" or "action" block. When a "fuzzy" statement is encountered the fuzzy block starts and
continues until the next "segment", "fuzzy" or "action" block.
"dynamics" blocks can appear inside world, object or segment blocks. They can contain any combination of dynamics
attributes in any context. Dynamics attributes are inherited from higher contexts.
When an "action" statement is encountered the action block starts and continues until the next "segment", "fuzzy" or
"action" block. Action blocks are further subdivided into curves. An "end object" statement ends all blocks except the
world block. Any statements in the world block are considered "global".
Translations, rotations, scales and transform matrices can appear in object and segment blocks. These
transformations decribe the object's rest or reset position.
Objects
The object statment has one arguement which is the name of the object. Here is a list of statements that can appear
in the object block:
colour
angles
collisions
instance action
instance material
translate
rotate
scale
transform
CDL Files
Segments
Each segment has a name, density, a coordinate space and a solid geometric primitive which can be any of the
following types:
box
tube
sphere
line
billboard
The box primitive is a rectangular solid decribed by 3 dimensions. Boxes are always aligned with the coordinate axes
of the segment space and can be offset from the centre.
example 2:
segment head
parent head
density 1.0000
primitive box
size
0.3000 0.5000 0.3000
centre 0.0000 0.0000 0.0000
The tube primitve is a round capped cylinder described by length (excluding caps), radius and axis. Tubes may be
rotated with respect to the segment coordinate space.
example 3:
segment neck
parent chest
density
1.0000
primitive tube
thickness 0.1000
length
0.1500
axis
Y
centre
0.0000 0.0750 0.0000
bone_rotate 10.0000 0.0000 0.0000
The sphere primitive is described by it's radius and centre relative to the segment coordinate space.
example 4:
segment hips
parent root
density
1.0000
primitive sphere
radius
0.5
centre
0.0000 0.0400 -0.0300
The line and billboard primitive are provided mainly for use in vision renders. When large numbers of objects appear
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/cdl.html (2 of 4) [13/05/2007 01:39:39]
CDL Files
Dynamics
The dynamics attributes are used to specify rigid body dynamic simulation properties.
example 5:
dynamics
angle spring 5.0
angle dampen 0.5
angle friction .1
collision spring 12000
collision friction 30
collision dampen 200
gravity 9.8
steps 1000
end dynamics
Actions
Actions can be embedded in CDL files.
example 6:
action walk
id 1
rate 1.04335
curve
channel root:tx
type linear
3 points
0.00000
0.00000
0.50000
-0.180671
1.00000
1.617143
curve
channel root:ty
type linear
4 points
0.00000
0.00000
0.33333
0.298071
0.66666
0.63786
1.00000
1.476542
The include statement can be used to include action files:
include ACT/walk.act
Binary action files load much more quickly. Here is the syntax to load a binary action file from a CDL:
action_binary ACT/walk.actb
Only one action_binary statement should be used for each agent.
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/cdl.html (3 of 4) [13/05/2007 01:39:39]
CDL Files
This page does not yet include details of the following data types: spring, cloth, geometry, material and option.
threshold 0.000
standin WHITE2
parent WHITE
primitive line
length 1.7000
axis
Y
centre 0.00000 -0.3000 0.0000
threshold 10.0000
threshold d
Specifies the threshold distance for a standin.
transform
m00 m01 m02 m03
m10 m11 m12 m13
m20 m21 m22 m23
m30 m31 m32 m33
Loads the matrix m into the segment rest matrix. Ignores any previous transformations to the rest matrix.
translate x y z
Specifies a translation of segment rest space.
n input(s) id...
Attaches n inputs to the current node identified by a list of n numbers.
name name
http://outranet.scm.tees.ac.uk:8002/Resources/docs/massive/manual/cdl_ref.html (3 of 5) [13/05/2007 01:39:41]
stabilize
No longer meaningful.
steps
Specifies number of dynamics steps per second. Only relevant within world or object blocks