**Assignment 6 [due by 4/24/2013]**

This assignment consists of two parts. [250 points]

**Part I: **[125 points]** Obtain Key Poses by Inverse
Kinematics**

Students will
implement a direct-manipulation interface that drags an object model to a
desired pose which both satisfies fixed constraints and moving constraints.

(1). Fixed
Constraints: You choose a point on the bone of the object. And the point on the
bone will not move.

(2) Moving
Constraints: You drag a point on the bone of the object into a new position.
And the pose will change during you dragging (not after
your drag).

Let’s see one example
(one fixed and one moving).

(1) First, we
choose a fixed constraint (red point) by right click on a bone.

(2) Second, we drag
another bone into a desired pose (as the green arrow).

(3) Then, we can a
result. The pose that we obtained both satisfies the fixed constraint (red rot
position) and the moving constraint (the green dot)

Let’s see the second example (multiple fixed and one moving)

(1) First, we
choose multiple fixed constraints (red point) by right click on a bone.

(2) Second, we drag
another bone into a desired pose (as the green arrow).

(3) Then, we can a
result. The pose that we obtained both satisfies the fixed constraints (red
rots) and the moving constraint (the green dot)

And you can also
only use the moving constraints without any fixed constraints, and then the
object is actually translating with a little rotation.

For more technique details,
please see my slides here.

http://students.cse.tamu.edu/jjzhang10/Assignment6.pptx

The demo program, please download here. (Right Click to add fixed constraint,
Left Button to drag)

http://students.cse.tamu.edu/jjzhang10/Assignment6_demo.zip

What I have
provided: (Skeleton Code)

http://students.cse.tamu.edu/jjzhang10/skeleton.zip

(1) Optimization
Library Setup: It can help implement IK.

(2) Pick a point and show which arm it belongs to,
and calculate the position of the point in the corresponding arm’s local
coordinate.

(3) A Lamp class definition

You are not required to use the skeleton code that I
provide. You can develop your own one. Please submit a ReadMe file about how to
manipulate the object.

Grading (125
points):

1. [10 points] Visualize
the fixed constraints and the moving constraints during dragging.

(You need use glutMotionFunc to deal with the dragging)

2. [45 points] Implement Forward Kinematics. (Given
a configuration, you can calculate the global position of each constraint)

3. [70 points] Implement Inverse Kinematics. (Drag
the object, and the pose changes according the dragging. You need to implement
this by two modes. One is only with moving constraints, and the other is both
moving constraints and fixed constraints.)

4. [Bonus 10
points] Improve the appearance of the model and make it good-looking

5. [Bonus 10
points] Make the model more complex. Such as add a new arm.

**Part II: **[125 points]** Animation based on Keyframe Interpolation**

1. You need to
write a program that does the following:

- Allow the user to
select several frames as key frames or key poses. You also need to record the
time of each key frame.

- Display all key
poses.

- Implement the Catmull-Rom algorithm to
interpolate poses for in-between frames.

- Display interpolated motions.

- Write a ReadMe file. The ReadMe file should
describe how to specify key frames and how to play interpolated animations.

2. Grading:

- keyframe
selection [10 points]

- keyframe display
[5 points]

- keyframe
interpolation correct [100 points]

- interpolated
animation visualization [10 points]

- Make a good-looking
animation [Bonus 10 points]