Skills:
Physically based modeling, Computer Graphics, User interface

Tools:
OpenGL, C++

What I learned:
 ∙ The concept of IK
 ∙ The implementation of separation, alignment, and cohesion forces to move boids.
 ∙ The potential for crowd animation involving multiple characters.
Forward Kinematics
Forward kinematics gives the animator explicit control over each DOF but can become cumbersome when the animation is trying to attain a specific position or orientation of an element at the end of a hierarchical chain. IK, using the inverse or pseudoinverse of the Jacobian, allows the animator to concentrate only on the conditions at the end of such a chain but might produce undesirable configurations. Additional control expressions can be added to the pseudoinverse Jacobian solution to express a preference for solutions of a certain character.
Introduction
This is mainly about what is forward kinematics and basic knowledge of acclaim format. Implement a simple HumanModel with C++ programming. Besides, we also implemented the motion and discussed the concept of kinematics. It’s special that this is my first time programming body skeleton animation, however, everything is quite cool for me. Although I faced some challenges during the writing process, I overcame a lot of parts that took a long time to debug. To sum up, I think that it’s an interesting work and I finished it smoothly.
Using a BFS to traverse the whole skeleton. I use a queue to store the bone which I traversed. “discovered” vector was used as a recorder to record which bone shouldn’t be processed again.
Initializing the root bone, which is different from the other bones because the root bone doesn’t have parent and rotation, I just use the default value.
This step is to deal with the child bone of the parent, if a parent has a child, we need to record the child as a visited bone and update the rotation and position value of the child.
This step is to deal with the spring bone of the parent, if the child has a sibling, we need to check whether this sibling is a visited bone or not, if we haven’t visited the sibling, we need to update the rotation and position value of the sibling.
Continuously the while loop until all the bones were visited and deleted.
The first step:
The second step:
The third step:
The fourth step:
Using a BFS to traverse the whole skeleton. I use a queue to store the bone which I traversed. “discovered” vector was used as a recorder to record which bone shouldn’t be processed again.
Initializing the root bone, which is different from the other bones because the root bone doesn’t have parent and rotation, I just use the default value.
This step is to deal with the child bone of the parent, if a parent has a child, we need to record the child as a visited bone and update the rotation and position value of the child.
This step is to deal with the spring bone of the parent, if the child has a sibling, we need to check whether this sibling is a visited bone or not, if we haven’t visited the sibling, we need to update the rotation and position value of the sibling.
Continuously the while loop until all the bones were visited and deleted.
The first step:
The second step:
The third step:
The fourth step:
First, I need to know the fundamental knowledge, such as the rotation, translation, amc and asf files.

Only when I understood the framework of the whole project, can I realized what should I do in this homework. So, I spend a lot of time thoroughly absorbing the concepts on the course slides. Moreover, I tried to derive the mathematical formula. There are some notes I tried to deviate the formula and let myself understand the whole concept. Especially, the rotation part which let me spent a lot of time learning it.

The first part is to deal with the new keyframe value, due to the change in the number of frames.
The second part is very simple, we just update the value of the translation and the rotation. Then, this part can be done with simple math concepts. Translation part, I used the ratio of the linear interpolation. Rotation part, I used the Eigen::Quaternionf slerp() function to implement.
The final part is the same as the first part, the difference between them is the ratio of new Keyframe to oldKeyframe.
Back to Top