Transformations and forward kinematics

In this assignment, you will implement transformations and forward kinematics. The features you implement in this assignment will lay the groundwork for working with motion capture and character animation. Specifically, after completing this assignment, you will be able to load a BVH motion capture file and play back the animation on a character.

About the basecode

This assignment builds on the previous assignments, adding a new library and applications. If you did not complete assignment 1, you may edit the basecode project file to use the solution library. Right click on the BVHViewer project, select Properties, and then expand the Linker options. Select 'Input' and then edit the 'Additional Libraries' to point to libAssignment1-soln.lib instead of libAssignment1.lib.

User interface overview

The basecode includes a simple interface and 3D viewer for loading and playing BVH files. See below for a screenshot. By default, we will load a character and several example BVH files.

The camera can be controled with the mouse:
The player control panel on the top left can be used to load and play files. The panel at the bottom left can be used to load different BVH files.

FKDemo


Character animation implementation overview

The basecode includes a framework for organizing transforms into a hierachy and animating them using curves. The core data structure for supporting this functionality is the AnimatableTransform, which maintains pointers to parent and child transforms. The
AnimatableTransform primarily contains a Transform which keeps track of its position relative to its parent. It also stores its transform relative to the world coordinate system for convenience.

AnimatableTransforms are arranged into a hierachy with the
AnimatableHierarchy class. The root of the AnimatableHierarchy is positioned relative to the world coordinate system whereas all other joints are positioned relative to its parent in the hierachy. Although the AnimatableHierachy could be used to animate any group of transforms, for character animation it is natural to think of the AnimatbleHierachy as an actor and its corresponding AnimatableTransforms as joints.

To support BVH files, we populate an AnimatableHierarchy using the skeleton information from the file. We then initialize curves based on the BVH file's motion data and store the result in
BVHController. In the case of BVH, where joint limbs do not change length, the bvh controller only manages a single translational curve for the root joint. However, the BVHController does manage rotational curves for both the root and every joint. During playback, the BVHController queries the animation curves and then updates the transformations accordingly.

To summarize, the class hiererachy used for this asignment is the following:

BVHController
    AnimatableHierarchy (aka Actor)
    ASplineVec3 for the root joint position
    ASplineQuaternion for each AnimatableTransform (aka Joint).
    

Assignment

1. (20 points) Transformations. You will complete the implementation of the Transform class. These features will support a character skeleton whose limbs are arranged in a hierarchy where each child is positioned relative to its parent.
  1. (5 points) Implement Transform::Inverse()
  2. (5 points) Implement Transform::TransformPoint()
  3. (5 points) Implement Transform::TransformVector()
  4. (5 points) Implement operator* () for the Transform class
2. (10 points) Forward kinematics is the process of computing each transform's position relative to the world's coordinate system. We read in each joint's local translation from the BVH file and then update each joint's local rotation as we playback the motion. The global transformations are computed by propagating the transforms of each parent to its children. Implement AnimatableHierarchy::updateHierachy() and AnimatableTransform::updateTransformation().


Build and Submission Instructions!