Inverse Kinematics

In addition to the "forward kinematics" system described in the animation section, Trial also offers inverse kinematics solvers that can be blended into the existing animation sets.

An inverse kinematics system is composed of an "ik chain": a linked chain of joints that we want to make reach for a certain goal, while subject to a number of constraints. This chain as well as the strategy by which the kinematics are solved are handled by an ik-solver, of which Trial currently the following:

Every solver keeps a vector of the joint indices that are involved in the ik-chain, and a reference to the pose that contains the actual joint transforms. It also holds a vector of ik-constraint instances in its constraints, which are used to determine the limits to which the solver is allowed to push the transforms.

An ik-constraint is a simple object which only needs to implement the apply-constraint function, responsible for correcting the indicated joint to the acceptable range of motion. Currently the following constraint types are implemented:

An ik-solver itself must only implement the solve-for function, which should update the transforms in the pose to aim for the goal passed to the function. It is expected that each solver implements its strategy in an iterative manner, and returns true if the goal was reached, NIL if not. The iteration can be controlled via the iterations and threshold fields.

To construct a solver instance in a convenient manner the ik-from-skeleton function exists, which takes the name of a target leaf-joint (the joint that will try to reach for the target), and either a length or a root-joint that defines the length of the chain. This function will construct the correct joint sequence from the skeleton's pose and create the requested solver.

In order to actually manage the solver and the current target we have a controlling ik-system, which keeps track of the current blend strength, its active-p status, and a local tf transform.

The system must only implement the update function, which will update its internal target vector, transform it into local space, and then use solve-for to update the pose. Some handy subclasses exist as well:

Each system still only controls one solver and thus one IK chain.

To bring this all together and to allow multiple chains to be used at once, the ik-controller mixin class exists. It keeps a number of named ik-systems, updates them all together, and blends their results into the final pose. It also presents an easier interface to manage the systems with add-ik-system, remove-ik-system, and the ik-system accessor.

The basic animated-entity and armature include an ik-controller, meaning you can directly add IK chains onto those and control them that way.