Skip to content

Releases: google-deepmind/mujoco

3.17.0

Choose a tag to compare

@mmossg mmossg released this 22 Oct 21:45

Version 3.17.0 (October 22, 2026)

Significant new features

  1. c00ed8153 Added a batch API in mujoco/mjbatch.h (in Python as
    mujoco.batch): many simulations of one model stepped on a thread pool of its own, each held as its
    integration state and loaded into an mjData for each call, so memory scales with threads and results are
    bit-identical to a plain loop at any thread count. It supports per-simulation model and option fields or models of
    the caller's, observations of the state after a step, recorded trajectories, persistent simulations (required for
    sleep), and arbitrary per-simulation functions. Follows the design of
    mjbatch by @kevinzakka.

Engine

  1. Flex improvements:

    • 94483e166 Added bending elasticity for 1D flexes, using a twist-free isotropic
      discrete elastic rod model. The cross-section is selected with the new section
      attribute: a circle of the flex radius, or a box with half-sizes sectionsize
      that uses the stiffness of its weak axis. It is enabled by a positive young modulus,
      requires a straight reference configuration (curved initial poses can be set with qpos or keyframes), is
      compatible with edge equality constraints, and is integrated implicitly by the discrete
      integrator. Previously young was ignored for 1D flexes: existing models that set it now bend, and fail to
      compile if the cross-section is degenerate (zero radius with the default circle section), if a vertex joins a
      zero-length edge, or if the rod is not straight.

    • 36d0df9a5, 897e3fcb1 Interpolated flexes (trilinear or quadratic
      dofs) now support self-collision, excluding elements in
      the same or neighboring cells.

    • 39dd10f2d The default arena memory for flex models is now much smaller, sized from
      the flex mesh topology instead of nv^2. If the Newton solver runs out of arena memory it falls back to CG with
      a warning.

  2. mj_setConst now computes only quantities derived from other fields of mjModel, while the compiler alone
    resolves spec-level conventions:

    • 55c1b585a, d6d41f324 The damping of position actuators from
      dampratio, the spring length of tendons from (-1, -1), and model statistics
      are now resolved only at compile time, not by mj_setConst. Set the model fields directly when editing a
      compiled model (mj_copyBack now copies tendon spring lengths back to the spec).

    • c8362756d Constraint solvers now scale their termination criteria by the trace of the current inertia
      matrix (of the model or island) instead of mjModel.stat.meaninertia. Models solved with PGS, noslip or islands
      disabled can stop at slightly different iterations. The meaninertia attribute is
      deprecated and now emits a compile warning; remove it to migrate.

    • abddec5b9 For body-based weld constraints without a specified
      relpose, the relative pose in qpos0 is now recomputed by mj_setConst when
      the model is modified after compilation (matching the second body's anchor in
      body-based connect constraints). The compiler marks such welds with a nonzero eq_data[11], and
      mjNEQDATA increased from 11 to 12.

Warning

Breaking ABI changes

body-based welds that had no relpose at compile time. Zero eq_data[11] before calling mj_setConst
to set the relative pose of such a weld directly.

  • 865316f19 Added MJSETCONST_ARRAYS and MJSETCONST_SCALARS in mjxmacro.h, listing the
    mjModel arrays and scalars read and written by each phase of mj_setConst.
  1. e15ecd842 Added single-shot multicontact for geoms with positive contact
    margins.

  2. 7394a8672 mju_boxQP now updates its Cholesky factor incrementally with mju_cholUpdate, making
    cold-started solves 1.4-1.6x faster and warm-started solves 1.9-2.9x faster.

  3. aa0f88e77 Trees marked sleep="init" which cannot be put to sleep now cause a warning
    rather than an error, and start awake. See Sleeping for details.

Compiler

Warning

Breaking API changes

  1. aad2e2982 mjs_fuseStatic and mjs_discardVisual now return the number of bodies fused or
    elements discarded, and -1 on error. Previously they returned 0 on success, so a caller could not tell whether the
    spec changed. In Python, MjSpec.fuse_static and MjSpec.discard_visual return the same number instead of
    None.

    Migration: Test for an error with < 0 rather than != 0.

  2. 084828896 mjs_addTexture now takes a default class, like mjs_addMesh and
    mjs_addMaterial.

    Migration: mjs_addTexture(spec) → mjs_addTexture(spec, NULL). MjSpec.add_texture is unchanged.

  1. 3576818f5, b0f206d04 Textures can be left by reference instead of being
    decoded into mjModel. With compiler/passthrough set to "textures", or
    texture/embed set to "false", a single-file texture is not read at compile time; the
    model holds its path instead of its pixels, so a scene that attaches many textured sub-models loads in a fraction of
    the memory and time. In addition, a compiled mjSpec no longer keeps the decoded pixels of its textures between
    compilations.

    • 3576818f5 What the model holds: tex_adr is -1, tex_width and tex_height are 0, ntexdata
      excludes the texture, the resolved path is at tex_pathadr, and any authored
      [content_...
Read more

3.16.0

Choose a tag to compare

@mmossg mmossg released this 14 Oct 09:29

Version 3.16.0 (October 14, 2026)

Significant new features

  1. cf89a6375, 4316935b3, 6d98d9fab, 5f17e92eb, 89d59b11f,
    147dc67d0 Frames can now scale their contents at compile time—without modifying the
    mjSpec—via the new scale, scaling, and
    massscale attributes. The default similar policy scales all physical quantities so that
    dynamics are preserved under proportionally scaled gravity, whereas geometry scales only spatial dimensions and
    inertias (and supports anisotropic scaling). Masses scale with volume unless overridden by massscale. External
    references to scaled elements—including actuators, tendons, constraints, sensors, keyframes, and deformable/mesh
    assets—are scaled consistently, and mj_copyBack maps values back into unscaled spec coordinates. See
    frame/scale for details.

  2. 592c54ad3, 92b8f4b27, d4595d020 Added compiler attributes
    savecompiled and savecanonical (both defaulting to
    "true") to preserve original authoring when saving models to XML. Setting savecompiled="false" saves the
    uncompiled mjSpec directly—retaining default classes, frames, and authored numeric values—so the saved XML
    reloads into an identical spec. Setting savecanonical="false" additionally preserves the original input
    conventions, such as orientation representations, degree/radian units, and actuator shortcuts; see
    Model Encoding & Saving. mj_copyBack (MjSpec.copy_back in Python) now updates only the
    modified fields in the spec while leaving all other authored values untouched.

  3. 9d953b40c Added support for building MuJoCo with Bazel (initially covers core
    library, simulate, plugins, and samples).

General

Warning

Breaking API changes

  1. ea5e711c1 mjfDecode, the decode callback of mjpDecoder plugins, and
    mju_decodeResource now take char* error, int error_sz arguments. A decoder which fails writes its
    reason into error, which is then reported by mj_parse and in mesh compilation errors, rather than only
    as a warning with a generic error.

    Migration: Add the two arguments to custom decoders and write failure messages into error (if not
    NULL) instead of calling mju_warning. Pass an error buffer, or NULL, 0, to
    mju_decodeResource.

  2. 2757493d9 Shortened the names of mjpResourceProvider functions. mjp_getResourceProvider is
    renamed to mjp_findProvider, consistent with other prefix and extension lookups.

    Migration: Rename as follows:
    |br| mjp_defaultResourceProvider → mjp_defaultProvider
    |br| mjp_registerResourceProvider → mjp_registerProvider
    |br| mjp_resourceProviderCount → mjp_providerCount
    |br| mjp_getResourceProvider → mjp_findProvider
    |br| mjp_getResourceProviderAtSlot → mjp_getProviderAtSlot
    |br| mjp_registerArchiveResourceProvider → mjp_registerArchiveProvider
    |br| mjp_findArchiveResourceProvider → mjp_findArchiveProvider
    |br| mjp_archiveResourceProviderCount → mjp_archiveProviderCount

Engine

  1. 0998957cf The contact sensor now supports linvel and angvel
    data fields for reporting relative contact velocities, and its computation stage
    (mjtStage) is now inferred from the requested data and
    reduce attributes.

  2. d823f9212 mj_setConst now computes the bounding volumes of geoms and bodies, the collision masks and
    margins of bodies, and the added mass of geoms in the ellipsoid fluid model. Changes to the size,
    pose, margin and gap of geoms, to the inertial frames of bodies and to the size of height fields are then safe;
    previously contacts could be missed. mj_setConst also computes the constants of sleeping bodies, which it
    skipped, and resolves the automatic sleep policy of trees anew.

  3. 52824daf6 Corrected the shear contribution to solid and membrane stiffness for interpolated flexes, and the
    three-point Gauss quadrature used by quadratic flexes. Material parameters now produce the standard isotropic
    linear-elastic stiffness; existing models using these flexes can change behavior.

  4. 3bc4b769a Improved numerical stability of sphere and cylinder spatial tendon
    geom wrapping near wrap onset and for inside wrapping. Thanks to @M-Colley for
    reporting and analyzing the issues in MJWarp issues
    1713 and
    1714.

  5. 871e3725b Flex contacts are now reduced to mjMAXCONPAIR per geom only for rigid and interpolated
    flexes; other flexes keep all their contacts. Previously, cloth resting on a plane or on many static geoms could be
    held by at most 50 contacts and fall through.

  6. efffd3a5f Fixed floating-point cancellation in capsule-capsule collision detection for parallel and
    near-parallel axes. Thanks to @ayonga for reporting the issue in MJWarp issue
    1758.

Compiler

Warning

Breaking API changes

  1. 592c54ad3 mj_copyBack and [mj_saveLastXML](https://...
Read more

3.15.0

Choose a tag to compare

@mmossg mmossg released this 05 Oct 14:58

Version 3.15.0 (October 5, 2026)

General

  1. 1aa68e1ca .mjz archives written on Windows now always use / separators.

  2. 1aa68e1ca Assets in a meshdir or texturedir now
    resolve correctly in .mjz archives when rewritten or when the directory path is absolute, uses
    .., or uses a URI scheme.

Engine

Warning

Breaking API changes

  1. b3dd9e617 Actuator dampratio now computes the reflected inertia
    $m$ at mjModel.qpos0 as the operational-space inertia $(J M^{-1} J^T)^{-1}$ (averaged across force
    outputs for multi-output actuators such as orientation), rather than summing
    $\text{dof\_M0}_j / J_j^2$ across degrees of freedom. This accounts for tendon and actuator armature as well
    as off-diagonal inertial coupling, and avoids extreme damping values when a multi-DOF transmission has small
    Jacobian entries. In practice, actuators using dampratio on multi-link kinematic chains may exhibit lower
    damping than before, while actuators driving tendons or sites that span multiple joints will be damped much more
    accurately instead of being overdamped.

  2. 5023a4a50 Removed the deprecated internal flex collision option and associated evpair
    structures.

  1. 1b973add4 Added experimental simplified Stable Neo-Hookean elasticity for non-interpolated 3D flexes,
    enabled only through mjsFlex.elastic3d = 1. It projects the material Hessian to positive semidefiniteness for the
    solver and Rayleigh damping, and preserves the Saint Venant-Kirchhoff (StVK) default (0).
    SNH requires the discrete integrator. The setting is not available in MJCF.

  2. 2742de438 The cached flex bending factor now retains cross-coordinate couplings between differently
    oriented vertex bodies.

  3. eed008905 Flex bending and stretching now include the motion and reaction forces of articulated vertex
    attachments. The discrete integrator supports these attachments with the CG solver; fixed and independent XYZ-slide
    attachments retain their optimized assembly. Elastic flexes attached to mocap bodies produce a compiler error.

  4. 6224e95f6 Added single-shot multicontact for collisions with capsule geoms.

  5. ebfb4662d Added the enclosed attribute to
    insidesite sensors, measuring how much an object juts out of a site (using directed
    Hausdorff distance) and reporting signed clearance/protrusion.

  6. f80ef4244 Fixed 64-bit model size narrowing in binary MJB serialization: mj_saveModel and
    mj_loadModelBuffer now accept mjtSize for buffer_sz, supporting models larger than 2 GiB.

3.14.0

Choose a tag to compare

@mmossg mmossg released this 22 Sep 16:52

Version 3.14.0 (September 22, 2026)

General

  1. 458189298 Added the ipc flag, an experimental contact mode of the discrete
    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, while elastic2d elasticity 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_setState do not capture its full state and exact replay is not supported.

  2. 2fec92237 Introduced archive resource providers
    (mjp_registerArchiveResourceProvider). Archive providers use the
    mjpResourceProvider interface 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.

  3. e312ce82d Frames are now preserved when saving MJCF: <frame> elements are written with
    their pos and quat and 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 the pos or quat of a frame in an mjSpec now also take effect when the spec is
    recompiled.

Engine

Warning

Breaking API changes

  1. dc8bb1364 mj_readCtrl now matches the signature and semantics of mj_readSensor to support
    multi-input actuators (e.g., pid, dcmotor,
    orientation): it takes an output buffer result of size actuator_ctrlnum[id]
    and returns const mjtNum* (a pointer into mjData.ctrl or mjData.history on zero-order-hold or exact
    timestamp matches, or NULL when interpolated values are written to result). Actuator history buffers now
    store actuator_ctrlnum[id] values per sample, and mj_initCtrlHistory expects nsample * actuator_ctrlnum[id] values (#3597).
  1. 9e0c6b577 The mjWARN_INERTIA warning is now also raised by the modified-inertia
    factorizations of the implicitfast and damped-Euler integrators (previously silent) and of the
    implicit integrator (previously a fatal error).

  2. 35c0631de The 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

  1. 2a3f1f5a4 Procedural model editing is no longer quadratic in the number of elements. mjSpec previously
    recomputed the compilation signature on every mjs_addGeom-like call, and mjs_setName rescanned 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.

  1. ac329bd17 Fixed the torque applied by weld constraints in
    mj_rnePostConstraint. The rotational constraint force was used directly as a world-frame torque, missing the
    scaling by 0.5 * torquescale and the rotation into the world frame. Force and
    torque sensors on bodies held by a weld that carries torque were wrong (#2533).

  2. 263c638c0 mj_rnePostConstraint now 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).

  3. eb662fcaf Tendon actuatorfrclimited now defaults to "auto" as
    documented. Previously the default was "false" and actuatorfrcrange was silently ignored unless
    actuatorfrclimited was set explicitly.

  4. 54be9cce6 mjd_transitionFD and mjd_inverseFD now raise an error when
    sleeping is enabled. Previously, their repeated evaluations changed the sleep state, leading to
    internal errors or wrong derivatives.

  5. e38573c64 Fixed a memory leak in mjs_delete where deleted elements and subtrees were retained in
    mjSpec until mj_deleteSpec (#2882).

  6. 65ea54c3c Fixed 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

Choose a tag to compare

@mmossg mmossg released this 09 Sep 15:03

Version 3.13.0 (September 8, 2026)

General

  1. eb18d77ca The .mjz encoder now writes the root file as model.xml in the archive as
    this is less susceptible to breakage due to file renaming.

  2. 4affbb64a Site geometries can now also be associated with meshes (type="mesh" with
    mesh="name"), supporting visualization, the insidesite
    sensor, and the new mj_insideSite function.

  3. b59b07fae Added support for Python 3.15 (GIL and Free-Threading).

Engine

  1. 5660353ec Added a new integrator discrete: 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 integrator mjData.qacc is
    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: solref spring--dampers are evaluated at the end of the
    step, so constraints are stable at any timeconst; 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 clamping timeconst. 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.

  1. 0b4e17747 Restored clamping of non-positive pivots in the sparse inertia factorization, along with the
    associated mjWARN_INERTIA warning. The guard was inadvertently dropped in the 3.3.0 conversion of qLD to CSR
    format; since then, models with singular mass matrices silently produced non-finite accelerations, typically
    surfacing as divergence warnings and automatic resets.

  2. c9d997610 Added single-shot multicontact for collisions with cylinder geoms.

  3. 10eeb8289 The 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

  1. 2a3957558 Custom text fields (custom/text) in MJCF now accept their values inside a
    <![CDATA[ ... ]]> block in addition to the data attribute. When saving a model via mj_saveXML, custom
    text containing newlines or XML characters is exported as CDATA.

  2. 47ebfe48a Added cutoff attribute to sensor/tactile.

Samples

  1. 834983fbb Added 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

  1. 67562d95f Rewrote the Plane-Mesh collider to fix bugs and improve performance. Fixes #3524.

Models

Video

  1. f6c1004b7 Added 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

  1. cb57b526f For 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

Choose a tag to compare

@mmossg mmossg released this 20 Aug 11:11

Version 3.12.0 (August 20, 2026)

General

  1. 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

  1. 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. This subsumes the functionality of the mujoco.pid plugin with proper activation state: correct under all integrators and visible to keyframes and sensors. 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.
  2. 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). 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. 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.

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 $K/R$ (torque per volt). 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.

Engine

  1. 83e621d7 Optimized large-mesh convex collision detection with up to 2x speedup in certain cases.
  2. 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 on tolerance rather than a fixed threshold. Flexes with elastic2d stretch stiffness step roughly twice as fast; bending-only flexes keep the exact constant factor and are unchanged.
  3. 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

  1. 2a3554c8 Added drape example model: three cloths draped over a sphere, demonstrating passive collisions. It replaces the sphere_passive model, which has been removed.
  2. 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. Unlike the poncho models, which are bending-only, this model exercises the 2D stretch elasticity of a flex.

Rendering

Warning

Breaking API changes

primitives_textured
  1. 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.

    plane_uv_tiling

  2. 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 full intensity everywhere inside it, ...

Read more

3.11.0

Choose a tag to compare

@mmossg mmossg released this 28 Jul 01:17

Version 3.11.0 (July 27, 2026)

Engine

  1. 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 without surfacevel the two are identical. Contact-point visualization draws an arrow along the surface velocity at contacts with moving surfaces.

    Watch video

  2. 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.

    Watch video

  3. f0fa3d82 Replaced midpoint integration of free bodies with gyroscopic derivatives in the implicitfast integrator: the bias-force derivative of every standalone free body is applied via a local unsymmetric solve of its decoupled block, making implicitfast identical to implicit for 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 use RK4. The invdiscrete flag no longer has any effect on forward dynamics.

  4. 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.

  5. 14c0b0c9 mj_setConst now recomputes the mjModel.{body,geom,site}_sameframe flags, to account for changes in body/geom/site frames after compilation.

  6. 2444defc Added support for multiccd with arbitrarily large meshes.

  7. a04b0c5b Added flg_gravcomp and flg_surfacevel boolean flags to mjModel. These flags replace the fast-path checks as originally guarded by ngravcomp. 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 field ngravcomp is deprecated and will be removed in a future release.

  8. 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

  1. ff629889 Changed the default value of sleep_tolerance from 1e-4 to 1e-3 (1mm/sec in SI units).
  2. 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) format mjData.M.
  3. 7e9ac58f Switched mjd_inverseFD to use the CSR-format mjData.M representation instead of the legacy mjData.qM for the mass matrix derivative. This changes the shape of the DmDq parameter from (nv x nM) to (nv x nC).
  4. 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.
  5. fa36015b Removed unneeded mjvScene argument from mjv_moveCamera.
  6. ba9a6503 Split up mjrfMeshData into mjrfMeshData and mjrfMeshConfig to allow reuploading of mesh data without having to recreate the mesh object. Introduces mjrf_defaultMeshConfig and mjrf_setMeshData functions.
  7. ba9a6503 Removed bytes field from mjrVertexAttribute.

Caution

Breaking ABI changes

  1. 072e963f mjModel gained the actuator_ctrlspec field (input signature of each actuator), and mjsActuator gained ctrlspec, changing their size and layout. The mjtGain and mjtBias enums gained so3 members, shifting the values of mjGAIN_USER and mjBIAS_USER.
  2. d43c3ed4 Added texid, texuniform and texrepeat fields to mjvGeom.
  3. a264d0bc The mjContact struct gained an adhesion member, changing its size and layout.

Note

Bug fixes

  1. dddb2767 Fixed a bug where body_margin excluded gap, causing the mid-phase collision filter to incorrectly prune in-gap contacts on multi-geom bodies.

Actuation

  1. d507e921 Refactored actuator infrastructure in preparation for MIMO (multi-input multi-output) actuator support. Each actuator now has ctrlnum (number of controls) and outnum (number of force outputs). The total counts nu = sum(ctrlnum) and nout = sum(outnum) dimension mjData.ctrl and mjData.actuator_force, respectively, nactuator is the number of actuators. For existing actuators ctrnum = outnum = 1, so nactuator == nu == nout and existing code is unaffected.

  2. 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, intvelocity actuators now expose actlimited, which was previously hardcoded to "true": as for [general](https:...

Read more

3.10.0

Choose a tag to compare

@mmossg mmossg released this 22 Jun 17:04

See the changelog

3.9.0

Choose a tag to compare

@mmossg mmossg released this 27 May 14:46

See the changelog

3.8.1

Choose a tag to compare

@mmossg mmossg released this 11 May 13:59

See the changelog