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
One object sitting at, tracking, or inheriting part of another's transform: the classic Copy or Child Of rig constraint.
Clamping position, rotation or scale to a box (Limit).
Holding an object within, outside, or exactly at a distance from a target (Distance): leashes, orbit radii, proximity triggers.
Stopping an object at a ground plane (Floor), orbiting a point at a fixed radius (Pivot), or facing a target (Aim, with optional squash-stretch toward it).
Parenting one object to another while keeping its current offset (Parent, Maintain Offset).
A single named joint constrained inside a skeleton rig.
| Parameter | Type | Default | What it does |
|---|---|---|---|
source | Vec2 or Vec3 or Transform or Camera3D or Collection or GPU Geometry | — | Value to constrain (Vec2/Vec3, Transform, Camera, Points, Mesh, or Skeleton) |
target | Vec2 or Vec3 or Transform or Camera3D or Collection or GPU Geometry | — | Target transform for copy/distance/pivot/aim/parent modes |
mode | String | "parent" | Constraint type. One of: copy, limit, distance, floor, pivot, aim, parent. |
influence | Number | 1 | Blend between unconstrained and constrained result |
affect | String | "object" | Constrain the whole object as one, or every point/instance by its own frame. One of: object, points. |
space_parent | Vec3 or Transform or Collection or GPU Geometry | — | Frame for Local space (leave unconnected → Local behaves as World) |
owner_space | String | "world" | Space the owner (source) is evaluated in. One of: world, local. |
target_space | String | "world" | Space the target is evaluated in. One of: world, local. |
copy_pos | Vec3 | (1, 1, 0) | Copy position from target (per axis X/Y/Z) |
copy_rot | Vec3 | (0, 0, 0) | Copy rotation from target (per axis X/Y/Z) |
copy_scl | Vec3 | (0, 0, 0) | Copy scale from target (per axis X/Y/Z) |
copy_offset | Vec3 | (0, 0, 0) | Additive position offset after copying |
mix_mode | String | "replace" | How to combine copied value with source. One of: replace, add, multiply. |
limit_channel | String | "location" | Which channel to clamp. One of: location, rotation, scale. |
min | Vec3 | (-1000, -1000, -1000) | Minimum bounds (units / degrees / factor by channel) |
max | Vec3 | (1000, 1000, 1000) | Maximum bounds (units / degrees / factor by channel) |
limit_axis | Vec3 | (1, 1, 0) | Apply limit per axis (X/Y/Z) |
distance_mode | String | "clamp_inside" | Distance constraint behavior. One of: clamp_inside, clamp_outside, exact. |
distance | Number | 100 | Distance threshold |
floor_axis | String | "y" | Axis for floor constraint. One of: x, y, z, neg_x, neg_y, neg_z. |
floor_value | Number | 0 | Floor position on the chosen axis |
floor_relative_to_target | Boolean | false | Make the floor plane pass through the target |
radius | Number | 100 | Orbit distance from target |
azimuth | Number | 0 | Orbit azimuth in degrees (around the pole) |
elevation | Number | 0 | Orbit elevation in degrees (from the orbit plane) |
orbit_axis | String | "z" | Orbit pole axis. One of: x, y, z. |
aim_axis | String | "+x" | Local axis that points at the target. One of: +x, -x, +y, -y, +z, -z. |
aim_up_axis | String | "+z" | Local axis that points toward the up reference. One of: +x, -x, +y, -y, +z, -z. |
aim_up_ref | String | "+z" | World up reference axis. One of: +x, -x, +y, -y, +z, -z. |
track_kind | String | "damped" | Damped Track (shortest arc) or Locked Track (about lock axis). One of: damped, locked. |
lock_axis | String | "+z" | Locked-track rotation axis. One of: +x, -x, +y, -y, +z, -z. |
aim_stretch | Boolean | false | Squash-stretch along the aim axis based on distance to target |
aim_stretch_rest_length | Number | 100 | Distance at which the along-axis stretch scale = 1.0 |
parent_keep_offset | Boolean | true | Keep the current offset when the constraint engages (Set Inverse) |
parent_bind_inverse | String | "" | — |
joint | String | "" | Joint name or index to constrain |
source_joint | String | "" | Source joint name or index to copy rotation from |
min_rotation | Vec3 | (-180, -180, -180) | Minimum joint rotation per axis (degrees) |
max_rotation | Vec3 | (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
Add a Constrain node. Wire the object to drive into Source, and the object to follow into Target.
Set Mode to Copy, then enable Copy Position (and Rotation or Scale as needed) to pick which channels transfer.
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