Character Animation - Skinning

Path of the code: [06_skinning]
The objective of this scene is to model skeleton-based character deformation using linear blend skinning and dual quaternion skinning.
In the current state of the program an animated skeleton can be played, and a mesh which is expected to be deformed by skinning. The animation of the skeleton is already coded, but there is no interpolation between key poses. The geometrical deformation of the associated mesh by skinning is not coded either.

Proposed mesh and skeleton animation

Three mesh model with their animated skeletong are already coded
- A cylindrical model following two different bending motions fully procedurally generated
- A rectangular bar model following a bending and twisting motion fully procedurally generated
- A more complex pre-made character with runing, walking and idle motion. The character and motions are stored as external files (loaders are provided).

Skeleton encoding

The skeleton is stored in a simple format assuming tree like organization from the root node.
- A vector stores for each node/joint its geometry encoded as 3D position and rotation (quaternion).
- Another vector indicates the parent index of the k-th entry within the vector, therefore storing the connectivity of the tree structure.
- Given the local geometry and the tree connectivity, the function skeleton_local_to_global() compute the global 3D coordinates of each joint.

Skeleton motion

The method skeleton_animation_structure::evaluate_local() is expected to compute the interpolation of the skeleton at a given time \(t\). In the current state, the nearest(/smaller integer) neighbor is picked which leads to discontinuous motion.

Linear Blend Skinning

The function skinning_LBS_compute() (file skinning.cpp) is expected to compute the deformation for each vertex with respect to the linear blend skinning formulation.
The function receives in parameters
> Complete the code implementing the linear blend skinning formulation (file skinning/skinning.cpp, function skinning_LBS_compute()) to obtain the temporal animation of the cylinder, twisting bar (showing the candy wrapper artifact), and the running character.

Dual quaternion skinning

Linear Blend Skinning leads to candy wrapper artifact in the case of the twisting bar.
Hints:
Reminder/summary on dual numbers:

Possible extensions (ex. for final project)