The Character Animation FAQ =========================== Version 1.6 6th August 1998 ---------------------------- This FAQ is maintained by "hexapod@netcom.com". Any additional suggestions or related questions are welcome. Just send E-mail to the above address. The latest copy of this FAQ can be found at the following web page: ftp://ftp.netcom.com/pub/he/hexapod/index.html http://www.glue.umd.edu/~rsrodger Feel free to distribute or copy this FAQ as you please. Questions --------- CHARACTER ANIMATION =================== INTRODUCTION ------------ Q1. What is character animation? Q2. What are skeletons? Q3. What are chains and anchors? JOINTS ------ Q4. What are joints? Q5. What are revolute joints? Q6. What are prismatic joints? Q7. What are helical joints? Q8. What are cylindrical joints? Q9. What are spherical joints? Q10. What are planar joints? SKELETONS --------- Q11. How do I define a skeleton? Q12. How do I move a skeleton? Q13. How do I constrain a skeleton? Q14. How do I evaluate a skeleton? KEYFRAMING ---------- Q15. What are keyframes? Q16. What is keyframe animation? Q17. What is keyframe Interpolation? Q18. What is motion capture? Q19. What are state machines? DIGITAL SKIN ------------ Q20. What is digital skin? Q21. How do I define digital skin? Q22. How do I evaluate digital skin? Q23. How do I render digital skin? INVERSE KINEMATICS ------------------ Q24. What are expressions? Q25. What are inverse kinematics? Q26. How do I implement an IK system? RENDERING --------- Q27. How do I render a skeleton as a set of lines? Q28. How do I render a skeleton as a set of tetrahedrons? Q29. How do I render a skeleton as a texture-mapped model? COLLISION DETECTION ------------------- Q30. How do I perform collision detection? Q31. How do I perform intersection tests between coordinates and a plane? Q32. How do I perform intersection tests between a line and a sphere? Q33. How do I perform intersection tests between two spheres? PARTICLE SYSTEMS ---------------- Q34. What are Flocks and Swarms ? Q35. What is Facial Animation? Q36. What is a good 3D mathematics library to build? BIBLIOGRAPHY ------------ B1. Bibliography Answers ------- CHARACTER ANIMATION =================== Introduction ------------ Q1. What is Character Animation? --------------------------------- Character animation can be defined as the expression of emotion or behaviour of a live or inanimate object through the use of motion. A good guide to the artistic side of this topic is the book titled "Disney's - The Art of Animation". There are ten main ways of giving a character expressive behaviour. These can be summarised briefly as follows: o Squash and Stretch The change in shape of a character when a part of its body moves eg. head stretching and squashing as a character eats some food. Or a character's stomach enlarging and shrinking as he pants after running. o Anticipation The positioning of a character before he performs an act eg. making his hand reach the sky before digging into his pocket. o Staging Positioning of the camera, so that the viewer can see what the character is doing. This may also include selecting the correct background scenery in order to get the message across eg. Standing in front of a hot-dog stand while eating a hot-dog which flies across the screen when bitten. o Straight Ahead Action and Pose to Pose Straight Ahead Action simply involves running one animation sequence after another without any pre-planning of animation sequences. Pose to Pose is exactly the opposite. All the animation sequences are planned ahead of time. This allows the camera positions to be planned so that everything is in proportion. o Follow Through and Overlapping Action This involves parts of a character to continue moving from a previous animation sequence while the character starts a new sequence. eg. A character comes to a sudden stop, while his coat-tails continue moving forward. o Slow In and Slow Out Accelarating and deaccelarating the motion of a character between animation sequences. o Arcs Modelling the motion of every part of a character's body as he moves. eg. Making the head bob up and down as the character walks along o Secondary Action Adding other smaller movements to emphasise any animation sequence eg. A character shaking his head after being hit by a falling object. o Timing The number of frames required to complete a single animation sequence. o Exaggeration Making the motion of a character more dramatic o Solid Drawing Making a character appear solid and 3-dimensional. Avoiding "twinning" where two limbs of a character will have mirror symmetry. o Appeal Making a character attract the viewers attention. This includes getting the colors right, avoiding clumsy shapes, awkward motion, and distorting the shape of the character. Other attributes can include the behaviour of the character and the manner in which he/she speaks. Q2. What are Skeletons? ------------------------ To represent the motion of a living creature such as a human, animal or arthropod (insect), it is convenient to store the relationships between each movable part of the creature eg. Head is attached to the neck, left foot is attached to the lower left leg and so on. Taking a cue from biology, each movable part is referred to as a bone, the attachments between each bone are called joints and the entire collection of bones is referred to as a skeleton. The connections between individual bones are referred to as "joints". For example, a basic mammal (without fingers or toes) would take around 20 bones: +-----------------------------------------------------------+ | | | o | | | Head | | Right.shoulder | Left.shoulder | | o-------o-------o | | Right.upperarm | |Upper- | Left.upperarm | | | |back | | | o | o | | Right.lowerarm | | | Left.lowerarm | | | oLower- | | | o |back o | | Right.hand | | | Left.hand | | | | | Right.butt | Left.butt | | o--o--o | | | | | | | | | | Right.upperleg | | Left.upperleg | | | | | | o o | | | | | | | | | | Right.lowerleg | | Left.lowerleg | | o o | | Right.foot / / Left.foot | | | | | +-----------------------------------------------------------+ A hand might be represented with 16 bones as follows: +----------------------------------------------------------------+ | thumbend | | o---- | | / | | thumbbase / o---o---o---- ringbase ringmid ringend | | / | | | / o----o----o---- indexbase indexmid indexend | | o-------o-------o | | lowerarm palm o---o---o--- midbase midmid midend | | | | | o--o--o--- littlebase littlemid littleend | | | | | +----------------------------------------------------------------+ For an anatomically correct skeleton of a human, over 300 bones would be required. Q3. What are Chains and Anchors? --------------------------------- "Chains" are a more generic name for skeletons. The latter term really only makes sense when applied to living creatures. Other applications for inverse kinematics include simulating flexible objects such as ropes, string and ship anchor chains. Each of these objects can be modelled using a set of single "bones" or links. Taking a cue from nautical terms, the "anchor" or "anchor point" is one end of the chain which always has a fixed or known position - much like a ships anchor limits the positions that a ship can be in. +-------------------------+ | | | +----+ | | | | | | o---+----+----o | | \ O/ | | +| | | | o---------o| link1 | | o | | | | | | link2 | | o | | | | | | link3 | | @ | | Anchor | | | +-------------------------+ For animation purposes, each part of the chain has a single object attached to it ie. a chain link. JOINTS ------ Q4. What are joints? --------------------- In the field of robotics (or cybernetics), six basic types of joint have been defined. These can be summarised as follows: +--------------------+--------+-----+ | Name | Symbol | DOF | +--------------------+--------+-----+ | | | | | Revolute joints | R | 1 | +--------------------+--------+-----+ | | | | | Prismatic joints | P | 1 | +--------------------+--------+-----+ | | | | | Helical joints | - | 1 | +--------------------+--------+-----+ | | ~~ | | | Cylindrical joints | RP RP | 2 | +--------------------+--------+-----+ | | | | | Spherical joints | 3R RRR | 3 | +--------------------+--------+-----+ | | | | | Planar joints | RRP | 3 | +--------------------+--------+-----+ In the field of character animation, only three types of joint need to be considered. These are the "revolute" and "prismatic" joints. All other types can be based on these two. The symbols "R" annd P" are used when describing combined rotation and prismatic joints. The number of symbols liked together indicates the number of degrees of freedom. Q5. What are revolute joints? ------------------------------ Revolute joints are the most commonly used joint. The term "revolute" comes from the fact that the endpoint of one bone rotates around the endpoint of another. Revolute joints are represented by the symbol R. Because revolute joints only rotate in a single axis, they only have one degree of freedom. Three types of "revolute" joint exist: +----------+ +----------+ +--------------+ |R1 | |R2 a | |R3 a | | | | . | | . | | | | . | | . | | @ | | @ | | . | | |B | | |B | | . | | | | | | | | . | | | | | | | | . B | | ...o...a | | o | | o----@ | | | | | | | | | | | | | | | | | | | | |A | | |A | | |A | | | | | | | | | | | ---O--- | | ---O--- | | ---O--- | | | | | | | +----------+ +----------+ +--------------+ R1 is the simplest of the three types - it is most comonly known as the "simple hinge". Bone B rotates in an axis perpendicular to both bone A. The far endpoint of bone B rotates in a circle centred on the endpoint of bone B. Examples in nature include the human knee and elbow joints. R2 differs from R1 in that the rotation axis is parallel to both bones B and A. The far endpoint of bone B cannot change location but can rotate in place. Examples in nature include the human wrist. R3 is a variation on R2. While the rotation axis remains the same, bone B has been repositioned so that it is perpendicular to bone A. This allows for the far endpoint of bone B to rotate in a circle around the endpoint of bone A. Q6. What are prismatic joints? ------------------------------- Prismatic joints are joint in which the motion of the bone is purely translational. The name "prismatic" is derived from the implementation of such joints in industry by using triangular bars (prisms) sliding into a matching holder. Prismatic joints are represented by the symbol P. Because prismatic joints are constrained to move in a single axis, only one degree of freedom exists. +-----------+ |P . | | . | | . | | @ | | | | | |B | | | | | +|+ | | ||| | | |o| | | |.| | | |.| | | |.|A | | o-o | | | +-----------+ Q7. What are helical joints? ----------------------------- Helical joints combine a rotation motion with a matching translation. The main industrial application is in the drive systems for lathes and clamps. As bone A rotates, bone B experiences a translational movement parallel to axis of bone A. Because the amount of translation is directly related to the amount of rotation, only one degree of freedom exists. As a consequence, helical joints are rarely used in the field of robotics. +-----------+ |H1 | | | | | | @ | | /A | | \ | | / | | \ B | | /o----@ | | \ | | / | | \ | | / | | \ | | o | | | +-----------+ Q8. What are cylindrical joints? --------------------------------- Cylindrical joints combine an coaxial rotation (R3) along with a translational movement. Since both movements are independent of each other, two degrees of freedom exist. Because cylindrical joints are a combination of rotation (R) and translation (P), they are represented by the symbol RP. ~~ If both movements share the same axis, then the symbol RP is used. The two types of cylindrical joint are as follows: +-----------+ +-----------+ | | |~~ | |RP . | |RP | | . | | @.@ | | . | | |.| | | o | | |o| | | | | | |||B | | | | | ||| | | ||| B | | ||| | | ||o----@ | | ||| | | ||| | | ||| | | | | | o|o | | A| | | | | | | | | A| | | o | | o | | . | | . | | . | | . | | . | | . | | | | | +-----------+ +-----------+ Q9. What are spherical joints? ------------------------------- Spherical joints implement the "ball-and-socket" concept of a joint, where a ball is free to rotate in any direction while being held by a socket. Since the only way to prevent the ball from popping out of the socket is to use a volume slightly larger than a hemisphere, this restricts motion in two axii to less than 180 degrees. However, the remaining third axis which is parallel to bone B is free to move about unrestricted. Because it is practically impossible to drive "ball-and-socket" mechanisms in the real world, spherical motion is usually implemented through the use of three revolute joints. ~~~ Thus, a spherical joint is represented by the symbol 3R or RRR +------------+ |RRR | | | | ... | | . . | | o . | | . \B . | | . \ . | | . @ . | | . | . | | . | . | | .|. | | | | | A| | | | | | o | | | +------------+ Q10. What are planar joints? ---------------------------- Planar joints combine prismatic motion in two axii, along with rotation in the axis perpendicular to the other two planes. This can be visualised as the motion of a book held flat against a desk. Thus, planar joints can be represented by the symbols RRP, RPR or PRR. +------------+ |PRR | | . | | . | | . | | . | | +---+ | | | | | | ..| |.. | | | | | | +---+ | | . | | . | | . | | | +------------+ SKELETONS ========= Q11. How do I define a skeleton? -------------------------------- A skeleton can be defined as an array of bones. Each bone is defined in terms of a length, a default direction vector, a name and the name of the parent. The parent of a bone is the bone which is attached to that bone and will cause that bone to move if it moves. eg. If you turn your neck, your head will also turn. If you bend your back, your neck and head will also both move forwards. The only bone which does not have a parent is the root node. It is not really a bone in a physical sense but rather it is used as a convenient way of moving the entire skeleton with a single translation or rotation. So, for the example above, the list would be as follows: Bone Parent Length Direction --------------------------------------------------------- Root --- - - - - Head Upperback 3 0 1 0 Upperback Lowerback 5 0 1 0 Lowerback Root 5 0 1 0 Left.shoulder Upperback 8 1 0 0 Left.upperarm Right.shoulder 3 0 -1 0 Left.lowerarm Right.upperarm 3 0 -1 0 Left.hand Right.lowerarm 2 0 -1 0 Right.shoulder Upperback 8 -1 0 0 Right.upperarm Right.shoulder 3 0 -1 0 Right.lowerarm Right.upperarm 3 0 -1 0 Right.hand Right.lowerarm 2 0 -1 0 Left.butt Root 3 1 0 0 Left.upperleg Left.butt 5 1 0 0 Left.lowerleg Left.upperleg 4 1 0 0 Left.foot Left.lowerleg 2 0 0 1 Right.butt Root 3 -1 0 0 Right.upperleg Right.butt 5 1 0 0 Right.lowerleg Right.upperleg 4 1 0 0 Right.foot Right.lowerleg 2 0 0 1 ------------------------------------------------------- Q12. How do I move a skeleton? ------------------------------ Since each bone has a direction vector and a length, it is possible to use rotation matrices to transform each bone to a new position. Generation of the rotation matrix can be performed by the mathematical concatenation the XYZ rotation matrices or by using quaternions. For most applications, translating the position of each bone will not be needed. However, for special effects such as a body being dismembered, translation operations can be used. Other uses may be for the barrel of a gun which can recoil after launching a round of ammunition. For other special effects such as pair of extra arms sprouting out of nowhere, it can be convenient to set the bone lengths to zero. The lengths can then be gradually incremented until they are at full length. This is one way of modelling the growth of a tree. Q13. How do I constrain a skeleton? ----------------------------------- With the skeleton defined above, there is no way of determining whether a particular configuration of joints rotations is valid or not. For example, the rotation data may have come from external input such as a trackball or motion capture sensors. In order to ensure that the skeleton is always in a valid position, constraints are placed onto the position of each joint. The simplest way to implement a constraint based system is to place maximum and minimum limits on each rotation and translation axis. For example you can twist your thigh sideways around +/- 45 degrees. For the model this would correspond to minimum/maximum rotations in the Y-axis. Since you cannot detach your leg without some difficulty, the constraints for translation are all zero. In this case, these would be defined as follows: #name rotation min max translation min max ------------------------------------------------------------------ Left.upperleg 0 -45 0 0 45 0 0 0 0 0 0 0 However, this method requires that the user has to consider and visualise the limits of rotation for each joint in the skeleton. A more sophisticated method is to classify each type of joint according to the type of motion expected. A considerable amount of research in this area has been performed in the field of robotics. Q14. How do I evaluate a skeleton? ---------------------------------- This is fairly easy to perform. Every bone has the following set of local information: Start-point - The end attached to the parent End-point - The end where children are attached Relative matrix - Matrix generated from local rotation/translation values Absolute matrix - Matrix generated from local matrix and parent matrix The first stage performed is to evaluate the root node. This will involve setting the start-point, end-point and the "relative" (R) matrix. Since this is the root node, the "absolute" (A) matrix is identical to this. The second stage involves the generation of the A-matrix for each bone in the model. For each bone in the model, the following steps are performed: [1] The parent bone is determined. Only if this bone has already been evaluated, can the following steps can be performed. The ID of the parent bone can be represented either by a name-tag or by an index value. [2] The end-point of the parent bone is used as the start-point of the current bone. [3] The R-matrix is calculated (if this has not already been done). [4] The R-matrix is combined with the parent's A-matrix to generate a new A-matrix. [5] The direction vector is combined with the A-matrix to determine the current orientation of the bone. [6] The current orientation of the bone is added to the start-point in order to generate the end-point. This process is repeated until all bones have been evaluated. Once every bone in the skeleton has been evaluated, the next stage is to transform all geometry (polygons, lines, particle systems etc...) associated with each bone. For each piece of geometry, the associated bone is identified, and the following steps are performed: For each piece of geometry, the A-matrix is used to rotate the coordinates then they are translated by the start-point of the bone. KEYFRAMING ========== Q15. What are keyframes? ------------------------ As mentioned above, each bone in a skeleton can be assigned a particular orientation. In order to represent a particular pose (eg. a single frame in a walk cycle), it is necessary to store the rotation/translation values for every bone. There are several ways of specifying the keyframe data. One way is to store the rotations and translations as vectors eg. #rotate Left.upperleg 0 10 0 #translate Left.upperleg 0 0.3 0 #length Left.upperleg 3 This method saves space, however it requires the rotation matrix to be calculated every time, plus a translation operation. Another way is to evaluate and combine the rotation and translation operations into a single 4x4 matrix. #matrix Left.upperleg 1 0 0 0 0 1 0 0.3 0 0 0 0 0 0 0 1 This method avoids having to calculate the rotation matrix every time, but it does require the storage of sixteen data values instead of six. Q16. What is keyframe animation? -------------------------------- In a method similar to pencil drawn flip-books, keyframe animation gives the appearance of motion through the continuous presentation of different positions of a character. For example, a simple walk cycle may require 8 keyframes. The first four frames will have the left leg and right arm swinging forward and backwards to rest, then the last four frames will be when the right leg and left arm swing forward, and the cycle will continue from the beginning again. Q17. What is keyframe interpolation? ------------------------------------ Unless there are a large number of keyframes, any motion using keyframe animation will appear jerky. For example, assuming a screen is being updated at 60 frames/second and a character takes 1 second to complete one walk cycle, then this animation will require 60 frames of animation. However, there may not be memory space for 60 frames of animation (especially for game console systems), so that only 30 or even 15 frames can be stored. The solution to this problem is to perform keyframe interpolation. As the name suggests, keyframe interpolation attempts to generate new frames by interpolating values between two existing frames. To implement this, each keyframe must store the XYZ rotations and translations of every bone, regardless of whether it has moved or not. The simplest method of interpolation is "linear interpolation". Here, the individual values of two frames are combined using a weighting function ie. Pnew = Pold[frame] * (1.0-frac) + Pold[frame+1] * frac; where Pnew is the new value, Pold[frame] is the position for the current frame, Pold[frame+1] is the position for the next frame, and frac is the fraction of time between the two frames This calculation would be performed for each field in the XYZ rotation, translation and scaling data. More complex motion paths can also be specified - for example, three or more frames can be used to implement B-spline interpolation. If the frames are not at consecutive intervals of time, Non-Uniform Rational B-splines can be used. Even more complex methods can use quaternions to interpolate between the actual R-matrices. Q18. What is motion capture? ---------------------------- There are two ways of generating keyframe data. One way is to get an animator, a suitable animation package, and get the animator to add the keyframe data to the model. For simple actions or for conveying action with exaggerated emotion, this is the most efficient way to go. However, for animation which requires a large amount of movement (say dancers on a stage), then motion capture can be used. There are two main methods of motion capture, magnetic and optical. In magnetic motion capture systems, a large coil magnet is placed at the centre of the stage, magnetic sensors are attached to the actor's body and readings are collected by the motion capture software to be converted into keyframe data. This method has the advantage of generating accurate data, however the disadvantages are that the actors are tethered by cables, are limited by the operating range of the magnetic coil. There is also the problem of callibrating and finding a non-metallic environment. Also, the data may require a large amount of signal processing in order to smooth out any any background noise that may appear (eg. A/C power transformers). In order for this type of motion capture to operate successfully, there must not be any metallic objects (eg. iron girders, power-cables, tables) within the operating range of the system. The most suitable environments are either aircraft hangers large warehouses or a farm field. In optical motion capture systems, a large number of reflective light markers are placed on the actor's body. Using the reflection of studio lights, a video camera will capture these reflections, pass the video data to a software package capable of converting the screen coordinates into three dimensional keyframe data. The advantage of this system is that actors are not tethered to any location, so long as they remain within visual range of the camera. The only disadvantage are that a user may have to callibrate the software in order to determine what exactly each point of light represents. Q19. What are state machines? ----------------------------- When used with character animation, state machines are a way of managing sequences of keyframe animation such that all animation remains smooth and continuous ie. there are no occasions where the character "jumps" from pose to pose. For example, a character in an adventure game may have the following actions modelled by keyframe animation: o Stationary (STAT) o Start to walk (STWK) o Come to stop (CSTP) o Walk (WALK) o Turn left (TLFT) o Turn right (TRGT) o Jump (JUMP) o Fly (FLY) o Land (LAND) o Crouch (CRCH) o Stand up (STUP) In this game, the character can only jump, turn left or right when walking. Also, the character can only fly after jumping and may only stand up after crouching. Landing is only possible after flying. During game development, without the use of state machines will lead to more and more code hacking in order to add new states (eg. run, fire, pick-up etc...) The solution is to use a state machine. First of all, all the possible states are drawn as boxes. Then these boxes are joined together by arrows which indicate the moves that are possibl. Each arrow defines a particular input event that occurs eg. control pad buttons pressed, monster-player collision etc... +----+ +------------<---------|CSTP|<--------------------+ | +----+ | | ^| | | | | +----+ +----+ +----+ | +->|STAT|---->-----+-->|STWK|-----+----->|WALK|->-+ | +----+ | +----+ ^ +----+ | | | | | ^ +----+ | | +----+ | +<-|TLFT|----<-----+ |--<---|TLFT|<--+ | +----+ | | +----+ | | v | | | +----+ | | +----+ | |<-|TRGT|----<-----+ +--<---|TRGT|<--+ | +----+ | +----+ | | | | | +----+ +----+ | +----+ +----+ +----+ | +--|STUP|<--|CRCH|<+-|LAND|<--|FLY |<----|JUMP|<--+ +----+ +----+ +----+ +----+ +----+ This information can then be converted into a state table. This defines the current states as a column and the events as a row. Each entry defines the new state given the current state and incoming event. ie. +-------+-------------------------------+----------------+ | | Input event | | |Current+---------+------+-------+------+ | |state | FORWARD | LEFT | RIGHT | STOP | | +-------+---------+------+-------+------+----------------+ | | | | | STAT | STWK TLFG TRGT STAT | | | STWK | WALK WALK WALK CSTP | | | WALK | WALK TLFG TRGT CSTP | | | CSTP | STAT STAT STAT STAT | | | TLFT | TLFT TLFT TLFT CSTP | New states | | TRGT | TRGT TLFT TRGY CSTP | | | JUMP | FLY FLY FLY FLY | | | FLY | LAND LAND LAND LAND | | | LAND | CRCH CRCH CRCH CRCH | | | CRCH | STUP STUP STUP STUP | | | STUP | STAT STAT STAT STAT | | +-------+-------------------------------+----------------+ An optional feature is to have an output action associated with each state change eg. scheduling an audio scream if a player is killed, a coin being collected if a player-object collision is detected. DIGITAL SKIN ============ Q20. What is digital skin? -------------------------- Until recently, most character animation has been performed using simple geometry primitives eg. boxes, cylinders, spheres or NURBS patches, each of which would contain their own unique list of polygons and vertices. In this simple polgon model of a head, neck and torso, it can be seen that the character's neck extends into both the head and torso. Using Gouraud or flat-polygon shading with Z-buffering or polygon sorting, this is acceptable, since whenever the head is moved, the head will always appear attached to both the head and torso. Using individual polygon parts +----------------------------------------------------+ | | | +-----+ | | | | Head | | | +-+ | /- Seams -\ | | +-|-|-+ | | | | | | Neck v v | | +-----|-|-----+ UpperArm Hand | | | | | |/---------\/--------\/----\ | | | +-+ /| /\ /\ \ | | | \| \/ \/ / | | | Torso |\---------/\--------/\----/ | | LowerArm | | | +----------------------------------------------------+ However, when texture-mapping is used, the textures on the neck will appear to sink into both the head and torso. Also, there is the problem of seams appearing between the different body parts whenever the character moves around. The solution is to use a technique known as digital skin. In the model above, each body part would be defined as a list of vertices and polygons. With digital skin, each body part still retains its own list of vertices. However, there is now a single global list of polygons. Polygons can now be defined which share vertices between different body parts (These are referred to as "glue" polygons. The following figure demonstrates this: +----------------------------------------------------+ | | | +-----+ Glue | | | | Head Polygons | | | | /- -\ | | +-+-+-+ | | | | | | Neck v v | | +-----+-+-----+ UpperArm Hand | | | +-+-------+--+------+--+----\ | | | | | | | | | \ | | | | | | | | | / | | | Torso +-+-------+--+------+--+----/ | | | |^ ^ ^ | | | | | | | Glue polygons | | | +----------------------------------------------------+ As the character moves a body part (say, twists an arm), then the "glue" polygons will stretch and contract between the two parts and give the appearance of skin. A more sophisticated use of digital skin is to make muscles appear to bulge whenever a joint is bent. Q21. How do I define Digital Skin? ---------------------------------- Models which use digital skin are still defined in terms of polygons and vertices. However, as mentioned before, there is only a single polygon list, rather than individual lists for each bone in the skeleton. Vertices are defined in terms of XYZ coordinates. Polygons are defined in terms of their vertices (typically vertex ID's) and any other data eg. texture vertex ID's, outward normals Q22. How do I evaluate Digital Skin? ------------------------------------ For most purposes, the only calculations required will be to calculate the new locations of each vertex based on the rotation matrix of the current bone. However, in order to implement more realistic effects such as bulging muscles, then it quite possible to use Expressions to determine the new position of a vertex. The method works as follows: [1] The rotation angle of the selected joint is read. [2] This value is translated using a cubic equation to determine the scale factor for the vertex. [3] This scale vactor is then used to adjust the position of the selected vertices. Q23. How do I render digital skin? ---------------------------------- The digital skin can be rendered as any other type of polygon surface, mesh or NURBS Patch, and so no special calculations are required. INVERSE KINEMATICS ================== Q24. What are Expressions? -------------------------- In many animation scenes, it is often required that one or more 3D models are synchronised in the way they move. For example, consider the animation of a car gearbox with 15 or more gears. Using keyframes, this would require the animator to calculate and specify the position of all 15 gears per frame. Apart from running the risk of getting some of the calculations wrong, this also wastes time and memory space. An alternative method is to use arithmetic expressions (or "expressions" for short) to evaluate the movement of each gear. This method requires that arithmetic relationships between two moving objects are defined. Arithmetic expressions can include variables, constant values (eg. PI), trigonometric functions (eg. sin cos tan sqrt log exp ...) In the following model, A and B are two gears, each with radius Ra and Rb. C is a rack which moves up and down according to B (similar to car steering). +------------------------------+ | | | A | | Y | | --- B | | | | | / \/-\|C| | | | | o ||o|| | | | | \ /\-/| | /---- X | | --- | | / | | / Z | | | Ra||Rb| | | | +------------------------------+ Gear A is rotating at 10 degrees/frame. Gear B intersects Gear A. So the expressions for this system would be: ----------------------------------------------------------- radius_a = 10 # Define constants radius_b = 8 pi = 3.14159265 gear_a.rotate_z = frameid # Get frame ID # Calculate position of gear B gear_b.rotate_z = -(radius_a / radius_b) * gear_a.rotate_z rack_c.trans_y = -gear_b.rotate_z * 2 * pi ----------------------------------------------------------- Q25. What are Inverse Kinematics? --------------------------------- In the examples given above, it has always been assumed that the rotation angles and translation vectors for each bone are already known and only the end-points and rotation matrices for each bone have to be calculated. With inverse kinematics (or IK for short), only a limited set of endpoints and translation values are known, along with the set of constraints defining the freedom of movement of the skeleton. Other constraints that are known include the motion paths for each joint. For example, with motion capture, sensors will provide continuous data which will be interpolated into NURBS curves. For any instant of time, these will be translated into the endpoints of each bone in the skeleton. From these values, direction vectors can be generated for each bone. Once the direction vectors are known, rotation matrices for vertex data can be determined. These can then be used to transform the geometry of the model. Q26. How do I implement an IK system? ------------------------------------- With IK systems, the goal is to determine the values of all unknown variables in the skeleton. As mentioned before, each bone data structure contains several pieces of data: +-----------------------+----------+---------------+ | Name | Acronym | C flag | +-----------------------+----------+---------------+ | Euler rotation angles | RA | IK_ANGLES | | Rotation matrix | RM | IK_MATRIX | | Start Point | SP | IK_START | | End Points | EP | IK_END | | Translation | TR | | | Direction vector | DIR | | | Length | LEN | | | ID of parent bone | | | | Flag list | | | +-----------------------+----------+---------------+ The flag list contains a set of bit-values associated with each of the first four parameters (RA), (RM), (SP) and (EP). For each value which is known the appropriate flag bit is set. Since each of these values are related mathematically, data can be propagated both forwards and backwards. If the end-point of a parent bone is known, then the start-point of any child-bone is also known. This is forward propagation. Similarly, if the start-point of a child bone is known, then the end-point of the parent is also known. This is backward propagation. If the start-point of the parent bone is known, and the end-point of the child bone is known, the location of the intermediate joint (end-point of the parent or start-point of the child) can also be determined. Altogether, there are around 12+ rules which can be used to propagate data both backwards and forwards. These are as follows: +------+---------+-----------------+-----------------------------+--------+ |Rule | Unknown | Parent bone | Current bone | Path | | # | var. | PSP | PRM | PEP | TR | SP | RA | RM | EP | Vec PV | +------+---------+-----+-----+-----+-----+-----+-----+-----+-----+--------+ | 1 * | SP | /// | ... | ### | ### | ??? | ... | ... | ... | ... | | 2 | TR | /// | ... | ### | ??? | ### | ... | ... | ... | ... | | 3 % | EP | ... | ... | ??? | ### | ### | ... | ... | ... | ... | | 4 * | RM | ... | ### | ... | ... | ... | ### | ??? | ... | ... | | 5 | RA | ... | ### | ... | ... | ... | ??? | ### | ... | ... | | 6 | PRM | ... | ??? | ... | ... | ... | ### | ### | ... | ... | | 7 * | EP | ... | ... | ... | ... | ### | ... | ### | ??? | ... | | 8 % | RM | ... | ### | ... | ... | ### | ... | ??? | ### | ... | | 9 | SP | ... | ... | ... | ... | ??? | ... | ### | ### | ... | | 10 | EP | ... | ... | ... | ... | ### | ... | ... | ??? | ### | | 11 | PEP | ### | ... | ??? | ... | ... | ... | ... | ... | ### | | 12 % | PEP | ### | ... | ??? | ... | ... | ... | ... | ### | ... | +------+---------+-----+-----+-----+-----+-----+-----+-----+-----+--------+ ... - Not needed /// - Need not be known in certain cases ### - Known variable ??? - Unknown variable * - Standard character animation % - Can be used to implement motion capture It should be noted that Expressions can also be used by IK systems. In this case, the left hand side of the equation would be regarded as the unknown variable and any variables on the right hand side as known variables. The operation of the IK system is fairly straightforward, and can be defined by the following sequence of actions: -------------------------------------------------------------- For each animation_frame do Mark all variables as unknown Set known variables and bit-flags Set progress_made flag While unknown_variables_exist and progress_made do Clear progress_made flag For each bone do For each rule do If LHS variable is unknown and all RHS variables are known then Evaluate_rule( rule, bone ) Mark variable as known set progress_made flag Endif Endfor Endfor Endwhile /* unknown_variables_exist */ Endfor /* animation_frame */ -------------------------------------------------------------- In certain situations, it may be impossible to find the values of some unknown variables. To detect this situation, it is necessary to maintain a progress made flag, which is set whenever the value of an unknown variable is determined. If no unknown variables can be determined then execution of the main loop is terminated, and the IK system returns the values of those variables which could be determined. Each of the above rules can be implemented using simple vector and matrix mathematics. A list of rules using the 3D API is as follows: ------------------------------------- Rule # 1. v3_sub( SP, PEP, TR ) 2. v3_sub( TR, SP, PEP ) 3. v3_sub( PEP, SP, TR ) 4. m3_rotatexyz( m1, RA ) m3_mult( RM, PRM, m1 ) 5. m3_transpose( m1, PRM ) m3_mult ( m2, m1, RM ) m3_toeuler( m2, RA ) 6. m3_rotatexyz( m1, RA ) m3_transpose( m2, m1 ) m3_mult( PRM, RM, m1 ) 7. m3_multvector( RM, v1, DIR, 1 ) v3_scalef( v1, v1, LEN ) v3_add( EP, v1, SP ) 8. findmatrix( RM, SP, EP ) m3_toeuler( RM, RA ) 9. m3_multvector( MR, v1, DIR, 1 ) v3_scalef( v1, v1, LEN ) v3_sub( SP, EP, v1 ) 10. v3_sub( v1, PATHMAX, PATHMIN ) v3_normalise( v1, v1 ) v3_scale( v1, v1, LEN ) v3_add( EP, SP, v1 ) 11. intersect sphere with line 12. intersect sphere with sphere ------------------------------------- findmatrix - Function to determine the rotation matrix between the direction vector and the new position of a bone m3_multvector( PRM, v1, DIR ) v3_sub( v2, PEP, SP ) v3_normalise( v2, v2 ) v3_cross( v3, v1, v2 ) v3_norm( v3, v3 ) lrot = v3_dot( v1, v2 ) lrot = acos( lrot ) * RADIANS m3_fromquat( RM, v3, lrot ); m3_transpose( m1, RM ) m3_mult( m1, RM, PRM ) m3_copy( RM, m2 ) RENDERING ========= Q27. How do I render a skeleton as a set of lines? -------------------------------------------------- This is simplest and quickest way of rendering a skeleton. It is achieved simply by drawing a line from the start point to the end point of each bone. Joints can be highlighted by drawing circles at each joint. Q28. How do I render a skeleton as a set of tetrahedrons? --------------------------------------------------------- While drawing a skeleton as a series of lines is fast, it does not provide a clear view of the way in which each limb is moving. An alternative way is to represent each bone as an elongated tetrahedron. The base of the tetrahedron is placed at the start of the bone. The elongated end of the tetrahedron is positioned at the end of the bone. The coordinates of the tetrahedron can be stored as a single 4x4 matrix and scaled according to the dimensions of the bone. A unit tetrahedron has the following coordinates: | 0.000 0.353553 -0.176776 -0.176776 | | 0.000 0.000000 0.306186 -3.306186 | | 1.000 0.000000 -0.000000 0.000000 | with one end-point stored at (0,0,1). This coordinate will be scaled according to the length of the bone. To ensure that the tetrahedron rotates along with the model, each bone has an initial direction vector. Since the tetrahedron has a direction vector of ( 0,0,1 ), the base rotation matrix is derived from the matrix which rotates the direction vector of the tetrahedron to the direction vector of the bone. As the bone is rotated through keyframe animation or inverse kinematics the current rotation matrix of the bone is multiplied with the base rotation matrix. Applying this matrix to the vertices of the tetrahedron. The resulting set of vertices are used to render the tetrahedron. The tetrahedron can be rendered in wireframe, shaded or even texture mapped modes. Q29. How do I render a skeleton as a texture mapped model? ---------------------------------------------------------- See Q23. Rendering digital skin COLLISION DETECTION =================== Q30. How do I perform Collision Detection? ------------------------------------------ This really depends on what kind of objects are colliding. For example, you may be attempting to determine whether a missile has collided with a character or whether the player has attempted to walk through a wall or has set off a trip-wire. The most commonly used collision detection methods are as follows: o Coordinate/Plane intersection test used for: trip-wire tests, character/wall collision, door activation o Sphere/Sphere intersection test used for: object pickup, character/character collision o Parametric line/Sphere intersection test used for: missile trajectory hits Q31. How do I perform intersection tests between coordinates and a plane? ------------------------------------------------------------------------- For flat objects such as trip-fires or doors, plane-collision tests can be performed. A plane is defined by the equation: P = A.x + B.y + C.z + D where the constants A,B,C and D define the equation of the plane and (x,y,z) is a coordinate in Euclidean space. This calculation can also be considered to be a dot product between two homogenous coordinates. All points in front of the plane will generate positive value. All points behind the plane will generate negative values. All points which lie exactly on the plane will generate a value of zero. As a player or object moves around in world space, the current position is saved and the new position is calculated. For each new position, the new value of the plane equation is calculated. If the result changes sign, then a collision has occured. The point of intersection can be determined by the algorithm: ro = P . oldpos rn = P . newpos Then the point of intersection is given by: ro rn Pi = --------- Po + ---------- Pn (rn - ro) (rn - ro ) This can be rearranged to give: ro.Po + rn.Pn Pi = ------------- (rn - ro) where Po is the first point, Pn is the second point, ro is the evaluated plane equation for Po rn is the evaluated plane equation for Pn and Pi is the interpolated point Q32. How do I perform intersection tests between a line and a sphere? --------------------------------------------------------------------- For all cases, it is convenient to define a bounding sphere for the character. This allows for a simple distance check to determine whether a collision is likely to happen or not. The equation can be defined as follows: 2 2 2 2 V = (Xp - Xm) + (Yp - Ym) + (Zp - Zm) - R where (Xp,Yp,Zp) are the coordinates of the player, (Xm,Ym,Zm) are the coordinates of the missile and R is the radius of the boundary sphere If V is less than zero, a "hit" has occurred, otherwise it is a "miss". If the missile is travelling so fast, as to appear instantaneous eg. high velocity rifle, then you are better off performing a line-sphere intersection test. In this case the trajectory of the missile is determined by a line equation: Pt = Ps + t . Pd Where Pt is the location of the missile at time t Ps is the initial location of the missile and t is the time This is substituted into the sphere equation above: 2 2 2 2 V = (Xp - Xm) + (Yp - Ym) + (Zp - Zm) - R Evaluating out, this forms a quadratic equation with the terms: 2 A.t + B.t + C = 0 with the values of P, Q and R: A = Pdx + Pdy + Pdz B = -2.Xp.Pdx - 2.Yp.Pdy - 2.Zp.Pdz - 2.Psx.Pdx - 2.Psy.Pdy - 2.Psz.Pdz 2 2 2 2 C = Xp + Yp + Zp - 2.Xp.Psx - 2.Yp.Psy - 2.Zp.Psz - R The roots of this quadratic equation define the values of the parametric variable t where the line intersects the sphere. The number of roots can be determined by calculated the "discriminant" D where: 2 D = B - 4AC If D is less than zero, no roots exist. If D is equal to zero, then one root exists. IF D is greater than zero, then two roots exist. Q33. How do I perform intersection tests between two spheres? ------------------------------------------------------------- Given two spheres with Radii Ra and Rb and center points Pa and Pb, then the following test can be performed: D = | Pb - Pa | - Ra - Rb where D is the resulting test value. If D is less than zero, the spheres intersect If D is equal to zero, then the spheres just touch each other. If D is greater than zero, then the spheres do not intersect. The plane of intersection can be calculated as follows: The outward normal is the normalised direction vector of Pa to Pb. ------- Pn = Pb - Pa This is equivalent to the values of A, B and C in the standard plane equation. The point of intersection is derived by: Ra Pi = Pa + ------- . N (Ra+Rb) The constant term of the plane equation can be evaluated by taking the negative dot product ie. D = -N.Pi PARTICLE SYSTEMS ================ Q34. What are Flocks and Swarms? -------------------------------- When animating animals, birds and insects, it is often required that two or more creatures are required to interact with each other. For example, a flock of geese will typically form a ^ formation when flying South or a swarm of bees will fly in a cluster towards a specific target. This behaviour can be modelled by a special kind of particle system (often referred to as Flocks). With traditional particle systems the motion of each particle is governed solely by the laws of Physics eg. gravity, velocity, wind, air-friction etc... No decision making ability is given to individual particles. Flocks attempt to give the particle system the appearance of cognitive thought, by allowing each particle to make decisions based on its position in the environment and relative to other particles. Certain constraints can be applied to the system. These include speed limits on velocity and accelaration. They may even include contraining the amount of angular vision on a particle ie. modelling the inability to see directly behind itself. This is required for modelling geese and insects. (Out of scientific curiosity, it is noted that Rabbits have 360 degree vision). Usually, each particle will also be assigned a preferred distance from other particle. This is implemented using spherical force fields. For each particle, the distance to every other particle is determined using simple geometry. This value is then scaled using the inverse-square law and used to determine the resulting acceleration vector. These vectors are accumulated and used to move the particle. A maximum distance limit is usually set to discount particles that are far away. If two particles are closed together, they will attempt to move apart. If they are too far away, they will attempt to move together. To implement line-of-sight, the angular direction or direction vector is also determined. Using a suitable acceptance function eg. dot product or maximum/minimum limits, the visibility of other particles can be determined. If "out of sight", then these particles are ignored. To allow closer particles to obscure other further-away particles, only the nearest 3 or more particles need be considered to generate the acceleration vector. Particle may also be required to interect with an environment. In that case, collision detection and force fields may be implemented as described in 19]. Q35. What is Facial Animation? ------------------------------ In the same way that Character Animation attempts to give life to inanimate objects, character animation attempts to bring to life a model of a face or an object which resembles a face. For example, the front of a car can be made to look like a face; the headlights are it's eyes, and the radiator is it's mouth. Another example is a stero system; the large speakers to each side are it's eyes and the buttons at the bottom are it's teeth/mouth. One way to implement facial animation is to model the way muscles move. With any living creature, movement of the skin surface is generated by movement of muscles underneath. Each patch of skin can be stretched by at least one or more muscles. However, while each muscle can only pull in one direction when it contracts, two or more muscles may be combined simultaneously to generate a new stretch direction. To represent this system using 3D mathematics, patches of skin are represented by 3D vertices, rendered either using NURBS or polygons. Each muscle is represented as a weighting factor from 0.0 (relaxed) to 1.0 (fully contracted). Every vertex which is attached to that muscle has a cubic spline function weighted to model the way in which the skin is stretched. When the muscle contracts, the verex is displaced in a particular direction path. Since the polygonal geometry remains the same, the face produces a recognisable expression. Grouping together muscle movements develops various expressions eg. smiling grinning, surprise, frown, anger etc... Q36. What is a good 3D mathematics library to build? ---------------------------------------------------- If you are starting out in 3D and would like to experiment with vectors, matrices, outward normals and polygons, then you will need data structures to represent these. The first decision you will need to make is whether to use homogenous matrices (4x4) or standard (3x3) matrices. For most game applications 3x3 matrices require less calculations (ie. no need to maintain the W coordinate). For further details, see the Vectors and Matrices FAQ. BIBLIOGRAPHY ============ B1. Bibliography ---------------- COMPUTER SCIENCE BOOKS ====================== Graphics Gems Foley and van Dam Computational Dynamics by Shabana. Physically Based Modeling in Computer Graphics and Animation by Barr. Ronen Barzel ---------------------------------------------------------------- Robots and Telechirs M.W.Thring, Queen Mary College, University of London Ellis Horwood Series Engineering Science (1983) ISBN 0-470-20174-6 - Full discussion on the design and applications of robots, particularly in the fields of medicine and workplace safety. One chapter describes kinematics. A large number of robotic devices, including "Wallace and Gromit" style walking legs! ART AND DRAWING BOOKS ===================== The Encyclopedia of Cartooning Techniques Steve Whitaker Headline Book Publishing (1996) ISBN 0-7472-7782-6 - Complete guide to designing cartoon strip characters ---------------------------------------------------------------- How to Draw Animation Christopher Hart Watson-Guptill Publications 1515 Broadway, New York, N.Y. 10036 ISBN 0-8230-2365-6 - Complete guide to classical 2D character animation. Also covers walk cycles of both humans and four legged animals such as horse and cats. ---------------------------------------------------------------- How to Draw Comic Book Heroes and Villains Christopher Hart Watson-Guptill Publications 1515 Broadway, New York, N.Y. 10036 ISBN 0-8230-2245-5 - Complete guide to drawing comic strip heroes and villains ---------------------------------------------------------------- Fantasy Art Mike Jefferies Harper Collins Publishers (1997) ISBN 0 00 412885 4 - General guide to drawing castles, dungeons and dragons creatures such as wizards, giants, dwarfs and peasants ---------------------------------------------------------------- DIsney's Art of Animation from Mickey Mouse to Hercules Thomas, Bob, 1992- Hyperion, 114 Fifth Avenue, New York, New York 10011 ISBN 0-7868-6241-6 An interesting review of the cartoon industry and the motives behind the creation of each feature film ---------------------------------------------------------------- The Animator's Workbook Step-by-Step Techniques of Drawn Animation Tony White Watson Guptill Publications, a division of Billboard Publications Inc., 1515 Broadway, New York, N.Y 10036 ISBN 0-8230-0229-2 An excellent guide on hand-drawn cartoons, gags and SFX used in cartoons ------------------------------------------------------------ Walt Disney Imagineering Kevin Rafferty with Bruce Gordon Hyperion, 114 Fifth Avenue, New York, New York 10011 ISBN 0-7868-6246-7 An interesting review of all the many special attractions designed for each Disney wonderland. ---------------------------------------------------------------- Dynamic Anatomy Burne Hogarth Watson-Guptill Publications, New York ISBN 0-8230-1550-5 ISBN 0-8230-1551-3 (paperback) Detailed information on the measurements, proportions, anatomical details, surface forms, perspective foreshortening and movement of the human body SIGGRAPH PAPERS =============== SIGGRAPH 97 ----------- Jessica K. Hodgins and Nancy C. Pollard Adapting Simulated Behaviors for New Characters Ferdi Scheepers, Richard E. Parent, Wayne E. Carlson, Stephen F. May Anatomy-Based Modeling of the Human Musculature Jane Wilhelms and Allen Can Gelder Anatomically Based Modeling SIGGRAPH 96 ----------- David Baraff Linear-Time Dynamics using Lagrange Mulipliers Charles Rose, Brian Guenter, Bobby Bodenheimer, Michael F. Cohen Efficient Generation of Motion Transitions using Spacetime Constraints Joseph Laszio, Michiel van de Panne, Eugene Fiume Limit Cycle Control And Its Application To The Animation of Balancing And Walking SIGGRAPH 95 ----------- Bruce M. Blumberg and Tinsley A. Galyean Multi-Level Direction of Autonomous Creatures for Real-Time Environments Yuencheng Lee, Demetri Terzopoulos, and Keith Waters Realistic Modeling for Facial Animation Radek Grzeszckuk and Demetri Terzopoulos Automated Learning of Muscle-Actuated Locomotion Through Control Abstraction Jessica K. Hodgins, Wayne L. Wooten, David C. Brogan, James F. O'Brien Animating Human Athletics Munetoshi Unuma, Ken Anjyo, Ryozo Takeuchi Fourier Principles for Emotion-based Human Figure Animation Armin Bruderlin, Lance Williams Motion Signal Processing ' Andrew Witken and Zoran Popovic Motion Warping ========================================================================== Graphics Gems ============= p351 Ken Shoemake Quaternions and 4x4 Matrices p360 Overview and low-level specification VIII.4, p377 John Schlag Using Geometric Constructions To Interpolate Orientation With Quaternions p498 Patrick-Gilles Maillot Using Quaternions For Coding 3D Transformations VII.I, p320 Spencer W. Thomas Decomposing A Matrix Into Simple Transformations ==========================================================================