Class
IKControl
Specifies a control to generate a procedural animation pose using Inverse Kinematics.
IKControl instances generate procedural animation poses using Inverse Kinematics (IK). They allow you to make characters respond realistically to their environment.
For example, you can make a character place its hand on a door handle exactly,
and the character will do so independently of its position.
IKControls provide the advantage of needing to create much
fewer animations for your game while giving your experience a more realistic
and polished feel.
IKControls must be a child of a Humanoid or
AnimationController with an Animator and have all of their
required properties set properly, otherwise they don't have any effect. The
required properties are Type,
EndEffector, Target,
ChainRoot. As soon as those are set, the
IKControl modifies the pose of your character as you specify. The
following code sample demonstrates how to set up your first IKControl
and get started with creating more realistic animations for your game.
You can use IKControls to make a character:
- Rotate its head and torso to look at a point of interest in the world.
- Modify its feet positions to respond to dynamic terrain. Adjust its legs and feet to place them accordingly on terrain with rocks and slopes.
- Hold a gun and place its hands appropriately on the grip without needing to create animations for each gun in the game.
- Aim at a point in the world, so that the tip of the gun point exactly at what you want to shoot. Especially useful in third person shooters.
- Place its hands on the steering wheel of a car and follow it when it rotates.
- Much more!
IKControl will override the animation for all the parts between the
ChainRoot and the
EndEffector. You can enable/disable it using
Enabled or change how much they have an effect over
the underlying animation using the Weight. Be
careful: if you do not set up your IKControls correctly, you
might generate bad and unrealistic poses!
Properties 11#
ChainRootInstance | The last part that you are interested in moving your character. For
example, the upper arm. Must be an ancestor of
EndEffector and be a BasePart or a
Bone in your character.ReadSafe |
Enabledboolean | Toggles the control on and off. True by default.ReadSafe |
EndEffectorInstance | The part that you are interested in moving to reach the
Target. For example, the hand of your character.
Must be a descendant of ChainRoot and be a
BasePart or a Bone in your character.ReadSafe |
EndEffectorOffsetCFrame | An additional offset applied on top of the
EndEffector in its local space to change
where it moves.ReadSafe |
OffsetCFrame | An additional offset applied on top of the Target
to change where the EndEffector moves.ReadSafe |
PoleInstance | An optional instance that determines which way the chain bends. You can use this to specify which way an elbow or knee bends.ReadSafe |
Priorityint | Specifies the order in which controls are solved. Higher values have higher priority.ReadSafe |
SmoothTimefloat | Specifies the average number of seconds that it takes for the
EndEffector to smoothly reach the
Target.ReadSafe |
TargetInstance | The object that the EndEffector reaches for
or points at. It can be anything that has a position in the world, such as
BasePart, Attachment, Bone, or Motor6D.ReadSafe |
TypeIKControlType | Specifies how the solver satisfies this control.ReadSafe |
Weightfloat | Specifies the weight of the IK control target. Should be in the [0, 1] range.ReadSafe |
ChainRoot: Instance#
ReadSafe
By specifying a ChainRoot and an
EndEffector, you instruct the
IKControl that it's allowed to move and rotate all parts between
the two to move the EndEffector to the
Target. For example, if you specify the LeftHand
as EndEffector and LeftUpperArm as the
ChainRoot, the control moves 3 parts: the
LeftHand, the LeftLowerArm, and the LeftUpperArm. Avoid setting
ChainRoot as the actual root of the character
because that produces unrealistic results.
Enabled: boolean#
ReadSafe
This property allows you to toggle the IK control on and off. It's on by
default. When Enabled is false, the IK control
is off and isn't resolved by the underlying solver.
EndEffector: Instance#
ReadSafe
The EndEffector describes the last part in
the chain of your character that you want to affect. For example, it could
be the hand when you want to move the whole arm to reach a point. It can
be a BasePart on a character, that has a Motor6D as its
child, a Motor6D directly, a Bone, or a
Attachment. The pivot of the selected
EndEffector moves to the
Target, so you can use
Attachments to modify which point of a BasePart
should reach the Target.
EndEffectorOffset: CFrame#
ReadSafe
The end-effector offset is an additional CFrame applied on top
of the Target CFrame that produces the
final CFrame used to place the
EndEffector. By default, it's the identity
CFrame, so if you don't set it, it has no effect and the
EndEffector uses the
Target CFrame directly, which is
specified in the local space of the
EndEffector.
Alternatively, you can use Attachments by setting an Attachment as
EndEffector, which moves it to the
Target instead of the parts it's attached to,
effectively obtaining the same result.
You can also use EndEffectorOffset to
modify which axis of the EndEffector should
point at the Target when using LookAt as
Type.
Offset: CFrame#
ReadSafe
The offset is an additional CFrame applied on top of the
Target CFrame that produces the final
CFrame used to place the
EndEffector. It's identity by default, so if
you don't set it, it has no effect and the
EndEffector will use the
Target CFrame directly. You can
animate it to create procedural animations such as typing on a keyboard.
It's useful when the Target and
EndEffector aren't aligned and you need to
fix it with an additional rotation or translation.
Pole: Instance#
ReadSafe
The Pole is an optional Instance that gives
you control over how intermediate parts in your character should bend. It
can be anything that has a position in the world, such as
BasePart, Attachment, Bone, Motor6D. It is
by default nil. When you specify it, the underlying solver will make the
parts bend towards it. When it is nil, the solver will try to make
elbows and knees bend appropriately based on the limb of the character.
The limb will be "Arm" when you select as
EndEffector either the LeftHand or
RightHand and as ChainRoot the corresponding
LeftUpperArm or RightUpperArm, and it will be "Leg" when you select as
EndEffector either the LeftFoot or
RightFoot and as ChainRoot the corresponding
LeftUpperLeg or RightUpperLeg. In all other cases, if you don't
specify a pole, the chain might not bend as you expect.
Priority: int#
ReadSafe
When multiple controls are active on a character, the order in which they are solved by the underlying system affects the final generated pose. By changing this value, you specify the ordering in which controls are satisfied. Higher values have higher priority, and higher-priority controls are resolved later because their result might override the previous result of other controls. If you have multiple IK controls on a character and one is more important than the other, specify a lower priority for it. It is 0 by default, meaning all controls have the same priority.
SmoothTime: float#
ReadSafe
This value specifies the average number of seconds that it takes for the
EndEffector to reach the
Target. The behavior is that of a
critically-damped spring, where the rate of change is proportional to the
distance to the target and no oscillations are present when approaching
the target. Smaller values create a quicker convergence, and larger values
create a slower convergence. A value of 0 disables smoothing. The default
value is 0.05 to provide a very slight smoothing that makes the motion
feel realistic.
Target: Instance#
ReadSafe
The Target represents a point (CFrame)
in the world that you want your EndEffector
to reach. The exact behavior of reaching can be set via the
Type property, and an additional
Offset can be applied on top of it to modify it.
If you set a Target that will be moved either by
physics or a script, at each frame the IKControl will try to
satisfy it, automatically updating the point to reach.
Type: IKControlType#
ReadSafe
By changing the Type, you can change the behavior
of the control. These are the available options:
- Transform: it's a full 6-DoF constraint. Aligns the
EndEffectorCFrameto that of theTarget. - Position: aligns the
EndEffectorposition to that of theTarget. - Rotation: aligns the
EndEffectorrotation to that of theTarget. - LookAt: moves and orients the whole chain to make an axis (by default
the forward axis) on the
EndEffectorpoint at a position in the world specified byTarget.
Weight: float#
ReadSafe
You can control how much a given control affects the character pose by using this property. Values should be in the [0, 1] range. 0 means no effect, and 1 means full effect of the IK control. Values outside this range are truncated. Smoothly varying this value allows you to blend in or out a specific control to avoid jarring motion. It is 1 by default.
The weight determines the interpolation factor between the End-Effector
and the IK target. Setting the weight to 0 doesn't disable the IK Control
because other factors, including the SmoothTime smoothing factor and Pole,
can still change the pose. To truly disable the IK Control, turn the
Enabled property to false.
Methods 6#
| GetChainCount | Returns the number of segments in the IK chain between the
ChainRoot and the
EndEffector. |
| GetChainLength | Returns the total length, in studs, of the IK chain between the
ChainRoot and the
EndEffector. |
| GetNodeLocalCFrame | Returns the CFrame of the chain node at the given index,
relative to its parent node in the chain. |
| GetNodeWorldCFrame | Returns the world-space CFrame of the chain node at the given
index. |
| GetRawFinalTarget | Returns the world-space target CFrame the solver aims for
before SmoothTime smoothing is applied. |
| GetSmoothedFinalTarget | Returns the world-space target CFrame the solver aims for after
SmoothTime smoothing is applied. |
GetChainCount(): int#
Returns the number of segments in the IK chain, meaning the number of
parent-child links between the ChainRoot and
the EndEffector. A chain of three parts has
a count of 2.
The chain always has one more node than it has segments, so the valid
indices for GetNodeWorldCFrame()
and GetNodeLocalCFrame() range from
1 to the returned count plus 1. This returns 0 when the
IKControl doesn't resolve to a valid chain, such as when its
required properties aren't set.
Returns
int— The number of segments in the chain, or0if the chain isn't valid.
GetChainLength(): float#
Returns the total length of the IK chain in studs, computed as the sum of
the world-space distances between each consecutive part from the
EndEffector up to the
ChainRoot. This is the maximum reach of the
chain: a Target placed farther than this distance
from the chain's base can't be reached, and the chain extends toward it as
far as it can.
This returns 0 when the IKControl doesn't resolve to a valid
chain, such as when its required properties aren't set.
Returns
float— The combined length of the chain in studs, or0if the chain isn't valid.
GetNodeLocalCFrame(index: int): CFrame#
Returns the CFrame of the node at the given index in the
solved IK chain, relative to its parent node. Nodes are ordered from the
ChainRoot at index 1 to the
EndEffector at
GetChainCount() plus 1.
This reflects the pose most recently produced by the solver. Use
GetNodeWorldCFrame() for the same
node in world space. If the index is outside the valid range, or the
IKControl hasn't resolved a valid chain, this returns the identity
CFrame.
| Name | Type | Default | Description |
|---|---|---|---|
index | int | The 1-based position of the node in the chain, from 1 (the
ChainRoot) up to
GetChainCount() plus 1 (the
EndEffector). |
GetNodeWorldCFrame(index: int): CFrame#
Returns the world-space CFrame of the node at the given index
in the solved IK chain. Nodes are ordered from the
ChainRoot at index 1 to the
EndEffector at
GetChainCount() plus 1.
This reflects the pose most recently produced by the solver. Use
GetNodeLocalCFrame() for the same
node relative to its parent. If the index is outside the valid range, or
the IKControl hasn't resolved a valid chain, this returns the
identity CFrame.
| Name | Type | Default | Description |
|---|---|---|---|
index | int | The 1-based position of the node in the chain, from 1 (the
ChainRoot) up to
GetChainCount() plus 1 (the
EndEffector). |
GetRawFinalTarget(): CFrame#
Returns the CFrame that the solver aims the
EndEffector at on the current frame, before
SmoothTime smoothing is applied. This is the
Target after Weight,
Offset, and
EndEffectorOffset are factored in. For
a LookAt Type, it's the world position the chain
is oriented toward.
Compare with
GetSmoothedFinalTarget(), which
returns the same target after smoothing. The two are equal when
SmoothTime is 0.
GetSmoothedFinalTarget(): CFrame#
Returns the CFrame that the solver aims the
EndEffector at on the current frame, after
SmoothTime smoothing has been applied to the
raw target from GetRawFinalTarget().
Smoothing uses a critically damped spring that eases toward the raw value
over roughly SmoothTime seconds.
Because SmoothTime defaults to 0.05, this
value trails GetRawFinalTarget()
slightly while the target moves. When SmoothTime is 0, this returns
the same CFrame as GetRawFinalTarget.
Inherited members#
Inherited from Instance 58
Properties (10)
Archivable, archivable, Capabilities, IsInSandbox, Name, Parent, PredictionMode, RobloxLocked, Sandboxed, UniqueId
Methods (39)
AddTag, children, ClearAllChildren, Clone, clone, Destroy, destroy, FindFirstAncestor, FindFirstAncestorOfClass, FindFirstAncestorWhichIsA, FindFirstChild, findFirstChild, FindFirstChildOfClass, FindFirstChildWhichIsA, FindFirstDescendant, GetActor, GetAttribute, GetAttributeChangedSignal, GetAttributes, GetChildren, getChildren, GetDebugId, GetDescendants, GetFullName, GetStyled, GetStyledPropertyChangedSignal, GetTags, HasTag, IsAncestorOf, IsDescendantOf, isDescendantOf, IsPropertyModified, QueryDescendants, Remove, remove, RemoveTag, ResetPropertyToDefault, SetAttribute, WaitForChild