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
 
  ==========================================================================