CMSC 491/691: Computer Animation

Assignment 2
Inverse Kinematics
Due October 02, 2017

Before you start

You will be doing your work this semester in a class git repository. Before you get started on any of the assignments, you should fetch yourself a copy of your personal repository following these directions. Your personal class respoitory on the UMBC GL/Linux systems is /afs/umbc.edu/users/a/d/adamb/pub/491/your-user-name.git

The Assignment

For this assignment, you must write a C or C++ program that will read a bone forest (.bf) file and a constraint (.con) file that contains IK constraints for the skeleton and outputs a series of pose (.pose) files from an iterative IK solver.

You can run my program here:

~adamb/public/InverseKinematics/inverseKinematics ogre-skeleton.bf ik-a.con output-%05d.pose
I will also write a program to verify that your output satisfies the constraints. I'll post here when it is complete.

Input/Output

filename description
ogre-skeleton.bf .bf "bone forest" file containing the skeleton description. This is a crude file format that stores joint vertex rest positions, corresponding column indices into the weights matrix, and indices of parent joints
ik.con"constraint file" containing the constraints. The first line contains the number of constraints. Subsequent lines contain the "weightIndex" followed by the constraint position of the end (outboard joint) of the cooresponding bone.

More details

There are two parts to this assignment, (1) computing the Jacobian (2) using the Jacobian to iteratively update joint angles. Assume the first joint is fixed and that all others are 3-dof ball joints (easily treated with Euler angles). A couple things to be careful of: (1) The Jacobian for constraints that are not dependant on the current joint is zero (my big bug). (2) If you use Euler angles to represent degrees of freedom, be sure to update axes of rotation at every joint.

Extra Credit

For 20 additional points, implement joint limits. If the constraint (.con) file contains additional lines the first will be the number of joint limits followed by one line for each joint limit. Each line will contain four numbers
weightIndex jointaxis min max
which give the weightIndex, the axis of the joint (0=x, 1=y, 2=z) and the minimum and maximum limit, in degrees.

For 30 additional points, use the the pseudo-inverse to solve the linear system.

For 20 additional points, implement some version of cyclic coordinate descent or Jacobian transpose (whicheveer one you didn't implement for the basic assignment).

What to turn in

Turn in this assignment electronically by pushing your source code to your class git repository by 11:59 PM on the day of the deadline. Do your development in the proj1 directory so we can find it. Be sure the Makefile will build your project when we run 'make' (or edit it so it will). Also include a README.txt file telling us about your assignment. Do not forget to tell us what (if any) help did you receive from books, web sites or people other than the instructor and TA.

Check in along the way with useful checkin messages. We will be looking at your development process, so a complete and perfectly working ray tracer submitted in a single checkin one minute before the deadline will NOT get full credit. Do be sure to check in all of your source code, Makefile, README, and updated .gitignore file, but no build files, log files, generated images, zip files, libraries, or other non-code content.

To make sure you have the submission process working, you must do at least one commit and push a week before the deadline.