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.
