MuJoCo 3.12.0 Release Notes
3.12.0
MuJoCo 3.12.0 introduces a unified MJCF schema, PID actuators, and improved collision detection. Key changes include texture format updates and actuator control enhancements.
Evidence and limits
Published automatically after robotics and source-evidence checks; no manual editorial approval is recorded. Source assertions are not independently verified. Missing information remains not reported.
- Environment:
- Not reported
- Control:
- Not reported
- Data origin:
- Not reported
Source excerpts and review record
No manual editorial approval recorded.
Original source quotation: “Version 3.12.0 (August 20, 2026) General 3f8db4c1 The MJCF grammar is now defined in a single source of truth schema file, src/xml/mjcf.schema .”
Source E1
Original source quotation: “The parser's grammar table, presence constraints, keyword maps, typed attribute bindings and save policies are generated from it and gated by tests, as are the schema's enum keywords and declared defaults against the C headers and default-constructors.”
Source E2
Original source quotation: “Warning Breaking API changes 2. 6fe04aa8 Removed the custom binary texture format ( image/vnd.mujoco.texture ) and the automatic fallback to custom textures when loading files with unrecognized extensions.”
Source E3
Original source quotation: “Textures can now only be loaded from PNG ( image/png ) and KTX ( image/ktx ) files.”
Source E4
Original source quotation: “Actuation 279df98c Added the pid actuator: a PID controller with real position and velocity setpoint inputs, optional integral action ( ki , integrating the position error with imax anti-windup), setpoint rate limiting ( slewmax ), and an optional feedforward input.”
Source E5
Original source quotation: “This subsumes the functionality of the mujoco.pid plugin with proper activation state: correct under all integrators and visible to keyframes and sensors.”
Source E6
Original source quotation: “With a zero velocity setpoint it is identical to position . The input signature is any subset of [pos, vel, ff] , selected by input ; absent setpoint inputs are fixed at zero, so the control vector contains no inert entries.”
Source E7
Original source quotation: “2f1843f4 The dcmotor on-board controller is redesigned: the input attribute selects any subset of [pos, vel, ff, voltage] , where pos and vel are setpoints for the controller, ff is a torque feedforward, and voltage is the raw terminal voltage (the default, a plain voltage-commanded motor).”
Source E8
Original source quotation: “Controller gains are in torque space, as for pid , and the drive voltage compensates back-EMF as in a current-controlled driver: commanded torque is delivered exactly until a limit is reached.”
Source E9
Original source quotation: “The keyword input="none" selects the empty signature: the actuator has no control inputs and is purely passive, so friction, cogging and back-EMF braking can be used as passive joint forces.”
Source E10
Original source quotation: “Warning Breaking API changes 5. 2f1843f4 The mode-flag semantics of dcmotor/input ("voltage", "position", "velocity", selecting the interpretation of a single control) are replaced by input signatures, and the controller gains changed from voltage space to torque space.”
Source E11
Original source quotation: “The old velocity mode's integral term (integrated-velocity tracking) is retired without replacement; the integrator always accumulates position error.”
Source E12
Original source quotation: “Migration: Voltage-commanded motors (the default) are unchanged. Replace input="position" with input="pos" and input="velocity" with input="vel" , and multiply the controller gains by $K/R$ (torque per volt).”
Source E13
Original source quotation: “The motor's back-EMF damping, previously felt in addition to the controller's damping, is now compensated: to preserve behavior when the velocity setpoint is zero, add $K^2/R$ to the converted kd .”
Source E14
Original source quotation: “Engine 83e621d7 Optimized large-mesh convex collision detection with up to 2x speedup in certain cases.”
Source E15
Original source quotation: “55d13aec Replaced the per-step sparse Cholesky factorization of the flex block of the implicit effective metric M + K with its prefactored per-vertex 3x3 diagonal blocks.”
Source E16
Original source quotation: “The blocks precondition the CG constraint solver and drive an iterative solve for qacc_smooth , which now converges on tolerance rather than a fixed threshold.”
Source E17
Original source quotation: “Flexes with elastic2d stretch stiffness step roughly twice as fast; bending-only flexes keep the exact constant factor and are unchanged.”
Source E18
Original source quotation: “86e98601 Rewrote cleaner box-box SAT collider.”
Source E19
Original source quotation: “Warning Breaking API changes 9. 2a3554c8 Contacts of a flex with passive collisions are now integrated implicitly: their stiffness is carried by the effective metric rather than applied as an explicit spring, and can be far stiffer than the timestep would otherwise permit.”
Source E20
Original source quotation: “Models using passive collisions should be re-checked: the feature now requires implicit or implicitfast with the CG solver, pyramidal cones and sleep disabled; passive handling covers flex-flex, self-, and static-geometry contact, while contact with a moving body stays on the constraint solver;”
Source E21
Original source quotation: “and the stiffness is now a mass-scaled natural frequency rather than a fixed 1e4.”
Source E22
Original source quotation: “10. 55d13aec Removed mjData.efm_L_rownnz , mjData.efm_L_rowadr and mjData.efm_L_colind . They described the sparsity of the effective-metric Cholesky factor, which no longer exists; mjData.efm_L now holds dense 3x3 blocks, 9 numbers per covered vertex.”
Source E23
Original source quotation: “mjData.efm_active no longer takes the value 2: nothing selects a solve path on preconditioner exactness, so it is now a plain 0/1 flag.”
Source E24
Original source quotation: “11. 1362a8bd Changed the default value of bvactive from "true" to "false". This avoids unnecessarily clearing bounding volume hierarchy visualization flags at every simulation step, which can be a bottleneck for models with large meshes.”
Source E25
Original source quotation: “12. ed13bf56 Mocap bodies and their dof-less descendants are now the root of their own weld group: mjModel.body_weldid of a mocap body equals its own id rather than 0.”
Source E26
Original source quotation: “Consequences: dragging a mocap body into sleeping objects now wakes them; children of mocap bodies receive standard parent-child collision filtering ; mocap bodies no longer count as static geometry for ray casting, and contact-matching sensors aggregate their contacts under the mocap body rather than the world;”
Source E27
Original source quotation: “and geom pairs where neither body can move no longer generate contacts.”
Source E28
Original source quotation: “Models 2a3554c8 Added drape example model: three cloths draped over a sphere, demonstrating passive collisions. It replaces the sphere_passive model, which has been removed.”
Source E29
Original source quotation: “55d13aec Added bag example model: a cloth bag, held open by pinning the ring of vertices around its mouth, catching the standard humanoid dropped in from above.”
Source E30
Original source quotation: “Unlike the poncho models, which are bending-only, this model exercises the 2D stretch elasticity of a flex.”
Source E31
Original source quotation: “Rendering Warning Breaking API changes cc7fb98c Added explicit texture coordinates to built-in geometries (Plane, Box, Sphere, Ellipsoid, Capsule, Cylinder) in both the Classic renderer and Filament.”
Source E32
Original source quotation: “2D textures applied to primitive shapes will look different as textures are mapped using canonical UV parameterizations rather than projecting onto the $x,y$ plane.”
Source E33
Original source quotation: “For finite planes, textures are now anchored to the bottom-left corner instead of the center. This will cause the most common visual breakage, as common procedural checker textures will be phase shifted.”
Source E34
Original source quotation: “Infinite planes continue to be anchored at the origin with no visual changes.”
Source E35
Original source quotation: “f9a00bd5 Added light/softness : edge softness for spotlights under physically-based lighting models, given as the fraction of the cone over which intensity falls to zero.”
Source E36
Original source quotation: “The default of 0.2 is a semi-soft cone which delivers the full intensity everywhere inside it, so that illuminance follows $E = I/d^2$ independent of the cutoff angle.”
Source E37
Original source quotation: “Previously the filament renderer treated the entire cone as penumbra, dimming spotlights well below their rated intensity, increasingly so for narrow cutoffs.”
Source E38
Original source quotation: “Migration: Set softness to 1 to reproduce the previous appearance of existing models.”
Source E39
Original source quotation: “MJX Warning Breaking API changes 17. 5e3464f4 mjx.render and mjx.render_with_segmentation now return the updated mjx.Data as the last element in their return tuple (i.e. (rgb, depth, d) and (rgb, depth, seg, d) ).”
Source E40
Original source quotation: “This ensures JAX/XLA strictly enforces causal scheduling between sequential refit_bvh and render calls.”
Source E41
Original source quotation: “**Migration:** Update unpacking calls from `pixels, depth = mjx.render(mx, d, rc)` to `pixels, depth, d = mjx.render(mx, d, rc)`.”
Source E42
Original source quotation: “Bug fixes 95539261 Fixed a bug where models with pinned interpolated flex nodes (e.g. a flexcomp with dof "trilinear" and pinned vertices) could not be reloaded after saving: node coordinates within their body frames were not saved, degenerating the interpolation grid.”
Source E43
Original source quotation: “They are now saved in the new flex nodecoord attribute.”
Source E44
Original source quotation: “8655446f Fixed a bug in the box-box collider where near-degenerate face clipping could generate contacts with spuriously large penetration depth between nearly touching thin boxes with positive margin, causing resting stacks to explode.”
Source E45
Original source quotation: “fb07a9ca Fixed a bug in the box-box collider where penetrations deeper than a box's smallest half-size could produce no contacts, letting boxes tunnel through thin boxes.”
Source E46
Original source quotation: “Fixes #1800 . 54979947 Fixed the flex stretch stiffness operator, which was the Gauss-Newton Hessian of the stretch force rather than its Jacobian: the geometric (stress-proportional) term was missing.”
Source E47
Original source quotation: “Only the tensile part of that term is added, since it is positive semi-definite exactly when the edge is in tension, and its consumers require an SPD operator; the stretch force itself is unchanged.”
Source E48
Original source quotation: “This affects the implicit integrators and the implicit effective metric, so flexes using elastic2d="stretch" integrate slightly differently. Bending-only flexes are unaffected.”
Source E49
Original source quotation: “OpenUSD 39e44588 Upgraded Newton USD schemas support to version 0.4.0: NewtonJointAPI ( newton:armature , newton:damping , newton:friction ) deprecates the MjcJointAPI equivalent mjc:armature , mjc:damping , and mjc:frictionloss attributes.”
Source E50
Source:MuJoCo — Releases · github.com