Articulation Builder Guide
This guide covers how to build and edit MuJoCo articulations in the Unreal Blueprint editor — both imported from MJCF XML and built from scratch.
Overview
An AMjArticulation Blueprint contains a hierarchy of MuJoCo components that mirror the MJCF XML structure. When placed in a level and simulated, the plugin converts this hierarchy into a MuJoCo spec, compiles it, and runs physics.
The component hierarchy is organized into folders:
ArticulationRoot
├── worldbody (MjWorldBody)
│ └── body1 (MjBody)
│ ├── Geom_Box (MjBox)
│ ├── HingeJoint (MjHingeJoint)
│ └── body2 (MjBody)
│ └── ...
├── DefinitionsRoot
│ ├── DefaultsRoot
│ │ └── main (MjDefault)
│ │ └── robot (MjDefault)
│ ├── ActuatorsRoot
│ │ └── MotorActuator (MjMotorActuator)
│ ├── SensorsRoot
│ │ └── JointposSensor (MjJointPosSensor)
│ ├── TendonsRoot
│ ├── ContactsRoot
│ ├── EqualitiesRoot
│ └── KeyframesRoot
Importing from MJCF XML
- Drag an
.xmlfile into the Content Browser - The plugin auto-converts meshes and generates the Blueprint
- See MJCF Import Guide for details
Building from Scratch
Creating the Blueprint
- Right-click in Content Browser → Blueprint Class → select
MjArticulation - Open the Blueprint editor
Adding Bodies
- In the Components panel, click Add → search for
MjBody - Attach it as a child of
worldbody - Set the body's transform (location/rotation)
- Nest bodies to create kinematic chains (e.g. upper arm → forearm → hand)
Adding Geoms (Collision/Visual Shapes)
- Select a body → Add → choose a geom type:
MjBox,MjSphere,MjCylinder— primitive shapes with built-in visualizersMjMeshGeom— for custom static mesh assets (auto-sets type to Mesh)- Geoms attach as children of bodies
- Set size via the UE scale gizmo (primitives) or assign a mesh asset (mesh geoms)
- Material Override: primitives support an
OverrideMaterialproperty for visual customization
Adding Joints
- Select a body → Add → choose a joint type:
MjHingeJoint— 1-DOF rotationMjSlideJoint— 1-DOF translationMjBallJoint— 3-DOF sphericalMjFreeJoint— 6-DOF (root bodies)- Joints attach as children of the body they actuate
- Configure axis, limits, stiffness, damping in the detail panel
Adding Actuators
- Add → search for actuator type (e.g.
MjMotorActuator,MjPositionActuator) - Actuators are auto-parented to
ActuatorsRootwhen added - Use the Target dropdown in the detail panel to select which joint/tendon/site the actuator controls
Adding Sensors
- Add → search for sensor type (e.g.
MjJointPosSensor,MjTouchSensor) - Sensors are auto-parented to
SensorsRoot - Use the Target dropdown to select what the sensor monitors
Setting Up Default Classes
Default classes define shared properties (friction, damping, etc.) that multiple components can inherit from.
- Add →
MjDefault— auto-parented toDefaultsRoot - The component's variable name in the SCS tree becomes the MuJoCo class name (synced at compile time)
- Add child components under the default to define template values (e.g. add an
MjGeomchild to set default friction) - Nest defaults to create inheritance: drag one default under another in the SCS tree. The parent-child relationship is inferred from the hierarchy.
- On bodies, use the Child Class dropdown to assign a default class to all children
- On individual geoms/joints, use the Default Class dropdown to reference a specific default
Component Reference Dropdowns
Most cross-references between components use dropdown pickers instead of string names:
| Component | Dropdown | Shows |
|---|---|---|
| Actuator | Target | Joints, Tendons, Sites, or Bodies (filtered by Transmission Type) |
| Sensor | Target | Bodies, Joints, Geoms, Sites, etc. (filtered by Object Type) |
| Sensor | Reference | Bodies, Geoms (for relative sensors) |
| Contact Pair | Geom 1/2 | All geom components |
| Contact Exclude | Body 1/2 | All body components |
| Equality | Object 1/2 | Bodies, Joints, or Tendons (filtered by Equality Type) |
| Body | Child Class | All default class components |
| Geom/Joint/etc. | Default Class | All default class components |
The dropdowns read and write the underlying string properties used by MuJoCo spec construction.
Auto-Parenting
When you add certain component types, they are automatically moved to the correct organizational folder:
| Component Type | Auto-Parented To |
|---|---|
| Sensor | SensorsRoot |
| Actuator | ActuatorsRoot |
| Default | DefaultsRoot |
| Tendon | TendonsRoot |
| Contact Pair/Exclude | ContactsRoot |
| Equality | EqualitiesRoot |
Components under DefaultsRoot (default templates) are excluded from auto-parenting — they stay where you put them.
Compiling and Validating
Press Compile in the Blueprint editor to:
- Sync default class names from the SCS variable names
- Sync parent-child default relationships from the SCS hierarchy
- Run ValidateSpec which creates a temporary MuJoCo spec and checks for errors
Compilation errors appear in the Output Log (e.g. missing joint references, invalid ranges).
MuJoCo Outliner
Open Window → MuJoCo Outliner for a filtered view of the articulation:
- BP selector — choose which open articulation to inspect
- Type filters — toggle Bodies, Geoms, Joints, Sensors, Actuators, etc.
- Search — filter by component name
- Click to select — clicking an entry selects it in the Blueprint editor's component tree
- Summary bar — shows component counts
Custom Icons
Each MuJoCo component type has a distinct icon in the component tree:
- Orange — Bodies (bone shape)
- Green — Geoms (box, sphere, cylinder, capsule, mesh, triangle wireframe)
- Blue — Joints (angle arc, arrow, starburst)
- Purple — Sensors (eye shape)
- Red — Actuators (gear)
- Grey — Defaults (document)
- Cyan — Sites (pin marker)
- Teal — Tendons (taut line)
Tips
- Name your components — the SCS variable name is used as the MuJoCo element name. Clear names make debugging easier.
- Use defaults for shared properties — instead of setting friction on every geom, create a default class and reference it.
- Check the Output Log after compile for validation warnings.
- Defaults are hierarchical — nest defaults in the SCS tree to create inheritance chains (child inherits from parent).