Skeleton Modules

Skeleton Modules are procedural skeleton assembly nodes which provide both skeleton setup locators and animation controllers.

A Skeleton Module builds a Scene for itself and gathers a set of children skeleton sub-parts. To add sub-parts, right-click on the Skeleton Module and select Resize. A popup window will open, enter the desired number of children sub-parts and press Resize or hit Enter.

Note

Children skeleton sub-parts can also be added in Python with the following python script:

skeleton_module.plugin().resize(n_sub_parts)

To assemble SkeletonModules together, connect the world_transform plug of the parent Module to the parent_world_transform plug of children Modules.

When implementing a new Skeleton Module, with its set of parameters, inherit the SkeletonModule Node and override the eval_skeleton plug with the desired evaluation function. The default implementation only gathers the children sub-parts:

Value eval_skeleton(EvalContext& ctx)
{
  static cont int Static_Dep_Count = 1; // the first value is the Module's name
  const int n_children = ctx.value_count() - Static_Dep_Count;
  // create the Scene for this skeleton module
  Scene result;
  result.set_name(ctx.as_string(0).c_str());
  // then add children
  for (int i = 0; i < n_children; ++i)
  {
    SceneConst child_input(ctx.value(Static_Dep_Count + i));
    if (child_input.name() != "")
      result.add_child(child_input);
  }
  // return the assembled skeleton
  return result;
}

The SkeletonModule Node provides a set of orientation parameters to build the corresponding Skeleton part:

  • aim: The world position towards which points the main axis of the Module’s world Transform.

  • main_axis: The main axis to be used along the Module’s skeleton and to point towards the children skeleton sub-parts.

  • up_axis: The axis to be used to point “up” along the Module’s skeleton.

  • side_axis: Whether the axis pointing “sideways” in the local space of the Module’s skeleton must be computed using right-hand (positive) or left-hand (negative) convention.

  • world_top_axis: The axis to consider as “world up” when building the local frame of the Module’s skeleton.

  • offset_angle: The offset angle for frame rotation around the main axis of the local frame of the Module’s skeleton.

Single Part Skeleton Modules

JointModule

The simplest Skeleton Module is the JointModule, which consists in one joint and integrates one setup locator and one animation controller.

EndJointModule

The EndJointModule materialises the end of a Skeleton branch. It helps aiming and display its parent Skeleton Module but does not gather any sub skeleton parts.

FollowJointModule

The FollowJointModule extends the JointModule to provide parenting and targeting constraints on the joint. It can be configured with the following parameters:

  • compensation_mode: The constraint type to be used: Follow for parenting constraint, Target for targeting constraint.

  • follow: The index of the parent matrix to be constrained to when in Follow mode.

  • target: The transform whose position to target in Target mode.

  • target_axis: The local frame axis that is closest to the direction pointing towards the target position in rest pose, in Target mode.

Note

As for the children sub-parts, parent matrices to follow can be added to the FollowJointModule using the following python script:

follow_joint_module.plugin().set_follow_count(n_parents)

FootModule

The FootModule extends the JointModule to provide a set of FK and IK controls to override the parent ArmModule. The FootModule works together with the ArmModule as follows:

  • connect the rest_ik_target_world Plug of the ArmModule to the rest_ik_ankle_world Plug of the FootModule.

  • connect the world_transform Plug of the ArmModule’s c_IK_target child node to the ik_ankle_world Plug of the FootModule.

  • connect the fk_ik_blend Plug of the ArmModule to the fk_ik_blend Plug of the FootModule.

  • connect the solved_ik_ankle_world Plug of the FootModule to the ik_target_world plug of the ArmModule.

The FootModule provides rotation parameters that are applied using the following priority order: foot_rock > toe_pivot > foot_pivot > toe_roll > heel_roll > heel_pivot > foot_roll > toe_rotate > toe_twist

SecondaryJointModule

The SecondaryJointModule extends the JointModule to allow riveting the joint onto any transformation. SecondaryJointModules can be to bind onto the animated / deformed version of a character and used to apply secondary skinning deformations.

The SecondaryJointModule takes as additional inputs:

  • rest_parent_world_transform: The world transform of the joint’s parent in rest pose.

  • rest_parent_world_transform: The world transform of the joint in rest pose.

The SecondaryJointModule also computes additional outputs: * ref_world: The local transform of the joint in reference pose. * ref_world: The world transform of the joint in reference pose. * rest_skeleton: The output skeleton generated by this module in the rest pose for the secondary skinning.

Note

Similarly, the SecondaryJointModule needs both the current pose and rest pose versions of the children sub-parts, which can be added using the following python script:

secondary_joint_module.plugin().resize(n_sub_parts)

Multi Parts Skeleton Modules

HandModule

The HandModule is an assembly Skeleton Module composed of several JointModules assembled in finger chains. Each finger has 3 JointModules and an EndJointModule, except for the thumb which has only 2 JointModules.

From the HandModule’s menu action, it is possible to add/remove the thumb and set the number of desired fingers.

Note

The root of the HandModule’s output skeleton world matrix coincides with the HandModule’s parent_world_transform.

SpineModules

There are two types of Spine Modules available in Rumba Rig:

  • The JointSplineModule which samples a curve into joint elements. … FKSpineModule and IKSPineModule

  • The CurveModule which builds a curve skeleton part, consisting in 2 parented skeleton elements, one for the curve start and one for the curve end, both sharing the curve itself as their geometry but only the first one storing the curve parameters.

    From the CurveModule’s menu action, it is possible to add/remove control matrices for the final curve, with the corresponding locators and controllers.

    The CurveModule can be configured with the following additional parameters:

    • mode: The orientation mode along the curve.

      In free mode the matrix orientation along the curve is only driven by the interpolation of the control matrices. In constrained mode, the matrix orientation along the curve is enforced so that the main_axis is tangent to the curve.

    • length_conservation: How much the initial curve length is conserved during animation.

    • start_tangent_mode: The orientation mode for the first control matrix.

      In free mode, the first control matrix is defined as given by the corresponding controller. In constrained mode, the first control matrix is oriented towards the CurveModule’s parent_world_matrix.

    • in_tangent_mode: The orientation mode for the internal control matrices.

      In free mode, each internal control matrix is defined as given by the corresponding controller. In constrained mode, each internal control matrix is oriented towards the next one.

    • end_tangent_mode: The orientation mode for the last control matrix.

      In free mode, the last control matrix is defined as given by the corresponding controller. In constrained mode, the last control matrix is oriented towards the CurveModule’s aim.

    … CurveFKSpineModule and CurveIKSpineModule

ArmModule

Bendy

Facial

Eye