For my programming project, I would like to do a realtime implementation of skeletal animation. The core functionality of the system will be to serve as implementing skeletal animation using keyframes provided by a modeller. Interpolation between keyframes will be doing using quaternions and spherical interpolation.
In addition to interpolating between keyframes, I also plan on parsing the model data in a logical enough of a matter so that it will be possible for direct control of the model's joints (FK), and understanding of the model's structure so that effects such as head tracking and inverse kinetics become possible. Implementing a sort of IK system has the least priority, as currently I am unsure enough of its difficulty that I do not know if I will have sufficient time.
I plan on working on this project as a cooperative effort with my game programming project for the 3D programming course. I intend on using the knowledge and code from this project to allow the game to be able to play back skinned models in the game based on keyframes generated in a modeller. Additional work that I do not plan will be directly for the game will be implementing a system to directly control the joints (using FK), and implementing IK if feasible.
So far I have been doing a lot of research into the feasibility of this project, and developing a pipeline to be used between the modelling program and the runtime renderer. Due to the short time in the quarter (10 weeks), implementing my file format and exporters/importers for Maya is not feasible. Therefore, after looking at a large number of different file formats, the only file format I have found that is the best possible fit is the DirectX 8.0 "X" file format.
I have found an exporter from Maya to the DirectX format, and DirectX has routines that aid the developer in loading and parsing X files, so I am able to create a complete pipeline between the artist and the runtime renderer. The file format contains everything I need for the 3D game project, and almost everything needed for this project. X files contain the following information:
I only plan on using rotational keyframes on the bones for my models, since I plan on modelling human(oid) figures, whose bones only rotate and do not translate or scale. Thus I will use spherical interpolation (SLERP) on the bones to interpolate between keyframes. After the bone matrices have been formed from the interpolation, the vertices need to be transformed. This can be done on modern hardware by using blended matrices.
One thing in the file format I did not mention is that each mesh, frame, and animation set can be named. By following a naming scheme in the modeller, I can give specific names to specific joints I want the renderer to treat specically.
Missing from this file format is IK information. At this time I know little about IK and even specifics about what information is needed, so this is a risk area of this project. While for keyframed animation I understand the concept enough to know I will be able to implement it this quarter, I am currently unsure of the difficulties of implementing IK and I also need to develop a system to specific IK information on a model.
A useful implementation of FK would be to perform head tracking, where a model's head would be made simply to point at an object in the world. If I am able to implement IK, then it might be possible to involve more than the neck in head tracking, so that the model will twist or bend at the waist to see objects on the floor or objects not comfortably in front of him.
The final presentation for this project will consist of demonstrating a renderer dedicated solely to this project (I do plan on creating a separate program, although much code may be shared with the 3D game project), and if interesting, showing the keyframed animation as enhancing the 3D game project by showing the game.
In the renderer specifically in this project I will demonstrate keyframed animation, and then pause the keyframed animation to show that individual bones can be manipulated (using FK). If implemented I will show head tracking (of the mouse pointer or of some insignifant world object such as a sphere) and IK.