ArmManipulator

The ArmManipulator is able to control a standard arm or leg rig with some advanced features, like moving an FK arm in IK or the opposite. Using this manipulator, the animator moves the arm in the same way, in IK or FK.

In most cases, you don’t have to change the rig, you just have to configure the manipulator to describe how the arm/leg is rigged.

On a biped character, you will need 4 manipulators like this, 2 for the arms, and 2 for the legs.

Each ArmManipulator has 4 sub-manipulators:

  • arm_l/arm: It rotates the whole arm in FK
  • arm_l/forearm: It rotates for forearm in FK
  • arm_l/hand: In rotation, tt rotates the hand, in translation, it moves the arm in IK
  • arm_l/elbow: It rotates the elbow around the arm axis

Then, you can paint the ArmManipulator’s sub-manipulators grips on the geometry. Those grips will then manipulate your original FK and IK controllers.

Creation

Use the arms and legs ArmManipulator objects created by default. They are named arm_l, arm_r, leg_l and leg_r.

Or use the shelf menu to create a single ArmManipulator node.

../_images/create-arm.png

Configuration

In order for this arm/leg manipulator to control the rig, the rig arm/leg must have at least:

  • FK controllers: A shoulder, an elbow and a wrist.
  • An IK handle controller: The IK target.
  • An FK/IK switch attribute: An integer, enum or float attribute.

To get the full control of the IK elbow, the manipulator also needs to understand how the IK pole vector is rigged. Right now, the arm manipulator can deal with:

  • A transform controller which rotates the pole vector position around the arm axis.
  • A transform controller the pole vector is pointing at.
  • A float attribute which is a rotation angle of the pole vector position around the arm axis.

FK Configuration

  • shoulder_controller: The name of the shoulder FK controller i-e, the controller which rotates the whole arm. Like c_FK_shoulder_L.

    ../_images/arm_fk.gif
  • elbow_controller: The name of the elbow FK controller, i-e, the controller which rotates the forearm. Like c_FK_elbow_L.

    ../_images/forearm_fk.gif
  • elbow_controller_rotate_mode: The FK elbow rotation axis. It can be x, y or z. Here we use the x axis.

    ../_images/elbow_axis_fk.jpg
  • wrist_controller: The name of the FK wrist controller. Like c_FK_wrist_L.

    ../_images/hand_fk.gif

IK Configuration

  • ik_shoulder_controller:

    The name of the shoulder IK controller i-e, the first controller of the IK arm/leg. If you don’t have a IK shoulder controller, set the name of the IK shoulder joint. Like c_IK_shoulder_L.

    ../_images/shoulder_ik.jpg
  • ik_target:

    The name of the IK wrist controller, like ctrl_ik_hand_l.

    ../_images/target_ik.gif
  • ik_elbow_mode:

    Describe how the IK pole vector is rigged.

    • Rotate X/Y/Z/-X/-Y/-Z (mode 0~5) :

      The ik_elbow_controller is a rotation controller which rotates the pole vector position around the arm axis. The axis to choose is the IK elbow controller axis pointing into the shoulder->wrist direction. It can be negative. In this exemple, it is y.

      ../_images/elbow_ik.gif
    • Position (mode 6):

      The ik_elbow_controller is a translation controller, which moves the pole vector.

    • Angle (mode 7):

      The ik_elbow_controller is a float attribute which is a rotation angle around the arm axis. The manipulator angle needs a direct angle (CCW) in radians around the shoulder->wrist axis. You can use the ik_elbow_angle_mul attribute to set a multiply factor to transform the rig attribute into this angle.

  • ik_elbow_controller:

    If ik_elbow_mode is between 0~6, this attribute contains the name of the elbow IK controller i-e, the controller which rotates the pole vector. If ik_elbow_mode is Position (6), this attribute contains the name of the elbow IK position controller i-e, the controller the pole vector is pointing at. If ik_elbow_mode is Angle (7), it contains the attribute name like : ctrl_elbow_l.twist, where ctrl_elbow_l is the elbow controller name, and twist is the float attribute.

  • ik_elbow_angle_mul:

    This attribute is used only if ik_elbow_mode is Angle (7). This is a multiply factor to apply to the IK elbow float attribute in order to get a direct radian angle around the arm axis. For instance:

    • For a rig angle in radians, set it to +/- 1.0 regarding the orientation.
    • For a rig angle in degrees, set it to +/- 0.01745329252 regarding the orientation.
    • For a rig angle between 0 to 1, set it to +/- 6.283185307 regarding the orientation.
    • For a rig angle between 0 to 100, set it to +/- 0.06283185307 regarding the orientation.
  • ik_elbow_result:

    The name of the IK elbow joint, like jnt_elbow_ik_l.

    ../_images/elbow_ik_result.jpg
  • ik_shoulder_result:

    The name of the IK shoulder joint, like jnt_shoulder_ik_l.

    ../_images/shoulder_ik_result.jpg
  • ik_front:

    The ik joints’s main axis. It can be negative. In this exemple, it’s y.

  • ik_plane_normal:

    The ik joints normal axis. The joint’s axis with is the normal of the plane formed by the 3 ik joints. It can be negative. In short:

    • For the LEFT arm, choose the IK elbow joint’s axis pointing UP. Here, it’s -x.
    ../_images/ik_plane_left_arm.png
    • For the RIGHT arm, choose the IK elbow joint’s axis pointing DOWN. Here, it’s -x.
    ../_images/ik_plane_right_arm.png
    • For BOTH legs, choose the IK knee joint’s axis pointing the character RIGHT side. Here, it’s -x.
    ../_images/ik_plane_left_leg.png ../_images/ik_plane_right_leg.png

IK Switch

  • ik_switch_controller:
    The name of the node which has the IK switch attribute, like ctrl_ik_arm_l.
  • ik_switch_plug:
    The name of the IK switch attribute, like ikBlend.
  • ik_switch_on:
    The value of the IK swicth attribute to set the arm in IK, like 1.0. In case of an enum, set the integer value.
  • ik_switch_off:
    The value of the IK swicth attribute to set the arm in FK, like 0.0. In case of an enum, set the integer value.

Not used

  • shoulder_rotate_mode: xyz
  • wrist_controller_rotate_mode: xyz
  • translate_mode: view_plane
  • translate_space: world
  • ik_wrist_rotate_mode: xyz