Releases: google-deepmind/mujoco
Release list
3.14.0
Version 3.14.0 (September 22, 2026)
General
-
458189298Added theipcflag, an experimental contact mode of thediscrete
integrator for penetration-free flex contact. Each step minimizes an incremental potential subject to linearized
contact constraints, using a barrier-free augmented Lagrangian whose subproblems are the discrete solve. Every
committed position update is verified intersection-free by continuous collision detection, so flex contact cannot
tunnel. Supported for dim-2 flexes: a flex with edge equality constraints keeps its elasticity in the constraint
solver, whileelastic2delasticity is integrated implicitly through the effective metric. The contacts the mode
resolves are frictionless. The mode keeps contact multipliers across steps that no state specification covers, so
mj_getState/mj_setStatedo not capture its full state and exact replay is not supported. -
2fec92237Introduced archive resource providers
(mjp_registerArchiveResourceProvider). Archive providers use the
mjpResourceProviderinterface to mount and read archive containers (such as
.mjz/.zip), decoupling container handling from format decoders and enabling
on-demand asset extraction without requiring a pre-allocated VFS. -
e312ce82dFrames are now preserved when saving MJCF:<frame>elements are written with
theirposandquatand their contents in frame-relative coordinates, so a saved model reloads with the same
frames. Previously the frame transformation was accumulated into the children on save and only the frame's name was
kept. Changes to theposorquatof a frame in anmjSpecnow also take effect when the spec is
recompiled.
Engine
Warning
Breaking API changes
dc8bb1364mj_readCtrlnow matches the signature and semantics ofmj_readSensorto support
multi-input actuators (e.g., pid, dcmotor,
orientation): it takes an output bufferresultof sizeactuator_ctrlnum[id]
and returnsconst mjtNum*(a pointer intomjData.ctrlormjData.historyon zero-order-hold or exact
timestamp matches, orNULLwhen interpolated values are written toresult). Actuator history buffers now
storeactuator_ctrlnum[id]values per sample, andmj_initCtrlHistoryexpectsnsample * actuator_ctrlnum[id]values (#3597).
-
9e0c6b577The mjWARN_INERTIA warning is now also raised by the modified-inertia
factorizations of theimplicitfastand damped-Eulerintegrators (previously silent) and of the
implicitintegrator (previously a fatal error). -
35c0631deThe sparse Newton solver no longer aborts with a "rank-deficient sparse Hessian" error when
rounding loses a pivot of its Hessian, as can happen in single precision with ill-conditioned inertia. The pivot is
now clamped and its row decoupled, as in the dense factorization.
Bug fixes
2a3f1f5a4Procedural model editing is no longer quadratic in the number of elements.mjSpecpreviously
recomputed the compilation signature on everymjs_addGeom-like call, andmjs_setNamerescanned every
name of the element's type. Both are now incremental. Building a spec with 8000 geoms is roughly 10x faster.
Warning
Breaking API changes
mjsElement.signature is now 0 whenever the spec has been structurally edited since it was last compiled,
rather than being eagerly recomputed on each edit. It is still equal to mjModel.signature after a successful
mj_compile, which is what mj_copyBack and the Python bind methods rely on. Code that compared the
signature of an uncompiled spec against anything other than 0 must compile first. Additionally, when
mjs_setName fails on a duplicate name, the element's previous name is now preserved rather than being
overwritten with the duplicate name.
-
ac329bd17Fixed the torque applied by weld constraints in
mj_rnePostConstraint. The rotational constraint force was used directly as a world-frame torque, missing the
scaling by0.5 * torquescaleand the rotation into the world frame. Force and
torque sensors on bodies held by a weld that carries torque were wrong (#2533). -
263c638c0mj_rnePostConstraintnow accounts for the forces of spatial tendons (spring, damper,
actuator, limit, friction loss, equality and armature), so force and
torque sensors register the forces that tendons apply to bodies (#832). -
eb662fcafTendon actuatorfrclimited now defaults to "auto" as
documented. Previously the default was "false" andactuatorfrcrangewas silently ignored unless
actuatorfrclimitedwas set explicitly. -
54be9cce6mjd_transitionFDandmjd_inverseFDnow raise an error when
sleeping is enabled. Previously, their repeated evaluations changed the sleep state, leading to
internal errors or wrong derivatives. -
e38573c64Fixed a memory leak inmjs_deletewhere deleted elements and subtrees were retained in
mjSpecuntilmj_deleteSpec(#2882). -
65ea54c3cFixed an out-of-bounds read when parsing the header of a GMSH file loaded
by flexcomp. Truncated headers are now reported as an error.
3.13.0
Version 3.13.0 (September 8, 2026)
General
-
eb18d77caThe .mjz encoder now writes the root file asmodel.xmlin the archive as
this is less susceptible to breakage due to file renaming. -
4affbb64aSite geometries can now also be associated with meshes (type="mesh" with
mesh="name"), supporting visualization, the insidesite
sensor, and the newmj_insideSitefunction. -
b59b07faeAdded support for Python 3.15 (GIL and Free-Threading).
Engine
-
5660353ecAdded a new integratordiscrete: the constraint solve and the implicit velocity update merge
into one operation, performed in the effective metric$\widehat{M} = M + hD + h^2K$ , which incorporates both
implicit damping$hD$ and implicit position stiffness$h^2 K$ . Under this integratormjData.qaccis
the discrete step map$(v^+ - v)/h$ , and joint, tendon and actuator stiffness and damping join the solver's
metric, making passive springs and actuator position gains stable at timesteps far beyond the explicit stability
limit. Constraint rows are treated implicitly as well:solrefspring--dampers are evaluated at the end of the
step, so constraints are stable at anytimeconst; under this integrator the refsafe
flag replaces contact and limit rows stiffer than the timestep can resolve by the stiffest zero-restitution row
instead of clampingtimeconst. The actuator-gain treatment resolves the stiff-servo timestep limitation of
#3443 (analysis contributed by @qiayuanl). See the
integrator documentation for semantics and current limitations.
Warning
Breaking API changes
Removed the implicit flex effective-metric special case under implicit/implicitfast with the CG
solver, introduced in 3.11.0. This behavior now requires integrator="discrete" (with a primal solver:
CG or Newton), which additionally treats joint damping and stiffness implicitly inside the solve. Models
relying on the old behavior should set integrator to discrete; models with flex
elasticity or passive flex contact under implicit/implicitfast now raise a runtime error carrying this
migration note.
-
0b4e17747Restored clamping of non-positive pivots in the sparse inertia factorization, along with the
associatedmjWARN_INERTIAwarning. The guard was inadvertently dropped in the 3.3.0 conversion ofqLDto CSR
format; since then, models with singular mass matrices silently produced non-finite accelerations, typically
surfacing as divergence warnings and automatic resets. -
c9d997610Added single-shot multicontact for collisions with cylinder geoms. -
10eeb8289The Newton solver with elliptic cones now rebuilds the cone-augmented Hessian
factor with a single refactorization instead of per-contact rank-1 updates when a flop-count model predicts this is
faster. Scenes with many simultaneously sliding contacts speed up by 1.4-2x on average and 3-4x on the slowest steps.
Contribution by @kevinzakka.
Compiler
-
2a3957558Custom text fields (custom/text) in MJCF now accept their values inside a
<![CDATA[ ... ]]>block in addition to thedataattribute. When saving a model viamj_saveXML, custom
text containing newlines or XML characters is exported as CDATA. -
47ebfe48aAdded cutoff attribute to sensor/tactile.
Samples
834983fbbAdded render.cc: a headless offscreen rendering sample that saves an image to a
PNG image. Supports both the Filament and classic OpenGL backends, with command-line options for camera, resolution,
keyframe, simulation steps, geom/site groups, visualization and rendering flags, labels, and frames.
Bug fixes
Models
f6c1004b7Added house of cards
example model and three free-standing arch
models: roman, gothic, and hyperbolic. Inspired by Song et al.
Rendering
Warning
Breaking API changes
cb57b526fFor materials with physically-based rendering parameters that do not provide a metallic
texture the fallback is now white. Previously the fallback was black, which caused scalar metallic values to be
discarded when multiplied in the PBR shader.
3.12.0
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. 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.
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. Textures can now only be loaded from PNG (image/png) and KTX (image/ktx) files.
Actuation
- 279df98c Added the
pidactuator: a PID controller with real position and velocity setpoint inputs, optional integral action (ki, integrating the position error withimaxanti-windup), setpoint rate limiting (slewmax), and an optional feedforward input. This subsumes the functionality of themujoco.pidplugin with proper activation state: correct under all integrators and visible to keyframes and sensors. With a zero velocity setpoint it is identical toposition. The input signature is any subset of[pos, vel, ff], selected byinput; absent setpoint inputs are fixed at zero, so the control vector contains no inert entries. - 2f1843f4 The
dcmotoron-board controller is redesigned: theinputattribute selects any subset of[pos, vel, ff, voltage], whereposandvelare setpoints for the controller,ffis a torque feedforward, andvoltageis the raw terminal voltage (the default, a plain voltage-commanded motor). Controller gains are in torque space, as forpid, and the drive voltage compensates back-EMF as in a current-controlled driver: commanded torque is delivered exactly until a limit is reached. The keywordinput="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.
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. The old velocity mode's integral term (integrated-velocity tracking) is retired without replacement; the integrator always accumulates position error.
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 kd.
Engine
- 83e621d7 Optimized large-mesh convex collision detection with up to 2x speedup in certain cases.
- 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. The blocks precondition the CG constraint solver and drive an iterative solve for
qacc_smooth, which now converges ontolerancerather than a fixed threshold. Flexes withelastic2dstretch stiffness step roughly twice as fast; bending-only flexes keep the exact constant factor and are unchanged. - 86e98601 Rewrote cleaner box-box SAT collider.
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. 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; and the stiffness is now a mass-scaled natural frequency rather than a fixed 1e4.
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. 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.
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.
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. 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; and geom pairs where neither body can move no longer generate contacts.
Models
- 2a3554c8 Added
drapeexample model: three cloths draped over a sphere, demonstratingpassivecollisions. It replaces thesphere_passivemodel, which has been removed. - 55d13aec Added
bagexample model: a cloth bag, held open by pinning the ring of vertices around its mouth, catching the standard humanoid dropped in from above. Unlike the poncho models, which are bending-only, this model exercises the 2Dstretchelasticity of a flex.
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. 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.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. Infinite planes continue to be anchored at the origin with no visual changes.
-
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. The default of 0.2 is a semi-soft cone which delivers the fullintensityeverywhere inside it, ...
3.11.0
Version 3.11.0 (July 27, 2026)
Engine
-
4787c809 Added geom/surfacevel: the velocity of a geom's surface as seen by contacts, given as a velocity field with a constant component and a rotational component about the geom frame origin. This allows conveyor belts, treadmills and turntables to be modeled with static geoms and no degrees of freedom: friction drives touching bodies along the motion of the surface, with the field projected onto each contact's tangent plane. Surface velocities compose correctly with each other and with body motion. Note that the contact rows of
mjData.efc_vel, and the constraint-state sensors that read them, report the velocity relative to the moving surface rather than to the geom, since that is the quantity the constraint acts on; for geoms withoutsurfacevelthe two are identical. Contact-point visualization draws an arrow along the surface velocity at contacts with moving surfaces. -
a264d0bc Added geom/adhesion and pair/adhesion: an adhesive force associated with a contact, useful for modeling sticky materials. Contacts can pull with up to the given force before breaking, and the friction budget becomes
$\mu(f_N + \text{adhesion})$ . Combined with gap, adhesive contacts apply "adhesion at a distance", useful for modeling magnets. Resting penetration is unaffected by adhesion. mj_contactForce reports the net interface force, whose normal component can now be negative. -
f0fa3d82 Replaced midpoint integration of free bodies with gyroscopic derivatives in the
implicitfastintegrator: the bias-force derivative of every standalone free body is applied via a local unsymmetric solve of its decoupled block, makingimplicitfastidentical toimplicitfor such bodies. Unlike midpoint integration, which required vacuum and no constraints, this applies in all environments (contacts, fluid, constraints), and is compatible with discrete-time inverse dynamics. Spinning free bodies no longer gain energy, but tumbling motion is now mildly damped; models requiring long-horizon energy conservation of tumbling bodies in vacuum should useRK4. The invdiscrete flag no longer has any effect on forward dynamics. -
5618666a Added body/simple attribute ("false"/"auto") to disable the simple body mass matrix optimization. This is useful for domain randomization, where model parameters may change post-compilation.
-
14c0b0c9 mj_setConst now recomputes the
mjModel.{body,geom,site}_sameframeflags, to account for changes in body/geom/site frames after compilation. -
2444defc Added support for multiccd with arbitrarily large meshes.
-
a04b0c5b Added
flg_gravcompandflg_surfacevelboolean flags tomjModel. These flags replace the fast-path checks as originally guarded byngravcomp. Since the engine uses these integers as flags (zero vs. non-zero), the new flags are honest boolean properties, writeable from the Python bindings at runtime. The fieldngravcompis deprecated and will be removed in a future release. -
a1f38c8e Replaced quadratic scratch in DFS flood-fill island discovery with a linear-memory Union-Find (disjoint set). Contribution by @teerthsharma.
Warning
Breaking API changes
- ff629889 Changed the default value of sleep_tolerance from 1e-4 to 1e-3 (1mm/sec in SI units).
-
315bcfbf Removed the legacy sparse ancestor-walk inertia matrix
mjData.qM. The joint-space inertia matrix is now stored exclusively in the compressed sparse row (CSR) formatmjData.M. -
7e9ac58f Switched mjd_inverseFD to use the CSR-format
mjData.Mrepresentation instead of the legacymjData.qMfor the mass matrix derivative. This changes the shape of theDmDqparameter from(nv x nM)to(nv x nC). -
1ea2d884 mju_round now breaks ties away from zero rather than towards
$+\infty$ . This only affects negative half-integers, e.g.mju_round(-2.5)now returns -3 rather than -2. -
fa36015b Removed unneeded
mjvSceneargument from mjv_moveCamera. -
ba9a6503 Split up mjrfMeshData into
mjrfMeshDataandmjrfMeshConfigto allow reuploading of mesh data without having to recreate the mesh object. Introduces mjrf_defaultMeshConfig and mjrf_setMeshData functions. -
ba9a6503 Removed
bytesfield from mjrVertexAttribute.
Caution
Breaking ABI changes
- 072e963f mjModel gained the
actuator_ctrlspecfield (input signature of each actuator), and mjsActuator gainedctrlspec, changing their size and layout. The mjtGain and mjtBias enums gainedso3members, shifting the values ofmjGAIN_USERandmjBIAS_USER. - d43c3ed4 Added
texid,texuniformandtexrepeatfields to mjvGeom. - a264d0bc The mjContact struct gained an
adhesionmember, changing its size and layout.
Note
Bug fixes
- dddb2767 Fixed a bug where
body_marginexcludedgap, causing the mid-phase collision filter to incorrectly prune in-gap contacts on multi-geom bodies.
Actuation
-
d507e921 Refactored actuator infrastructure in preparation for MIMO (multi-input multi-output) actuator support. Each actuator now has
ctrlnum(number of controls) andoutnum(number of force outputs). The total countsnu = sum(ctrlnum)andnout = sum(outnum)dimensionmjData.ctrlandmjData.actuator_force, respectively,nactuatoris the number of actuators. For existing actuatorsctrnum = outnum = 1, sonactuator == nu == noutand existing code is unaffected. -
56a93979 Setpoints of position and intvelocity servos acting on 3D rotational transmissions (ball joints, or site transmissions with a refsite and purely rotational gear) are now interpreted on the circle: the force uses the setpoint representative nearest the current angle, so targets winding beyond half a turn are tracked continuously instead of slipping by full turns. Behavior is identical whenever the error does not exceed π. Relatedly,
intvelocityactuators now expose actlimited, which was previously hardcoded to "true": as for [general](https:...



