Constrain

Apply copy, limit, distance, floor, pivot, aim, and parent constraints to a transform, camera, points, mesh, or skeleton.

What it does

Constrain drives one object's transform from another. The modes are Copy, Limit, Distance, Floor, Pivot, Aim and Parent. Output is a constrained Transform, plus separate position, rotation and distance outputs, wirable into any node's transform input. Source and Target each accept a point, a full transform, a camera, points, or a mesh; meshes and cameras use their object placement, so a viewport camera or a light can be parented to a Cube or a Null. Influence blends between the unconstrained and fully constrained result. Owner Space and Target Space evaluate either side in World or a Local frame, and a connected Space Parent input supplies that Local frame.

With a skeleton connected to Source, Copy, Limit and Aim gain joint awareness: pick a Joint (and a Source Joint for Copy) and the constraint solves per bone, producing a modified skeleton on the skeleton output.

When to use it

ParameterTypeDefaultWhat it does
sourceVec2 or Vec3 or Transform or Camera3D or Collection or GPU Geometry—Value to constrain (Vec2/Vec3, Transform, Camera, Points, Mesh, or Skeleton)
targetVec2 or Vec3 or Transform or Camera3D or Collection or GPU Geometry—Target transform for copy/distance/pivot/aim/parent modes
modeString"parent"Constraint type. One of: copy, limit, distance, floor, pivot, aim, parent.
influenceNumber1Blend between unconstrained and constrained result
affectString"object"Constrain the whole object as one, or every point/instance by its own frame. One of: object, points.
space_parentVec3 or Transform or Collection or GPU Geometry—Frame for Local space (leave unconnected → Local behaves as World)
owner_spaceString"world"Space the owner (source) is evaluated in. One of: world, local.
target_spaceString"world"Space the target is evaluated in. One of: world, local.
copy_posVec3(1, 1, 0)Copy position from target (per axis X/Y/Z)
copy_rotVec3(0, 0, 0)Copy rotation from target (per axis X/Y/Z)
copy_sclVec3(0, 0, 0)Copy scale from target (per axis X/Y/Z)
copy_offsetVec3(0, 0, 0)Additive position offset after copying
mix_modeString"replace"How to combine copied value with source. One of: replace, add, multiply.
limit_channelString"location"Which channel to clamp. One of: location, rotation, scale.
minVec3(-1000, -1000, -1000)Minimum bounds (units / degrees / factor by channel)
maxVec3(1000, 1000, 1000)Maximum bounds (units / degrees / factor by channel)
limit_axisVec3(1, 1, 0)Apply limit per axis (X/Y/Z)
distance_modeString"clamp_inside"Distance constraint behavior. One of: clamp_inside, clamp_outside, exact.
distanceNumber100Distance threshold
floor_axisString"y"Axis for floor constraint. One of: x, y, z, neg_x, neg_y, neg_z.
floor_valueNumber0Floor position on the chosen axis
floor_relative_to_targetBooleanfalseMake the floor plane pass through the target
radiusNumber100Orbit distance from target
azimuthNumber0Orbit azimuth in degrees (around the pole)
elevationNumber0Orbit elevation in degrees (from the orbit plane)
orbit_axisString"z"Orbit pole axis. One of: x, y, z.
aim_axisString"+x"Local axis that points at the target. One of: +x, -x, +y, -y, +z, -z.
aim_up_axisString"+z"Local axis that points toward the up reference. One of: +x, -x, +y, -y, +z, -z.
aim_up_refString"+z"World up reference axis. One of: +x, -x, +y, -y, +z, -z.
track_kindString"damped"Damped Track (shortest arc) or Locked Track (about lock axis). One of: damped, locked.
lock_axisString"+z"Locked-track rotation axis. One of: +x, -x, +y, -y, +z, -z.
aim_stretchBooleanfalseSquash-stretch along the aim axis based on distance to target
aim_stretch_rest_lengthNumber100Distance at which the along-axis stretch scale = 1.0
parent_keep_offsetBooleantrueKeep the current offset when the constraint engages (Set Inverse)
parent_bind_inverseString""—
jointString""Joint name or index to constrain
source_jointString""Source joint name or index to copy rotation from
min_rotationVec3(-180, -180, -180)Minimum joint rotation per axis (degrees)
max_rotationVec3(180, 180, 180)Maximum joint rotation per axis (degrees)

Gotchas

Target appears only for Copy, Distance, Pivot, Aim and Parent. Limit and Floor constrain Source against fixed values, so Target stays hidden and unused in those modes.

The Joint and Source Joint dropdowns populate only once a skeleton (Points carrying joint names) is connected to Source. Until then they show "(connect skeleton)".

Parent mode's keep-offset bind is captured once, automatically, the first time the constraint engages, then frozen. It does not follow later changes to Target. If the parented object jumps back to a stale offset after Target moves, disconnect and reconnect Source to re-capture the bind.

Worked example

  1. Add a Constrain node. Wire the object to drive into Source, and the object to follow into Target.

  2. Set Mode to Copy, then enable Copy Position (and Rotation or Scale as needed) to pick which channels transfer.

  3. Wire the transform output into the driven object's transform input, and dial Influence down from 1.0 to blend the constraint in gradually.

See also

Mirror · Spring · Transform · Scene values