ReleaseGoogle (DeepMind / Gemini)Google (DeepMind / Gemini)published Oct 14, 2026seen 1w

google-deepmind/mujoco 3.16.0

google-deepmind/mujoco

Open original ↗

Captured source

source ↗
published Oct 14, 2026seen 1wcaptured 1whttp 200method plain

3.16.0

Repository: google-deepmind/mujoco

Tag: 3.16.0

Published: 2026-10-14T09:29:02Z

Prerelease: no

Release notes:

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

6. `0998957cf` The contact sensor now supports linvel and angvel...

Excerpt shown — open the source for the full document.