Inverse Kinematics

Inverse Kinematics (IK) is a common technique in computer animation to efficiently make characters move and interact realistically with their environment. The process of creating a realistic movement for a character often requires many iterations and minor adjustments of the various joints. With IK, you can pose and animate multiple character parts by posing or adjusting a single object.

This animation technique can provide solutions to the following examples:

Grab and pose a character's hand while automatically adjusting the related limbs, such as the wrist, elbow, and shoulder.
Make a character's feet interact realistically on different surfaces and slopes.
Grab and move a single target object to quickly create realistic interactions with your character and props.


You can use an IKControl to procedurally add IK to your character rigs outside of the Animation Editor. Studio allows you to programmatically apply IK to all characters, such as R15, Rthro, and custom imported skinned characters, to create realistic movement and interactions in your experience.

When adding an IKControl, set the required properties correctly to avoid unexpected and unnatural animation results. As with all animation, test your IKControls to ensure that you achieve the desired behavior.

Required Properties

When adding a IKControl to your character's Humanoid or AnimationController, you must set the following required properties to enable IK:

TypeSpecifies the behavior type of the IK control. See Enum.IKControlType for the list of behavior options. Common behavior types are Position or Transform.
EndEffectorA BasePart or Bone in your character rig that tracks toward the Target. For example, you can set a LeftHand bone as a EndEffector to reach a doorknob object set as the Target.
TargetThe object the EndEffector reaches or points toward. A Target can be any object with a world position.
ChainRootDefines the chain of BaseParts or Bones that the IKControl affects. All connected parts between the ChainRoot and the EndEffector are affected by the IKControl using the behavior type defined.

For example, if your character's LeftHand is set as the Target, you can apply IK to the entire left arm by setting ChainRoot to the LeftUpperArm. To apply IK just to the parts below the elbow, set ChainRoot to the LeftLowerArm.

Testing IKControls

You can add and edit IKControl programmatically or directly through the Explorer. You can even add and make changes to IKControl during a Play test to quickly check how various properties affect a character's movements.

To quickly test your IKControl using an Attachment as a target:

  1. In the Test tab, select Play to start the Play test.

  2. In the Explorer, navigate to Workspace → your user's Model. This Model instance is named as your current Roblox account.

  3. Click the icon next to your character model's HumanoidRootPart and add an Attachment.

  4. Select the Attachment and use the Move tool to position the object in front of your character in the viewport.

  5. In the Explorer window, select the icon next to your character's Humanoid and add an IKControl.

  6. Select the IKControl and set the following property values in the Properties panel:

    1. Type: Select Transform from the dropdown.
    2. EndEffector: Select your model's LeftHand MeshPart in the Explorer.
    3. Target: Select the newly created Attachment object in the Explorer.
    4. ChainRoot: Select your model's LeftUpperArm MeshPart in the Explorer.
    IKControl Properties
    Explorer Panel - Character Model

    Your character's left arm should now reach for the target Attachment. You can experiment with moving the Attachment or editing the IKControl properties to achieve different results.

Adding Constraints

You can use Constraints to restrict how joints can move when reaching its target. Constraints can ensure joints like the elbows and knees bend naturally, or to make the mechanical joints rotate in a specific orientation.

Elbow bending unnaturally
Elbow bending correctly

To add constraints to your character using IKControl, your IKControl and constraint must meet the following conditions:

The following instructions describe the process of adding a HingeConstraint to restrict the rotation of a character's elbow and adding a BallSocketConstraint to the wrist to limit the rotation angle.


Roblox R15 characters already include attachments in their joints that you can use to apply the elbow constraint. For the elbow, both the LeftUpperArm and the LeftLowerArm include a LeftElbowRigAttachment. Along with adding a constraint, you also need to add additional child attachments to each part's LeftElbowRigAttachment to specify which axis the elbow can rotate about.

To add the HingeConstraint and child attachments:

  1. In the Explorer, locate your model's LeftLowerArm and click the ⊕ button.

  2. Add a HingeConstraint with the name LeftElbowConstraint.

  3. In the Explorer, navigate to the LeftUpperArm.LeftElbowRigAttachment and add an attachment:

    1. Click the ⊕ button to add an Attachment with the name LeftElbowConstraintAttachment0.

    2. In the viewport, select the attachment and use the Rotate tool to rotate the attachment so the yellow PrimaryAxis is the axis of your elbow's expected rotation.

    3. Set the LeftElbowConstraint.Attachment0 property to this new attachment.

  4. In the Explorer, navigate to your model's LeftLowerArm.LeftElbowRigAttachment add an attachment:

    1. Click the ⊕ button and add an Attachment with the name LeftElbowConstraintAttachment1.
    2. Set the LeftUpperArm.LeftElbowConstraint.Attachment1 property to this new attachment.
    3. Copy the LeftElbowConstraintAttachment0.CFrameOrientation property and paste it as the LeftElbowConstraint.Attachment1.CFrameOrientation value.

Test your IKControl to verify the elbow only rotates about its hinge axis:


Even with the elbow constraint, the IKControl can still produce unrealistic poses with the wrists.

The wrist bends unnaturally at certain orientations

You can improve this by adding a BallSocketConstraint to limit the rotation of the wrist. While this is similar to the process for adding a HingeConstraint to the elbow, you can use the LimitsEnabled property on this constraint to further control the range of motion of the wrist.

To add a BallSocketConstraint for the wrist:

  1. In the Explorer, locate your model's LeftHand and click the ⊕ button.
    1. Add a BallSocketConstraint with the name LeftWristConstraint.
  2. Locate your model's LeftLowerArm.LeftWristRigAttachment and add an attachment:
    1. Click the ⊕ button and add an Attachment with the name LeftWristConstraintAttachment0.
    2. In the viewport, select the attachment and use the Rotate tool to rotate the attachment so the yellow PrimaryAxis points toward the model's fingertips.
    3. Set the LeftWristConstraint.Attachment0 property to the new LeftWristConstraintAttachment0.
  3. Locate your model's LeftHand.LeftWristRigAttachment and add an attachment:
    1. Click the ⊕ button and add an Attachment with the name LeftWristConstraintAttachment1.
    2. Copy the LeftWristConstraintAttachment0.CFrameOrientation property and paste it as the LeftWristConstraintAttachment1.CFrameOrientation property.
    3. Set the LeftWristConstraint.Attachment1 property to this new LeftWristConstraintAttachment1.
  4. In the Explorer, select the LeftWristConstraint.
  5. In the Properties Editor, set the following:
    1. Enable LimitsEnabled.
    2. Set UpperAngle to 80. This controls how much the constraint's axis can rotate, and 80 degrees is approximately how much the wrist should be able to bend.
  6. Depending on your character you may want to tweak the direction the cone is pointing in. You can do this by using the Rotate tool to rotate the constraint's Attachment0.

When selecting the LeftWristConstraint, a green cone appears visualizing the wrist's range of motion.

With the constraint set up, test the IKControl with the hand pointing down in front of the character and the wrist should rotate and bend more realistically.