Skip to content

Rigid-Body Mechanisms

Commercial

Included in the public demo Compare editions

A Delta picker open in the editor: the tree on the left shows the three driven arm axes above a DeltaMechanism node whose whole subtree is Kinematic Joints — revolute, universal and spherical — and the Kinematics list on the right holds the arms, the platform, the rods and the shaft as separate bodies

A rigid-body mechanism is a set of links connected by joints that solve together as one system. Unlike a chain of parent-child rotations, this supports closed loops such as four-bar couplers, scissor lifts and Delta platforms. In a closed loop, a link must satisfy two joints at once and cannot be the hierarchy child of both.

Two components make up a mechanism:

  • A Mechanism collects every joint in its subtree and runs the solver once per tick. It uses a bounded, damped Newton-Raphson iteration to satisfy every joint simultaneously.
  • A Joint is one constraint between two links: Revolute, Prismatic, Spherical or Universal, with an anchor point and axis. Give a joint a Drive and it becomes a boundary condition the mechanism solves around; leave it undriven and the solver works out its value from the others.

An optional third component, a Target, runs the solve backwards. It moves a mechanism’s driven joints so that one of its links follows a point in space. For example, you can move a Delta picker by dragging its platform rather than its three motors.

You get a mechanism one of two ways:

  • Build it in Unity. Use KinematicMechanism, KinematicJoint and KinematicTarget (Professional) as you would other kinematics. Export to GLB and the mechanism runs identically in the viewer. Standalone simulation and Live mode both use the same solver as Unity.
  • Build it in the browser. Use the Mechanism (Rigid-Body) section in Quick Edit to build directly on raw, unkinematized CAD, without a Unity round-trip. Quick Edit is part of the Editor, so browser authoring requires the Editor.

The older Kinematics section in Quick Edit groups parts onto a single moving axis inside the existing hierarchy — the right tool for a hinge, a slide or a turntable. A mechanism instead solves a graph of joints, which is the only way to express a loop that closes back on itself. The two panels are intentionally kept apart and share no components: if what you’re building has one clear moving axis, use Kinematics; if it has a closed loop or several joints that move together, use Mechanism.

Kinematics or Mechanism Kinematics is a hierarchy where each moving part has one parent axis. A mechanism is a graph of joints that may close a loop, like a four-bar linkage: one driven joint, the other joints passive and solved, two of them anchored against the world. Kinematics a chain in the hierarchy Base Axis 1 · Drive Axis 2 · Drive Gripper each part has one parent: no loop Mechanism a graph of joints, loops allowed driven joint passive joints, solved Body A empty = anchored to the world crank coupler rocker
One clear moving axis: Kinematics. A loop that closes back on itself, or several joints that move together: Mechanism.
PropertyDescription
Solver IterationsFixed number of Newton-Raphson iterations per tick (default 4). Kept constant for a deterministic solve.
DampingDamped-least-squares factor that keeps the solve stable near a singular configuration (default 0.01).
ToleranceConstraint residual, in millimeters, below which the solve counts as converged (default 0.001 mm).
ConvergedRead-only. True when the last solve met the tolerance.
Residual ErrorRead-only. The largest constraint error left after the last solve, in millimeters.

One driven arm of the Delta selected: the parts that move with it are highlighted in magenta, a dashed line marks its rotation axis through the pivot gizmo, and the chips above the panel list what the node carries — Kinematic, Drive, Drive_ErraticPosition, NodeKnowledge and MechanismBody. The curved orange arrow is drawn on top of the screenshot to show the direction of travel; it is not part of the interface

PropertyDescription
Joint TypeRevolute, Prismatic, Spherical or Universal. Only Revolute and Prismatic have a single scalar value, so only they can carry limits or a Drive.
Body A / Body BThe two links the joint connects. Leave Body A empty to anchor the joint in world space. This fixes the mechanism to the machine frame instead of another moving link. Body B is always required.
Anchor A / Anchor BThe joint’s pivot point, in each body’s own local space, in millimeters. The two should coincide in world space.
Axis AThe joint axis, in Body A’s local space. Unused by Spherical.
Secondary Axis BA second axis in Body B’s local space, used only by Universal joints.
Use Limits / Lower / Upper LimitClamps the joint value in degrees (Revolute) or millimeters (Prismatic).
Driven ByThe Drive that moves this joint. Leave it empty for a passive joint the mechanism solves for.
Current ValueRead-only. The joint’s live value, written by the solver every tick.
PropertyDescription
MechanismThe mechanism whose driven joints this target solves for.
Target LinkThe mechanism’s own link that should follow this node — a Delta platform, for example.
Tracking ActiveWhile on, an inverse solve runs every tick and takes over the mechanism’s Drives.
ReachableRead-only. False when the target is outside the workspace or a limit was hit — the mechanism still moves to the closest pose it can reach.

From Unity

  1. Build the mechanism with KinematicMechanism and KinematicJoint components, the same way as any Professional kinematics.
  2. Export the scene to GLB.
  3. Open the model in realvirtual — the mechanism forward-solves exactly as it did in Unity, driven by the same Drives, in both Standalone and Live mode.

From the browser (Quick Edit)

  1. Import the raw CAD and select the links you want to connect.
  2. Open Mechanism (Rigid-Body) in Quick Edit and click + Mechanism.
  3. Add a joint, pick its type, then click Body A and Body B directly in the 3D view. Hover to highlight snap candidates (face centers, edges, circle centers) before you commit. Leaving Body A unset anchors the joint to the world.
  4. Assign a Drive to the joint you want to move.
  5. Validate and clear anything the findings list flags.
  6. Jog the driven joint with its slider and watch the mechanism move under the real solver.
  7. Save. The mechanism is part of the asset now, ready to place in a layout like any other component.

Assigning a Drive takes effect immediately: the running mechanism picks the Drive up on the next tick, so you can jog the joint straight away without reloading the model.

Snapping also reads curved surfaces. Hovering a bore or a cylindrical wall fits its axis and radius, so a revolute joint lands on the hole’s centerline instead of on the nearest flat feature — and when a bore and the boss around it are both under the cursor, the bore wins.

Every joint with a problem gets a warning next to it, naming the finding it triggered. Findings include a missing Body B, anchors that don’t coincide, and a Drive whose axis doesn’t match the joint. Where a fix is unambiguous, a Snap button applies it directly. Other findings provide a diagnosis without an automatic fix.

The Jog slider runs the actual solver, not a preview animation. The convergence flag and residual reflect runtime behaviour. A configuration that doesn’t converge colors the joint and shows the finding code responsible. This reveals limit conflicts or unreachable anchors while you build, before you save.

The Drive Forces panel open on the Delta during a recording: actuator torque in N·m over time for the three revolute joints, one colour per joint with a legend and a range slider under the chart, switches for Include bearing loads and Force arrows in 3D, a REC indicator counting the seconds, and a table giving each joint its peak, RMS and hold figures — hold still empty while the run is going. Below it the buttons to stop or pause the run and to compute the holding forces. The curved orange arrow in the 3D view behind the panel is drawn on top of the screenshot, not part of the interface

The same solver computes an actuator force or torque for every driven joint and a bearing load for every joint. Force analysis does not affect motion or change any pose.

Force analysis needs to know what it is moving, so every link of the mechanism needs a Body. Open the mechanism in Quick Edit and each link gets a row with an Add Body button:

PropertyDescription
Density PresetSteel, aluminum, stainless, PA, POM or a custom value. The mass is computed from the link’s geometry and this density.
MassRead-only unless pinned. Shows the computed mass and how it was obtained — a value marked (estimated) came from a bounding box because the geometry was not closed.
Pin massReplaces the computed mass with the value you enter. Use it for a payload, for a part whose CAD is a placeholder, or for a link that carries no geometry at all.
COMThe center of mass in the link’s own coordinates. Pin it when the model omits something heavy — a motor, a cable carrier.

Mass values follow two rules:

  • The mass is never guessed silently. If a link’s geometry is open, self-intersecting or missing, the row says so and the value is labeled as an estimate.
  • One link without a usable mass switches the analysis off for the whole mechanism, and the findings list says which one. A partial result would mislead: a drive sized for a machine without its heaviest link will not fit.

A centre of mass in a rotated, nested link’s own coordinates is hard to check by eye. The numbers alone do not show whether the position is correct. The mechanism section shows the mass in 3D, with two independent switches in its header:

  • Link COMs puts a small marker at every link’s centre of mass. Its style shows the source: filled for a mass computed from closed geometry, hollow for a bounding-box estimate. A pinned value has its own colour. A dashed ring marks a link that belongs to more than one mechanism. The marker’s screen size stays constant regardless of mass or zoom. It shows position, not mass.
  • Total COG marks the whole mechanism’s centre of gravity with the quartered-circle symbol used on drawings. It also displays the value beside the switches: 184.62 kg · COG (12.4, 630.1, -3.8) mm · from 7 of 9 links. This is the centre of gravity used for tipping safety, lifting points and floor loading. It follows the mechanism as it moves.

The total reports missing data, estimates and ambiguity:

  • It is computed only from links that have a positive mass and a usable centre of mass. The readout counts contributing links (from 7 of 9 links) and names excluded links. Hover to see the reason: no body, no mass, or a pinned mass without geometry and a known centre of mass.
  • If any contributing link is an estimate, the total is marked ~estimated. Pinning a centre of mass does not remove the mass’s estimated status.
  • A link shared between two mechanisms makes the total ambiguous, because each mechanism computes that link’s geometry against its own set of neighbours.

The readout is always there; the markers only while you switch them on. Over MCP, web_query("mechanism.inspect", {}) returns the same figures as cog on every mechanism, together with each link’s comLocalMm, so an agent can check a mass assignment without a screenshot.

Open Forces under the mechanism and press Test in the editor toolbar. The recording starts with the test run and ends when you stop it. The last cycle stays on screen so you can read it afterwards.

  • The chart plots every driven joint at once, with one colour per joint and a legend underneath. It shows actuator torque for a rotary joint and force for a linear one. Include bearing loads adds the bearing series, with their number in brackets.
  • Peak is the largest magnitude over the cycle: the load a drive must withstand once.
  • RMS is the effective value over the cycle, weighted by real elapsed time: the load a drive must withstand continuously.
  • Hold is the holding torque in the current pose. It comes only from Compute holding forces, never from the recording, so the Hold column stays empty during a run. Velocity passing through zero does not mean the machine is standing still.

Both reference lines are drawn on the chart, so you can see at a glance whether a cycle is a short spike on a light duty or a sustained load.

Compute holding forces calculates the forces needed to hold the current pose under gravity, with nothing moving. It needs no recording or test run. Use it to check a lifting axis or counterweight while building the machine.

Tick Force arrows in 3D and every joint gets an arrow along its reaction force. Arrow length is capped, and color shows magnitude. Linear scaling would extend heavily loaded joints’ arrows off screen and make the others too small to see. Hover over an arrow to read its value; click it to select that joint’s series in the chart. The arrows disappear when you leave the editor.

  • The mechanism solver computes no contact, cutting/process or friction forces. With rigid-body physics enabled, Rapier measures contact loads on mechanism links and feeds them into force analysis one simulation step late, shown in the Ext. load column (N). These loads never change poses. Cutting/process forces and friction remain unmodeled. Without physics, you represent a payload as an added mass on the link that carries it.
  • Where a mechanism is over-actuated (more drives than degrees of freedom in a loop), the force split is not physically unique. The panel reports this instead of choosing a split between the drives.
  • Gravity is standard, along −Y. A tilted installation is not yet configurable.

A drive that ramps with a constant acceleration changes that acceleration instantly at the start and end of the ramp. On a real machine that step is what shakes the structure, marks the product and wears the gearbox. Smooth motion replaces the trapezoidal ramp with a jerk-limited S-curve, so acceleration itself rises and falls at a bounded rate.

It is set on the drive, not on the mechanism, and applies just as much to an ordinary axis as to a joint the solver drives:

PropertyDescription
Use AccelerationThe existing acceleration ramp. Smooth motion is a sub-setting of it and does nothing on its own.
Smooth AccelerationSwitches the jerk-limited S-curve on in place of the trapezoidal ramp.
JerkThe rate of change of acceleration, in mm/s³ for linear drives and deg/s³ for rotary ones. Lower is gentler and slower; higher approaches the hard trapezoidal ramp.
Speed OverrideA factor on this drive’s speed, multiplied with the global simulation speed. It scales the time through the profile rather than the limits, so setting it to 0 pauses and resuming never makes the position jump.

Unity and the browser share the same numerical core and S-curve implementation. A machine tuned in Unity therefore moves identically here.

Where it is not available, a drive asking for smooth motion keeps running the familiar trapezoidal ramp and the viewer warns once for the model rather than once per drive. The model stays fully usable; it simply does not get jerk limiting. Endless rotary axes that wrap at their limits stay continuous across the wrap either way.

Any drive can carry a drive behaviour, whether it moves a mechanism joint or an ordinary axis.

Erratic Position moves a drive to random positions between a minimum and a maximum. Use it to keep an axis moving during a demonstration or load test.

Its range is clamped to the drive’s own travel limits. Previously, a range extending beyond those limits left the axis waiting indefinitely for an unreachable position. Now each target is clamped when selected, and the viewer warns you to correct the authored range. Return-to-zero on a falling enable signal is clamped the same way, including when the axis limits exclude zero.

  • Scissor Lift Table – A prismatic drive raises a platform through a chain of pivoting links.
  • Four-Bar Gripper – A single drive closes both jaws through a coupler link, keeping them synchronized without a second motor.
  • Delta Picker – Three arms constrain a platform to a Cartesian workspace; a Target lets you place the platform directly instead of driving each arm.
  • Slider-Crank – A rotary drive converts to linear motion (or back), the classic Prismatic + Revolute loop.