- Reset masked
ControllerNeuralLSTMhidden and cell state without in-place writes. Network outputs are produced undertorch.inference_mode(), so a partial reset previously raisedRuntimeError: Inplace update to inference tensor outside InferenceMode is not allowed.(#3923) - Index Torch neural controller targets with the supplied
target_pos_indices.ControllerNeuralMLPandControllerNeuralLSTMpreviously selected between position and sequential indices by Python object identity, which produced wrong position errors whenever the target and position layouts differ, such as DOF-layout targets on a floating-base robot. (#3923) - Limit the
usd-exchangedependency to versions below 3 for aarch64 systems. (#3996) - Keep ViewerGL depth, shading, and shadows stable for very large meshes when the camera moves. (#3977)
- Resolve deep heightfield contacts against the cell's physical surface instead of the volume the cell is extruded into, which reported about a metre of penetration with a normal pointing into the terrain once a collider's center passed below the surface.
- Import MJCF mesh assets authored with inline vertex, face, normal, and texture-coordinate data.
- Break the viewer's shape count down into visual and collision shapes. The two are listed under
Shapesin the stats overlay and need not sum to the total, since a shape can be both. - Add selection of the shapes included in model shape BVHs through
Model.bvh_build_shapes(shape_flags=...)andModelBuilder.default_bvh_cfg.shape_flags, e.g.ShapeFlags.VISIBLE | ShapeFlags.COLLIDE_SHAPESto also include collision shapes. - Add a
dampingparameter toModelBuilder.add_joint_ball()that applies passive angular damping to all three ball-joint DOFs; when omitted,ModelBuilder.default_joint_cfg.dampingapplies. - Add per-world
xformsargument toModelBuilder.replicate()for batching explicitly positioned worlds. - Add cubic and triplanar
SensorTiledCameratexture projection modes for shapes without authored UVs. - Add
fullscreentoViewerGL.log_image()to display a logged image, such as a sensor output texture, as the main viewer surface for a frame while keeping the UI available. - Import USD deformable bodies in
ModelBuilder.add_usd()(experimental; based on the proposed AOUSD Deformable Body Physics schema). Curves become cables (capsule bodies joined by cable joints, each cable wrapped in its own articulation), meshes become cloth (FEM triangles with bending edges), and tet meshes become soft bodies. Bound deformable materials supply thickness, stiffness, and density, and the proposal's mass precedence (per-pointphysics:masses, then bodymass/density, then material density) is honored. Each imported deformable's element ranges and authored material attributes are returned by prim path when the experimentaladd_usd(..., return_deformable_results=True)option is passed; the returned maps are build-time snapshots (not live selections), and the default return shape carries no deformable entries. Collision participation followsPhysicsCollisionAPI/physics:collisionEnabled: cables without an enabled collider import without collision, while cloth and volume deformables warn that particle collision cannot be disabled yet. Standardphysics:filteredPairspairs involving a cable expand to its segment shapes; pairs naming a cloth or volume deformable warn and are not lowered. Disabled or kinematic deformables and malformed topology warn and are skipped. Cable and cloth material attributes are returned as authored inpath_cable_attrs/path_cloth_attrs, so solvers with richer cable or cloth models can rebuild from the import. See the USD parsing documentation for the supported subset and limitations. - Import AOUSD proposal
PhysicsAttachmentprims for cables inModelBuilder.add_usd(). Cablepoint/segmentsites with anxformtarget become hard ball joints, returned inpath_attachment_map(withreturn_deformable_results=True); cloth/volume attachment sites warn and are kept inpath_attachment_attrs. A hard, coincidentpoint->pointattachment between two cables welds them into one rod graph; a springy or non-coincident junction warns and is kept as data instead of welded. - Import AOUSD proposal
PhysicsElementCollisionFilterprims inModelBuilder.add_usd(): collisions between the paired element groups ofsrc0andsrc1are filtered (group counts pair element-wise; a count of0or an empty counts array selects all elements). Sources resolve to imported cables, rigid bodies, or collider prims; cloth/volume element sources warn and are skipped. - Add scalar value-based OpenCV, F-theta, and Kannala-Brandt fisheye camera ray helpers to
SensorTiledCamera.utils, plus pinhole aperture/focal-length parameters,compute_camera_transforms_usd(),compute_camera_rays_usd_pinhole(), and optional preallocated ray output writes. - Import authored MPM particle sets from
UsdGeom.Pointscarrying the genericNewtonParticleAPIand owned by aNewtonMPMSceneAPIscene, including SI unit and world-transform conversion, density- and width-derived masses, whole-prim and point-GeomSubsetphysics material bindings, per-prim particle ranges, andSolverImplicitMPM.Config.create_from_usd()scene configuration. Accept resolved materials carryingNewtonMPMMaterialAPI,PhysicsMaterialAPI, orPhysicsVolumeDeformableMaterialAPI; standardphysics:youngsModulusandphysics:poissonsRatioprovide elasticity. Unrelated scenes and particle systems are ignored, while imported MPM Points must share one owner; unbound particle sets use Newton's registered material defaults and the builder's default density. - Import authored MPM particle sets from
UsdGeom.Pointscarrying the genericNewtonParticleAPIand owned by aNewtonMPMSceneAPIscene, including SI unit and world-transform conversion, density- and width-derived masses, whole-prim and point-GeomSubsetphysics material bindings, per-prim particle ranges, andSolverImplicitMPM.Config.create_from_usd()scene configuration. Accept resolved materials carryingNewtonMPMMaterialAPI,PhysicsMaterialAPI, orPhysicsVolumeDeformableMaterialAPI; standardphysics:youngsModulusandphysics:poissonsRatioprovide elasticity, absolute MPM damping is normalized against Young's modulus for the current solver, and initial plastic volume strain seeds resettable particle state. Unrelated scenes and particle systems are ignored, while imported MPM Points must share one owner; unbound particle sets use Newton's registered material defaults and the builder's default density. - Import authored MPM simulation geometry from
UsdGeom.PointscarryingNewtonPointsDeformableSimAPIand governed byPhysicsDeformableBodyAPI. The importer handles world transforms and stage units; standard per-point, body-total, and density-derived mass precedence; whole-prim and point-GeomSubsetmaterials; per-prim particle ranges; andSolverImplicitMPM.Config.create_from_usd()scene configuration.NewtonMPMMaterialAPIsupplies MPM elasticity and constitutive properties, including resettable initial plastic volume strain. - Add cubic and triplanar
SensorTiledCameratexture projection modes for shapes without authored UVs. - Add CUDA-graph-capturable rebuildable sparse grids to
SolverImplicitMPMwhenmax_active_cell_countis positive, with optionalmax_leaf_node_count,max_lower_node_count, andmax_upper_node_counthierarchy capacities. - Add opt-in isolated multi-world implicit MPM with capacity-bounded rebuildable sparse grids, selective world resets, outer graph capture, and asynchronous overflow reporting through
SolverImplicitMPM.check_sparse_grid_rebuild_status(); legacy shared topology remains the default. - Add contact examples for Newton's cradle, a balance bird, and a domino spiral
- Document geometry-pair contact behavior and clarify that MuJoCo Warp currently produces a single contact for cylinder--box pairs even with MultiCCD enabled.
- Add
ViewerUSD(points_as_spheres=...)to renderlog_pointsparticles as aUsdGeom.PointInstancerof sphere prototypes; enabled by default (opt out withpoints_as_spheres=Falsefor flatUsdGeom.Pointssplats) - Add experimental
newton.controllersmodule withControllerBasebase class,ControllerJointImpedance, andControllerJointImpedanceModelFreefor GPU-accelerated, vectorized joint-space impedance control. - Add list-of-pattern and explicit-index selectors to
ArticulationView. - Add full-surface (edge/face) rigid-soft contacts to
SolverVBDproxy-body coupling underSolverCoupledProxythrough shared or proxy-local collision pipelines. Proxy-particle coupling rejects full-surface contacts. - Add
newton[onnx]for ONNX policy inference through Warp-NN;ControllerNeuralMLP,ControllerNeuralLSTM, and RL policy examples can run exported.onnxpolicies without requiring PyTorch for ONNX execution. - Add three VBD contact examples —
vbd_rigid_rigid_contact,vbd_soft_rigid_contact, andvbd_soft_rigid_mix_contact— demonstrating rigid-rigid, soft (particle-rigid), and mixed cloth-bag contacts - Add masked rigid-body reset support to
SolverVBD. (#3256) - Add
Mesh.invalidate_cache()to drop cached derived data (hash, edges, finalized Warp meshes) after in-place modification ofMesh.verticesorMesh.indices; reassigning those properties invalidates automatically. - Add
Heightfield.create_from_mesh()andnewton.utils.rasterize_mesh_to_heightfield()to build a heightfield collider by ray-casting awp.Mesh, replacing a large static terrain mesh with an equivalent heightfield. - Add read-only
Contacts.contact_matching_modemetadata reporting whether theCollisionPipelinethat produced or last filled the buffer used"disabled","latest", or"sticky"contact matching. - Add a "Show Ground" visualization toggle (
ViewerBase.show_ground, default on) to hide or show ground-plane shapes in the viewer. - Add opt-in DVI forward dynamics to
SolverKaminothroughSolverKamino.Config(dynamics_solver="dvi"), with sparse and dense execution, DVI-specific convergence diagnostics, warm-starting, bounded contact-recovery controls, and RCM-reordered bilateral factorization with reusable ordering and panel-parallel numeric factorization for large systems. PADMM remains the default. (#3570, #3613) - Add
fk_actuation_flagstoSolverKamino.register_custom_attributes()for selecting joint actuation types in forward-kinematics workflows. (#3338) - Add D6 gimbal/Euler joint support to
SolverKamino, including conversion, limits, Jacobians, reset, and forward-kinematics handling. (#3717) - Return the selected
physics_scene_pathfromModelBuilder.add_usd()and addnewton.usd.get_physics_scenes()to retrieve every physics scene in parser order. - Warn in
ModelBuilder.add_usd()when a rigid body prim has a mirrored (negative-determinant) world transform. Improper transforms have no unique rotation decomposition, so imported body and joint frames can acquire a spurious constant rotation (common with mirror-scaled CAD exports); the warning recommends baking the reflection into the mesh geometry before import. - Add dedicated gravity for global world
-1while preserving the single-entryModel.gravityarray for implicit single-world models and local-only array updates throughModel.set_gravity(). (#3724; fixes #3723) - Add a
sign_methodargument toMesh.build_sdf()andSDF.create_from_mesh()with"auto","parity","winding", and"normal"(angle-weighted pseudo-normal) strategies. Automatic runtime mesh queries use parity for watertight meshes and pseudo-normals for non-watertight meshes, while SDFs baked during model finalization use winding numbers. (#3403; fixes #3242) - Add opt-in MuJoCo Warp sleeping support to
SolverMuJoCowith MJCF sleep configuration, initial tree policies,sleep_tolerance, compactnvmaxstorage, and a launchablemujoco_sleepingexample. (#3731; fixes #3725) - Add
forward_depth_imageoutput support toSensorTiledCamera.update()andSensorTiledCamera.utils.create_forward_depth_image_output()for native forward-depth rendering without post-processingdepth_image. - Add a single-kernel sparse fused Conjugate Residual linear solver for the Kamino PADMM solver (
linear_solver_type="CRF"): a matrix-free Delassus solve that runs the full CR iteration in one Warp kernel per world, with optional inexact-ADMM inner-tolerance scheduling vialinear_solver_tolerance_ratio. - Add the
basic_conveyor_forcesexample: a multi-belt conveyor circuit that transports rigid boxes with per-belt velocity fields, applying Coulomb-limited tangential body forces from reported per-contact normal forces acrossSolverXPBD,SolverVBD, andSolverMuJoCo. - Add optional
shear_stiffness/shear_dampingandtwist_stiffness/twist_dampingcontrols toModelBuilder.add_joint_cable(),ModelBuilder.add_rod(), andModelBuilder.add_rod_graph(); omitted shear defaults to stretch and omitted twist defaults to bend for compatibility. - Add
newton.utils.CableStiffnessand extendnewton.utils.create_cable_stiffness_from_elastic_moduli()withpoissons_ratio/shear_modulusinputs that include torsionalGJ/Lstiffness. - Add VBD cable validation examples covering bend stiffness, analytical bend/twist response, torsion material mapping, routed twist transfer, twist-buckling link verification, Michell/Zajac threshold behavior, and Dahl hysteresis.
- Add a cable plectoneme example demonstrating twist-driven supercoiling with self-contact.
- Import authored USD cable stretch, shear, bend, and twist stiffness independently through
ModelBuilder.add_usd(). - Add compiled regular-expression support to label-based selectors while preserving glob strings.
- Add simulation throughput, real-time factor, p95 step-time, steady-state GPU-memory, timestep, and MuJoCo solver-iteration metrics to the ASV robot-learning benchmarks.
- Add
joint_dof_masktonewton.ik.IKSolverto keep selected joint DOFs fixed during LM optimization. (#3488) - Add
SolverMuJoCo(disable_sensors=True)to skip MuJoCo sensor computation. - Add masked deformable reset to
SolverVBD.reset():StateFlags.PARTICLE_Q/StateFlags.PARTICLE_QDrestore cloth and soft-body particle state per world selected byworld_mask. (#3760; fixes #3400)
- Filter shared full-surface soft contacts per
SolverCoupledentry, preserving them for capable solvers and dropping them for particle-only solvers or records spanning entries. - Follow USD viewport
purposeand visibility for imported visual geometry and colliders rather than inferring visibility from a bound render material. Visual shapes and Gaussian splats are drawn only fordefaultandproxy; a collider whosepurposeresolves todefaultis drawn, whileguideidentifies collision-only geometry.force_show_collidersandhide_collision_shapesare unchanged. (#3404, #3712) - Require
warp-lang>=1.16.0; upgrade Warp to version 1.16.0 or later. (#3780) - Disable the implicit positive Dahl-friction defaults in
SolverVBD.register_custom_attributes()(deprecated in 1.3.0):vbd:dahl_eps_maxandvbd:dahl_taunow default to zero, and Dahl cable friction is enabled only where both are authored positive. Passdahl_defaults_enabled=Trueto temporarily restore the old defaults; the compatibility mode will be removed in a future release. - Keep the authored render mesh when
ModelBuilder.add_usd()approximates a collider.physics:approximationis scoped to collision, so a Mesh that is both render geometry and a collider now imports as an approximated collision shape plus a visual shape carrying the original topology, instead of replacing the render mesh with the approximation. This raisesModel.shape_countfor such prims: iterate onShapeFlags.COLLIDE_SHAPESrather than assuming one shape per collider prim. The visual shape adds no mass and no collision, appends after the originals so existing shape indices andpath_shape_mapentries are unchanged, and is skipped whenload_visual_shapes=False. - Compile tiled camera render kernels with CUDA fast math by default for faster rendering; set
SensorTiledCamera.default_render_config.enable_fast_math = Falsefor bit-exact, IEEE-precise output. - Disable
HydroelasticSDF.Config.pre_prune_contactswhenCollisionPipeline(deterministic=True)(implied by anycontact_matchingmode other than"disabled"). Pre-pruning ranks faces per thread, so it cannot be made reproducible. The face-contact buffer doubles becausecontact_buffer_fractionno longer applies, and the generated contact set differs from the non-deterministic default. Deterministic hydroelastic contacts also cap the buffer at 2^20 faces; lowerbuffer_mult_contactorbuffer_fractionif construction now raises. - Make
CollisionPipelinethe sole owner of rigid-contact geometry forSolverVBD:"latest"supplies fresh geometry and"sticky"supplies replayed geometry.SolverVBD(rigid_contact_history=True)uses either mode's match indices only to warm-start its numeric lambda/penalty state. - Upgrade
mujocoandmujoco-warpto 3.11.0. (#3725) - Optimize raycast/raytrace queries by restructuring ray-shape intersection into local-space primitives and compile specialized depth/shadow variants that skip unused surface-normal work (mesh shadows also use any-hit queries).
- Change experimental
SolverVBDcable constraint slots from[STRETCH=0, BEND=1]to[STRETCH=0, SHEAR=1, BEND=2, TWIST=3], allowing each stiffness and constraint mode to be configured independently while preserving the pre-split world-form parent solve Hessian for the common isotropic component of stretch/shear elasticity. Existing cable calls using rawslot=1orJointSlot.ANGULARnow select shear; useJointSlot.BEND(now slot 2) to select bending. - Map
shape_material_kfto per-contact MuJoCosolreffrictioninSolverMuJoCo(elliptic friction cones with Newton contacts); resolvekfwith priority/solmix, treat a resolvedkf = 0as frictionless, and use native MuJoCo contacts or a pyramidal cone to preserve the previous solref-inherited friction. - Load visual-only USD geometry outside rigid-body hierarchies as static shapes by default; pass
load_static_visual_shapes=Falseto retain the previous body-associated-visuals-only behavior. - Speed up
Mesh.create_heightfield()andMesh.create_terrain()by building the vertex and index buffers in place, substantially reducing construction time and peak memory for large terrain grids such as those used by Isaac Lab. - Optimize VBD cable bend-twist Jacobian assembly while preserving residual-consistent behavior near folds.
- Load solver backends lazily on first access to speed up
import newton; access solver classes throughnewton.solversas before, and import solver modules explicitly if module-level side effects are required. - Reduce
SolverKaminokernel compilation time. (#3564) - Speed up USD mesh import for faceVarying normals by resolving the common single-cluster case for all vertices at once instead of clustering every face corner in Python; the split vertices, indices, normals, and UVs are unchanged, except that a corner sitting exactly at
vertex_splitting_angle_threshold_degfrom its cluster may now cluster differently. - Speed up
ModelBuilder.replicate()for large world counts by merging all copies in one pass; it no longer callsadd_world()oradd_builder()per copy, soModelBuildersubclass overrides of those methods are not invoked during replication. Move required subclass behavior outside those overrides, or calladd_world()/add_builder()explicitly instead ofreplicate(). - Treat
BodyFlags.KINEMATICbodies as zero-effective-mass implicit-MPM colliders whenSolverImplicitMPM.setup_collider()is called withoutbody_mass. Pass an explicitbody_massarray to override the model-derived collider masses. - Warn from
ModelBuilder.add_joint()when adding a joint between bodies that are already directly connected, since parallel joints are ambiguous and may behave differently across solvers. When replacing the implicit free joint created byadd_body(), useadd_link()and then add the intended joint explicitly. (#3207) - Reject inconsistent per-particle array lengths during bulk model construction and finalization. Ensure
pos,vel,mass, and anyradiusorflagsarrays passed toadd_particles()have equal lengths, and keep finalized per-particle arrays aligned withparticle_count. (#3458) - Reject invalid
ModelBuilder.ShapeConfigSDF and density values during shape validation. Use finite nonnegative density and SDF padding, a finite positive target voxel size, a narrow-band range satisfyinginner < 0 < outer, and a positive maximum resolution below 65536 that is divisible by 8; set either maximum resolution or target voxel size, not both. (#3311) - Reject runtime changes that alter
SolverKamino's as-built joint constraint counts, passive/actuated partition, or finite-limit structure; recreate the solver after making one of these structural changes. (#3532) - Cull positive-distance speculative contacts by default when converting Newton contacts for
SolverKaminoas a temporary workaround for restitution issues. No public compatibility option restores the old behavior; if a scene needs contact forces before geometry surfaces touch, increaseModelBuilder.ShapeConfig.marginso margin-shifted surfaces overlap at the desired force onset, and re-test contact behavior. (#3779)
- Deprecate scalar
ModelBuilder.gravity; pass a three-component gravity vector instead. (#3324) - Deprecate local-only
SolverBase.reset()world masks in favor of masks with shape(world_count + 1,); append a final entry that selects global entities in world-1. (#3726; fixes #3374) - Deprecate and ignore
SolverVBD'srigid_contact_stick_motion_eps,rigid_contact_stick_freeze_translation_eps, andrigid_contact_stick_freeze_angular_eps; use collision-pipeline sticky matching for persistent geometry. The SolverVBD body deadzone was removed without replacement. (#3652) - Deprecate
Model.contacts()andModel.collide()in favor of explicitly creating aCollisionPipeline, allocating withpipeline.contacts(), and detecting collisions withpipeline.collide(state, contacts). (#3409) - Deprecate the legacy DOF-shaped
joint_target_qlayout (newton.use_coord_layout_targets = False) for models whose joint coordinate and DOF counts differ (free/ball/distance joints);ModelBuilder.finalize()now emits aDeprecationWarningfor such models. Setnewton.use_coord_layout_targets = Truebefore building models and index targets viaModel.joint_target_q_start. A future release will make the coordinate layout the only layout and remove the flag.
- Remove the deprecated
joint_target_pos/joint_target_velaliases fromModel,Control, andModelBuilder(deprecated in 1.3.0); usejoint_target_q/joint_target_qdinstead. Reading or assigning the removed names raisesAttributeErrornaming the replacement, so a stalecontrol.joint_target_pos = targetsfails loudly instead of being silently ignored.Actuatornow always defaultscontrol_target_pos_attr/control_target_vel_attrto the canonicaljoint_target_q/joint_target_qdnames; passingNoneexplicitly selects the same defaults. - Remove the deprecated SDF compatibility attributes
Model.shape_sdf_index,Model.texture_sdf_data,Model.texture_sdf_coarse_textures,Model.texture_sdf_subgrid_textures,Model.texture_sdf_subgrid_start_slots,Model.sdf_block_coords,Model.sdf_index2blocks, andSDF.texture_block_coords(deprecated in 1.3.0); the hydroelastic broadphase derives block coordinates arithmetically and the remaining storage is internal. (#3622) - Remove the deprecated
newton.geometry.build_bvh_shape(),refit_bvh_shape(),build_bvh_particle(), andrefit_bvh_particle()helpers (deprecated in 1.3.0); useModel.bvh_build_shapes(),Model.bvh_refit_shapes(),Model.bvh_build_particles(), andModel.bvh_refit_particles()instead. (#3619) - Remove the deprecated
Model.has_heightfieldsproperty (deprecated in 1.3.0); useModel.heightfield_count, ormodel.heightfield_count > 0for boolean checks, instead. (#3619) - Remove the deprecated
SolverNotifyFlagsenum (deprecated in 1.3.0); useModelFlagsinstead. (#3619) - Remove the deprecated
ls_parallelparameter ofSolverMuJoCo(deprecated in 1.3.0); parallel line search was removed frommujoco_warpand the option had no effect. (#3619)
- Fix MPR returning scale-dependent, excessively deep contacts for small convex shapes on large mesh triangles while preserving triangle-specific shared-edge manifold witnesses. (#3766)
- Make deterministic collision pipelines cover hydroelastic contact generation and reduction, including unique reduced-contact sort keys and overflow-safe fixed-point pressure accumulation. (#3661)
- Fix
SolverMuJoCoretaining an invalid external-contact cache when its first step is captured in a CUDA graph. (#3768; fixes #3767) - Preserve box-box face contact manifolds under sub-microradian solver drift. (#3776)
- Fix
SolverMuJoCooverflowing MuJoCo's signed 32-bit collision masks when graph coloring requires the highest supported color; all 32 mask bits are now used before falling back to default collision masks for additional colors. - Convert
newton:mimicCoef0from degrees to radians when the mimic follower joint is angular. Assets authored against the old behavior need the value rescaled to degrees. - Complete Kamino RCM traversal for large and disconnected systems and reuse the resulting permutation by default; set
reuse_permutation=Falseto recompute it for changing matrix topology. - Bound Kamino DVI contact allocation with a per-world geometry heuristic instead of sizing every contact pair simultaneously; set
collision_detector.max_contacts_per_worldto override the inferred capacity. - Fix panel-parallel RCM-blocked LLT factorization hanging when a matrix ends in a partial tile.
- Fix USD capsule, cylinder, and cone visual and site scaling to follow the authored primitive axis.
- Fix MJCF contact pairs ignoring properties inherited from pair default classes.
- Fix disabled USD colliders participating in particle collisions when visual shape loading is disabled.
- Fix
ArticulationView.is_fixed_basefor roots with zero effective degrees of freedom, including fully locked D6 joints. (#3727) - Fix USD plane visual width and length to scale along the axes defined by the
UsdGeomPlaneschema, and orient X- and Y-axis plane visuals along the authored axis. - Validate
ArticulationViewmask shapes and devices before launching selection kernels. (#3448) - Exclude active particles with non-finite positions from rebuildable
SolverImplicitMPMsparse-grid packing. - Fix incorrect hydroelastic contact surfaces for primitive shapes. (#3150, #3239)
- Fix masked
SolverCoupledProxy.reset()calls clearing proxy feedback history for unselected worlds. - Fix masked solver resets modifying unselected worlds or discarding their coupling and contact history.
- Fix MJCF, URDF, and USD imports rendering collision-only bodies as visuals when the asset authors visual geometry elsewhere. (#3291)
- Fix fully locked XPBD joints becoming permanently separated after large transient anchor errors.
- Fix
SchemaResolverPhysxreading every D6 translational limit gain from thelinearinstance instead of itstransX,transY, ortransZinstance. - Fix USD capsule, cylinder, and cone visuals and sites without authored
radius/heightto use the UsdGeom schema fallbacks, matching collision shapes. - Fix
ViewerUSDtexture consumers observing partially written PNGs by publishing generated textures atomically (#3288) - Fix loading of textures packaged inside
.usdzarchives; package-relative asset paths such asscene.usdz[tex.png]are resolved through USD's asset resolver instead of being treated as filesystem paths. - Preserve cross-import collision pairs when
SolverMuJoCocombines independently imported MJCF mask domains. - Fix
ModelBuilder.add_usd()raisingValueErrorwhen importing a mesh whose material subset binds a texture that decodes to an image array. - Fix
ModelBuilder.add_usd()dropping textures from full meshes and material subsets without recoverable UVs; preserve the texture for projected rendering. - Fix textured USD visual meshes and material subsets rendering tinted by scalar or default per-shape colors; textured meshes now import with a white base color so their textures are shown untinted.
- Fix
ModelBuilder.add_usd()selecting a non-color map (e.g. a roughness, metallic, or normal map) as a mesh's base-color texture. A connectedUsdUVTextureis now accepted only when it feeds a base-color input by name through its multi-channel color output, and a shader's direct-asset color parameter (e.g. an MDLdiffuse_texture) is likewise identified by name. - Fix MJCF imports ignoring
compiler assetdirwhen resolving mesh, texture, and heightfield assets. - Fix scrambled textures on USD meshes whose texture-coordinate primvar is not named
st(e.g.st_0). The texcoord set is now resolved from the bound material's shader network (theUsdPreviewSurfacetexture reader'svarnameor an MDL/OmniPBRuv_space_index), and textured material subsets slice real per-corner UVs and authored normals instead of collapsing faceVarying data per vertex. - Fix builder merging (
ModelBuilder.add_builder(),add_world(),replicate()) offsetting negative reference sentinels in custom attribute values stored as NumPy or Warp integer scalars. - Fix
ModelBuilder.add_usd()requiring the optionalmujocopackage when handlingMjcActuatorprims, including during default MJC equality conversion. - Fix
ModelBuilder.add_usd()ignoring enabled collider mass properties and counting disabled colliders toward body mass. (#3594) - Fix
ModelBuilder.add_usd()treating explicitly authored USDMassAPIschema fallback values (zero mass, density, inertia, or principal axes; non-finite center of mass) as overrides; per the schema's value semantics they now behave like unauthored attributes, while negative or non-finite mass, density, and diagonal inertia values are ignored with a warning. (#3418) - Report malformed MJCF free-joint and inertial inputs with deterministic validation errors, and ignore MJCF mesh geom
sizelengths consistently. - Fix MJCF imports ignoring material and inline RGBA colors on primitive geoms.
- Preserve MJCF
contype/conaffinitycollision filtering when importing into Newton, and compose later Newton pair filters when using native MuJoCo contacts. - Fix
SolverMuJoCosite poses for offset batched worlds and site poses and sizes for runtime shape updates. (#3389) - Fix
ModelBuilder.add_usd()silently dropping a MuJoCo joint equality constraint when the asset supplies the leader joint and coefficients throughNewtonMimicAPIinstead of the deprecatedmjc:target,mjc:coef0, andmjc:coef1.MjcEqualityJointAPIbuilds onNewtonMimicAPI, so both spellings are now accepted. - Fix
ModelBuilder.add_usd()ignoringnewton:mimicEnabledon a joint withMjcEqualityJointAPIapplied. Such a joint is now imported disabled rather than coupled, which also stops the default equality conversion from enforcing the coupling in every solver. - Fix
SolverVBDfailing to construct on large multi-world scenes containing particles and rigid shapes. (#3660) - Fix
SolverKaminoruntime model updates for joint limits, body inertia and centers of mass, shape properties, and forward-kinematics state. (#3386, #3549, #3577, #3602) - Fix Style3D solver divergence caused by isolated vertices.
- Fix a use-after-free where finalizing a second model built from shared mesh geometry (e.g. via
ModelBuilder.replicate()orModelBuilder.add_builder()) invalidated the meshes referenced by previously finalized models. - Fix compiler warnings about overflowing int32 constants when compiling SDF texture and
SensorTiledCamerakernels. - Fix
SolverVBDparticles using world 0 gravity in multi-world models instead of their assigned world's gravity. (#3692) - Fix
SensorIMUto use per-world gravity for world-local sites not attached to a body. - Fix USD site import to discover sites beneath non-visual containers, collider prims, and instanceable rigid-body prims independently of
load_visual_shapes; the reworked traversal also speeds up import of scenes with many nestedXformor instance prims. - Fix
SolverFeatherstoneBALL joints to apply passivejoint_dampingon all three angular DOFs. - Fix
eval_ik()andSolverSemiImplicitrounding small float32 revolute-joint angles to zero. (#3434) - Fix excessive memory usage when importing MJCF or URDF models containing many visual-only shapes with self-collisions disabled.
- Prevent explicit MJCF classes from retaining unrelated
childclassdefaults. - Fix
FastKitchenG1ASV metrics to build the kitchen scene instead of a plain G1 model. - Fix the
diffsim_bearexample crashing with its default CUDA configuration and diverging after a few training iterations. - Fix masked PID state reset to execute on the integral-state device. (#3447)
- Fix
SolverKaminoto preserve resets for bodies whose center of mass is offset from the body frame. (#3605) - Fix a spurious
SolverKaminofloating-base reset warning. (#3563) - Fix
eval_inverse_dynamics_passive()reading past a DOF-sized scratch buffer undernewton.use_coord_layout_targets = True, producing intermittent NaNs for models with free, ball, or distance joints. - Fix MJCF imports ignoring
fromtotransforms and lengths on sites. - Reject invalid hollow primitive shell thickness before computing inertia.
- Fix convex decomposition of disconnected mesh components so unified multi-part collision meshes preserve separate convex parts. (#3261)
- Fix
ModelBuilder.add_mjcf()ignoring positive explicit mass on mesh geoms. (#3595) - Preserve muscles and rigid-body color groups when copying or replicating a
ModelBuilder. - Fix
ModelBuilder.add_usd()to honorPhysicsScene.gravityDirection, including stage-to-builder rotation and per-world imports. - Fix
ModelBuilder.add_usd()to initialize maximal and free-base generalized state from authored rigid-body velocities, including local-to-world rotation and angular unit conversion. (#3322) - Fix
ModelBuilder.collapse_fixed_joints()to transport body velocity when merging changes the center of mass. (#3322) - Fix
ModelBuilder.add_mjcf()to honor compilerinertiafromgeomandinertiagrouprange, and keep inferred mass independent ofparse_visuals. (#3596) - Fix
SolverKaminofree-joint Jacobians to follow Newton's child-center-of-mass wrench convention. (#3707) - Fix passive universal-joint constraints in
SolverKaminoforward kinematics. (#3720) - Fix
SolverKaminocontact warm-starting reading past the active contact buffer when a geometry-pair run reaches the end of the prior contact set. (#3641) - Fix
SolverKaminocontact-buffer undersizing for plane pairs, heterogeneous multi-world scenes, external collision pipelines, and saturated earlier worlds.max_contactsremains a model-wide cap on inferred geometry budgets; setcollision_detector.max_contacts_per_worldfor an explicit per-world capacity. (#3732) - Fix stale overlay layers remaining visible after switching examples in the OpenGL viewer.
- Fix
SolverKaminoCG/CR solves silently under-iterating on CPU graph capture; the capture-safe loop path now runs on any capturing device, not only CUDA, so CPU captures no longer record a stale host-readback convergence decision at record time. - Reject incompatible custom attribute and frequency definitions before composing
ModelBuilderinstances. - Fix
cloth_frankaexample rendering particles at simulation scale (cm) instead of viewer scale (m) - Fix
ModelBuildermerges to accept array-valued transform fields and plain-list particle color groups. - Fix
SensorTiledCameratiled rendering for image sizes that are not exact multiples of the configured tile dimensions. - Fix
SensorTiledCameradeformable triangle rendering to respect per-particle world indices. - Fix USD import topology depending on material vocabulary: mesh subsets now split on the authored material-binding structure, so a subset bound to a material whose properties Newton does not recognize (e.g. an MDL shader) imports as its own unshaded submesh instead of changing the mesh's imported shape count. (#3351)
- Add experimental
ModelBuilder.add_usd()support for the proposed AOUSD Deformable Body Physics schema: (#3192)- Import curves as cables made of capsule bodies connected by cable joints, with each cable wrapped in its own articulation; import meshes as cloth and tet meshes as soft bodies. Bound deformable materials supply thickness, stiffness, and density, and mass precedence is per-point
physics:masses, then bodymass/density, then material density. Return element ranges and authored cable/cloth attributes (path_cable_attrs/path_cloth_attrs) by prim path as build-time snapshots. Collision participation followsPhysicsCollisionAPI/physics:collisionEnabled: cables without an enabled collider import without collision, while cloth/volume collision disabling warns as unsupported. Cablephysics:filteredPairsexpand to segment shapes; cloth/volume pairs warn and are not lowered. Disabled or kinematic deformables and malformed topology warn and are skipped. - Import cable
PhysicsAttachmentprims. Hard point/segment sites targeting anxformbecome ball joints returned inpath_attachment_map; hard coincident point-to-point cable attachments weld the cables into one rod graph. Unsupported cloth/volume, springy, or non-coincident attachments warn and remain available inpath_attachment_attrs. - Return deformable element/attribute maps and attachment maps only with
return_deformable_results=True. Without it, the defaultadd_usd()return mapping remains unchanged and contains no deformable entries. - Import
PhysicsElementCollisionFilterprims for cable, rigid-body, and collider element groups. Group counts pair elements in order; a count of0or an empty counts array selects all elements. Unsupported cloth/volume element sources warn and are skipped. - Add
newton.usd.DEFORMABLE_LEGACY_NAMESPACESfor explicitly retaining legacy deformable material namespace compatibility during migration.
- Import curves as cables made of capsule bodies connected by cable joints, with each cable wrapped in its own articulation; import meshes as cloth and tet meshes as soft bodies. Bound deformable materials supply thickness, stiffness, and density, and mass precedence is per-point
- Add scalar value-based OpenCV, F-theta, and Kannala-Brandt fisheye camera ray helpers to
SensorTiledCamera.utils, plus pinhole aperture/focal-length parameters,compute_camera_transforms_usd(),compute_camera_rays_usd_pinhole(), and optional preallocated ray output writes. (#3026) - Add
cloth_stiff_material_hangingandcloth_stiff_material_stretchexamples regression-guarding the new Neo-Hookean triangle material (stability under gravity at extreme stiffness, and bulk area-preservation across a Poisson-ratio sweep) - Add
ViewerUSD(points_as_spheres=...)to renderlog_pointsparticles as aUsdGeom.PointInstancerof sphere prototypes; enabled by default (opt out withpoints_as_spheres=Falsefor flatUsdGeom.Pointssplats). (#2990) - Add
ViewerBase.camera_speedto configure keyboard translation speed for interactive viewers. (#3478) - Add list-of-pattern and explicit-index selectors to
ArticulationView. (#3294) - Add
newton[onnx]for ONNX policy inference through Warp-NN;ControllerNeuralMLP,ControllerNeuralLSTM, and RL policy examples can run exported.onnxpolicies without requiring PyTorch for ONNX execution. (#3227) - Add three VBD contact examples —
vbd_rigid_rigid_contact,vbd_soft_rigid_contact, andvbd_soft_rigid_mix_contact— demonstrating rigid-rigid, soft (particle-rigid), and mixed cloth-bag contacts - Add masked rigid-body reset support to
SolverVBD; particle resets are not yet supported. (#3316) - Add viewer layer system to overlay multiple solvers/models in supported rendering viewers; call
ViewerBase.activate(layer_id)to route subsequentset_model/log_state/log_*calls into a named layer,ViewerBase.set_layer_visible()to toggle layers independently, andViewerBase.set_layer_transform()to position layers side-by-side. Seeexample_basic_multi_solver_overlay.py. (#2876) - Add SDF contact support for convex-hull shapes with mesh-attached SDFs and opt-in SDF contact generation for box shapes.
- Add opt-in filtering of static-static, static-kinematic, and kinematic-kinematic contacts during broad-phase collision detection. Set
CollisionPipeline(include_static_kinematic_pairs=False)to enable filtering; the default preserves existing contact generation.Model.shape_contact_pairsremains an unfiltered superset for direct consumers such asSolverKaminoand hydroelastic SDF setup. - Add opt-in
body_frame_origin="com"toModelBuilder.add_rod()andModelBuilder.add_rod_graph()for COM-centered cable capsule body frames. - Add
Model.shape_collision_filter_contains(),Model.shape_collision_filter_mask(), andModel.shape_collision_filter_pairs_array()for solver integrations that need collision-filter queries. (#3187) - Add
CollisionPipeline.soft_rigid_contact_pair_countfor the number of precomputed soft-rigid (particle-shape) candidate pairs, filtered to compatible worlds, launched for soft-contact generation; this is the default capacity forsoft_contact_max - Add user-defined pressure laws to hydroelastic SDF contact via
HydroelasticSDF.Config.pressure_func(a@wp.funcmapping(signed_depth, shape_idx, data) -> pressure) andpressure_data(a@wp.structcarrying per-shape state). The contact patch is the iso-pressure surfacep_a == p_b; the default linear lawpressure = -kh * signed_depthis preserved when no callback is supplied. (#2705) - Add
SensorTiledCamera.utils.assign_checkerboard_material(shape_indices=...)for applying the checkerboard texture to selected shapes. - Add USD import support for
NewtonJointAPI(newton:armature,newton:damping,newton:friction,newton:velocityLimit,newton:limitStiffness,newton:limitDamping). Attributes broadcast uniformly to every DOF on the joint. If per DOF variance is required, recommendation is to break apart into 1-DOF (i.e. revolute & prismatic) joints instead. (#3275) - Add support for pt2 neural-network checkpoints (saved via
torch.export.save) inControllerNeuralMLPandControllerNeuralLSTM. (#3356) - Add a
deterministicconstructor argument toSolverXPBD,SolverSemiImplicit,SolverFeatherstone,SolverVBD, andSolverMuJoCoto opt into deterministic solver execution; the default inheritswp.config.deterministic. (#3300) - Add
SolverKamino.ResetConfigfor explicit reset source configuration. (#3220) - Add configurable friction and restitution mixing modes (
average,multiply,max, ormin) forSolverKaminothroughSolverKamino.Config().materials.friction_mix_modeand.restitution_mix_mode. (#3382) - Add
SolverMuJoCo.EqTypeas the MuJoCo-scoped equality-constraint enum. (#3296) - Add
SensorContact.position_matrixalongsideforce_matrix, reporting per-counterpart world-frame contact positions (force-weighted average of contact midpoints). (#3369) - Forward
--warp-config KEY=VALUEfrompython -m newton.teststo example subprocesses sowarp.configoverrides apply during example tests. - Add
--render-fpsto cap example rendering rate without changing simulation frame timing - Add
basic_dzhanibekovexample demonstrating free rigid-body intermediate-axis instability across VBD, XPBD, and MuJoCo solvers - Add experimental inverse-dynamics evaluation for articulated systems:
eval_inverse_dynamics_passive()populates any requested mass matrix, gravity force, and Coriolis force in caller-allocated arrays, whileeval_inverse_dynamics_force()combines them with a caller-providedjoint_qddintojoint_f; both functions support articulation masks directly and throughArticulationView. (#2753, #3530) - Expose
MeshAdjacencyData(the device-resident soft-mesh adjacency struct returned byMeshAdjacency.to()) as public API for use in custom Warp kernels. (#3194) - Add
Model.AttributeSpecandModel.attribute_specsfor declaring model-attribute indexing, references, and view/compaction behavior in one metadata registry. (#2848) - Add
ModelBuilder.BvhConfigfor selecting Warp BVH constructors during model finalization for mesh, Gaussian, and shape BVHs. (#2864) - Add an experimental coupled solver framework: (#2848)
- Introduce
newton.solvers.experimental.coupledwithSolverCoupled,SolverCoupledProxy,SolverCoupledADMM, andModelViewfor multi-solver ownership, state mapping, and view-local model overrides. - Support body and particle proxy coupling with virtual inertia, solver hooks, MPM collider/transfer proxies, and convergence diagnostics.
- Support ADMM coupling from model-derived joints, body-particle attachments, and collision-detected rigid/particle contacts with Coulomb friction.
- Add standalone multiphysics examples and regression coverage for MuJoCo/Kamino, VBD, XPBD, MPM, and ADMM contacts.
- Add
--coupled-viewto coupled multiphysics examples and exposeSolverCoupledentry view/state helpers for rendering individual sub-solver views.
- Introduce
- Add
BODY_F,PARTICLE_F, andJOINT_FtoStateFlags. (#2848) - Add
newton.usd.get_mesh()and extendMesh.create_from_usd()to load USD mesh prims, stages, file paths, and URLs. (#3214) - Add opt-in full-surface rigid-soft contact generation: (#3262)
- Set
enable_rigid_soft_full_surface_contact=TrueonModel.collide()orCollisionPipeline, and provision participating rigid mesh/convex volume SDFs withModelBuilder.ShapeConfig.configure_sdf(force_sdf=True)beforefinalize(). The default remains the previous per-particle contact path. - Detect soft-triangle edge and face crossings in addition to particle contacts.
Contacts.soft_contact_indicesstores soft particle IDs as avec3iwith-1padding—(p, -1, -1)for a particle,(v0, v1, -1)for an edge, and(v0, v1, v2)for a face—andContacts.soft_contact_barycentricstores the corresponding weights. Heightfields and finite planes warn and fall back to per-particle contact; a participating mesh/convex without a provisioned SDF is an error. - Consume full-surface contacts with standalone
SolverVBD. Other solvers andSolverCoupledProxytwo-way coupling reject them. See the newvbd_gripper_soft_gridandvbd_gripper_soft_triangleexamples.
- Set
- Require
warp-lang>=1.15.0for Newton andnewton-usd-schemas>=0.4.0for theimportersextra. (#3275, #3422) - Upgrade
mujocoto 3.10 andmujoco-warpto 3.10.0.2, and propagateModel.shape_gapinto MuJoCo'sgeom_gap/pair_gapso contact-detection ranges authored on Newton shapes are honored by MuJoCo's broadphase. Shapes without an explicit gap inheritModelBuilder.rigid_gap = 0.1, which now reaches MuJoCo and may increase detected contacts, sensor output, contact-buffer pressure, and runtime. To preserve the previous detection envelope, setbuilder.rigid_gap = 0.0before adding shapes or useModelBuilder.ShapeConfig(gap=0.0)per shape. (#3502; fixes #2980) - Continue accepting the deprecated
SolverMuJoCo(ls_parallel=...)argument for compatibility, but ignore its value because MuJoCo Warp removed parallel line search; remove the argument from solver construction. (#2980) - Align MJCF and USD margin/gap import with MuJoCo 3.9+. Drop the
mj_margin - mj_gapsubtraction;Model.shape_marginnow matches authoredmargin, andModel.shape_gapmatches authoredgap. Passlegacy_margin_gap=TruetoModelBuilder.add_mjcf()orModelBuilder.add_usd()to restore the pre-3.9 translation for files authored against MuJoCo <= 3.8. (#2980) - Allow standalone world-root joints to remain outside articulation metadata during
ModelBuilder.finalize(); useSolverXPBD,SolverSemiImplicit, orSolverMuJoCo's standalone-root fallback, or add the joints to an articulation for solvers that require reduced-coordinate articulation metadata. (#3119) - Non-schema per-DOF initial state attributes (
newton:{axis}:position,newton:{axis}:velocity) now emit aUserWarningwhen encountered during USD import, directing users to file a feature request. - Change the default CoACD convex decomposition threshold from
0.5to0.05to match CoACD's default. To preserve the previous coarse decomposition, setbuilder.default_mesh_approximation_cfg.coacd_threshold = 0.5; it applies wheneverthresholdis not passed explicitly toModelBuilder.approximate_meshes(), including USD imports throughadd_usd(). (#3471; fixes #3444) - Reject out-of-range integer indices passed to
ArticulationView.include_jointsorinclude_links; ensure every index is within the articulation's joint or link range. (#3294) - Enable particle-particle contact forces by default in standalone
SolverSemiImplicit: the solver now rebuildsModel.particle_gridevery substep and adds contact forces to the existingparticle_f. Existing scenes with particles closer than2 * particle_max_radius + particle_cohesionmay change trajectories; setmodel.particle_grid = Nonebefore stepping to preserve the previous behavior without particle-particle contacts. (#2848) - Change
CollisionPipeline.soft_contact_maxto default to the precomputedsoft_rigid_contact_pair_countinstead ofshape_count * particle_count; passsoft_contact_max=model.shape_count * model.particle_countto preserve the previous capacity. (#3118) - Correct
SolverFeatherstoneto honor the existing public FREE/DISTANCEjoint_qdconvention: six values per joint as child-COM linear velocity followed by angular velocity, both expressed in the joint parent frame. Do not reorder existing inputs. Floating-root FREE/DISTANCE articulations now use a root-COM-centered internal solve frame for improved stability far from the world origin; their trajectories may differ numerically and should be retested. (#2539) - Exclude particles without
ParticleFlags.ACTIVEfromSolverImplicitMPMgrid transfers, including mass and velocity. Simulations that used inactive particles as fixed obstacles must keep those particles active and set their mass to0to retain kinematic boundary behavior. (#2848) - Add
collider_particle_idstoSolverImplicitMPM.setup_collider()for deformable mesh colliders and make all parameters keyword-only. Pass every argument by name. (#2848, #3524) - Breaking change (experimental
SolverVBD): Change damping semantics. Existingkd-family values produce different damping and must be converted or retuned: (#2877)- Interpret damping coefficients as absolute physical units instead of dimensionless stiffness-relative (Rayleigh) multipliers (
D = kd · ke). Affected parameters are tetrahedralk_damp[Pa·s],tri_kd, springkd[N·s/m], cablestretch_damping[N·s/m] andbend_damping[N·m·s/rad] inadd_joint_cable()/add_rod()/add_rod_graph(),joint_target_kd,joint_limit_kd(includingJointDofConfig.limit_kd), shape contactkd/shape_material_kd,soft_contact_kd[N·s/m], andSolverVBD(rigid_joint_linear_kd=..., rigid_joint_angular_kd=...). To preserve previous values, setkd_new = kd_old · k, wherekis the paired stiffness or penalty coefficient, and pass the product to the same field. - Use an objective Neo-Hookean membrane/tet damping metric based on the rate of
C = FᵀF, so rigid-body rotations no longer generate damping force. Re-tune scenes that relied on damping from rigid rotation. - Apply spring damping only along the spring axis, so transverse and rigid-rotational motion is no longer damped. Re-tune scenes that relied on transverse damping.
- Interpret damping coefficients as absolute physical units instead of dimensionless stiffness-relative (Rayleigh) multipliers (
- Apply each shape's
ShapeConfig.margin(model.shape_margin) toSolverVBDparticle-rigid (soft) contacts, widening the soft-contact detection shell and reducing penetration depth per shape; previously only the globalsoft_contact_marginand particle radius were used. Re-check VBD scenes that set per-shape margins. (#2994) - Rework
SolverKamino.reset()to use an explicitResetConfigandwp.boolworld masks. Replace the previous reset-source keyword arguments withResetConfig.to_default(),ResetConfig.preserve(),ResetConfig.from_joints(), or an explicitResetConfig(...); replacewp.int32masks withwp.bool, for examplewp.array([False, True, False], dtype=wp.bool)orwp.ones((num_worlds,), dtype=wp.bool). (#2934, #3220) - Enable graph capture on CPU in examples and allow
SolverVBDcontact buffers to grow during CPU graph capture. (#3387) - Assign one default visual color to capsule segments generated by
ModelBuilder.add_rod()oradd_rod_graph(); passcolor=to choose an explicit cable color. (#2670) - Move the MuJoCo guide from
/integrations/mujocoto/solvers/mujocoand the Isaac Lab page from/integrations/isaac-labto/lab/isaac-lab; use the new Solvers and Isaac Lab navigation entries.
- Deprecate
newton.geometry.MATCH_BROKENandnewton.geometry.MATCH_NOT_FOUNDwithout replacement; do not rely on or import these values. (#3498) - Deprecate implicit render-config updates in
SensorTiledCamera.utils.create_default_light()andSensorTiledCamera.utils.assign_checkerboard_material(); setsensor.default_render_config.enable_shadowsorsensor.default_render_config.enable_texturesexplicitly instead. (#3408) - Deprecate
SensorTiledCamera(..., config=...)in favor ofSensorTiledCamera(..., default_render_config=...); migrate constructor calls that pass a render config to the new keyword. (#3408) - Deprecate
SensorTiledCamera.render_configin favor ofSensorTiledCamera.default_render_config; migratesensor.render_config.enable_shadows = Truetosensor.default_render_config.enable_shadows = True. (#3408) - Deprecate per-DOF
newton:{axis}:limitStiffnessandnewton:{axis}:limitDampingattributes (where{axis}islinear,angular,rotX,rotY, orrotZ). Use the broadcastnewton:limitStiffnessandnewton:limitDampingattributes fromNewtonJointAPIinstead; the broadcast value applies uniformly to all DOFs on the joint. For joints requiring per-DOF variance, split into separate 1-DOF (revolute / prismatic) joints. (#3275) - Deprecate passing solver constructor options positionally after stable positional inputs such as
modeland explicit solver configs; migrate calls such asSolverVBD(model, 10)toSolverVBD(model, iterations=10). (#2993) - Deprecate
ModelBuilder.find_shape_contact_pairs(); shape contact pairs are generated automatically byModelBuilder.finalize(), so configure collision filters before finalization instead of rebuilding contact pairs manually. (#3187) - Deprecate
newton.EqTypein favor ofnewton.solvers.SolverMuJoCo.EqType; migrate equality-constraint type references to the MuJoCo-scoped enum. (#3296) - Deprecate unsorted integer indices for
ArticulationView.include_jointsandArticulationView.include_links; sort indices in ascending order. (#3294) - Deprecate
State.body_q_prevwithout replacement because solvers now manage previous body transforms internally; applications that need pose history should cloneState.body_qexplicitly. (#3372) - Deprecate passing option-heavy helper API parameters positionally, including
ModelBuilder.ShapeConfig,ModelBuilder.JointDofConfig,Contacts,ArticulationView, and selectedModelBuilderbody, joint, shape, rod, cloth, soft-body, and FEM helpers. Keep stable identifiers such asbody,parent/child, capacity counts, and topology indices positional; migrate calls such asadd_shape_box(body, xform, hx=...)toadd_shape_box(body, xform=xform, hx=...). (#2993) - Deprecate loading TorchScript (
torch.jit.save) and dict (torch.save) neural-network checkpoints inControllerNeuralMLPandControllerNeuralLSTM; re-export legacy checkpoints as.pt2archives withtorch.export.save(). (#3356) - Deprecate omitting
body_frame_origininModelBuilder.add_rod()andModelBuilder.add_rod_graph(); the implicit behavior still uses the existing start-node body-frame convention during the deprecation window, but the implicit default will change tobody_frame_origin="com"in a future release. Passbody_frame_origin="start"to preserve the legacy frame orbody_frame_origin="com"to opt into the future COM-centered frame. (#2670) - Deprecate mutating
Model.shape_collision_filter_pairs; modifyModelBuilder.shape_collision_filter_pairsbefore callingfinalize()and rebuild the model instead, because mutating finalized collision filters does not rebuildModel.shape_contact_pairs. (#3187) - Deprecate reading legacy vendor-namespaced deformable material attributes (
omniphysics:,physxDeformableBody:) off any bound material innewton.usd.get_tetmesh(),newton.TetMesh.create_from_usd(), andModelBuilder.add_usd(). They are still read during the deprecation window, with aDeprecationWarning; a future release will read only canonicalphysics:attributes from a material applyingPhysicsVolumeDeformableMaterialAPI. Migrate by authoring the canonical attributes, or keep the old behavior without the warning viacompat_namespaces=newton.usd.DEFORMABLE_LEGACY_NAMESPACES(get_tetmesh/create_from_usd) orschema_resolvers=[..., SchemaResolverPhysx()](add_usd).compat_namespacesis now keyword-only; pass()to opt into the canonical-only behavior today. (#3192) - Deprecate the
indicesargument ofMeshAdjacencyin favor oftri_indices. (#3194) - Deprecate
MeshAdjacency.add_edge; construct aMeshAdjacencywithedge_indices([o0, o1, v0, v1]rows) instead. (#3194) - Deprecate the
MeshAdjacency.edgesdict accessor; use theedge_indices/edge_tri_indicesarrays instead. (#3194) - Deprecate
SensorTiledCamera.utils.compute_pinhole_camera_rays()in favor ofSensorTiledCamera.utils.compute_camera_rays_pinhole(). (#3026)
- Tune VBD contact settings in the
basic_shapesandcable_bundle_hysteresisexamples for more consistent friction and recovery behavior. (#3446) - Fix USD import ignoring ancestor material bindings with
strongerThanDescendantsstrength when a mesh authorsmaterial:bindingwithout applyingMaterialBindingAPI: material resolution now uses UsdShade's canonicalComputeBoundMaterialunconditionally, which also adds collection-based binding support. Prims authoring bindings without the applied schema are invalid USD and now surface USD's own warning (once per prim per import) — fix such assets withusdcheckerorusd-validation-nvidia. (#3350) - Fix
ModelBuilder.add_usd()to honorignore_pathsin the custom-frequency traversal, so prims under ignored subtrees no longer register spurious custom-frequency rows in two-pass import workflows. (#3406) - Fix USD joint
physics:collisionEnabledimport so joints with two explicit bodies honor authored collision behavior; joints to world continue to allow body/world collisions, and articulation-wide self-collision filtering remains additive. (#3320) - Fix
ViewerFile.is_running()to returnFalseafterViewerFile.close()so headless recording loops can terminate like interactive viewers. (#3190; fixes #3094) - Fix mesh-approximation fallback behavior:
- Stop forwarding CoACD/V-HACD-only keyword arguments to the convex-hull fallback when the decomposition backend fails or is unavailable.
- Ignore incompatible non-mesh entries in explicit
shape_indices; processGeoType.MESHandGeoType.CONVEX_MESHentries. - Replace failed remeshing results with the documented bounding-box approximation instead of leaving the original mesh in place.
- Raise an error when
SolverVBD(rigid_contact_history=True)would allocate or grow contact-history buffers during CUDA graph capture; constructCollisionPipelinebeforeSolverVBD, or run one uncaptured solver step before capture. - Fix
SensorTiledCamera.utils.convert_ray_depth_to_forward_depth()to preserve the clear-depth sentinel for zero-direction rays and non-positive depths. - Fix
SolverMuJoCoplacing articulations whose root is a fully-locked D6 joint (e.g. imported from a generic USDPhysicsJoint) at the first world's root pose in every world; such roots now become mocap bodies like fixed-joint roots. (#3499; fixes #3430) - Fix
SensorTiledCamerarendering cloth and volume deformable vertices as particle spheres while preserving standalone particle rendering in mixed scenes. (#3518) - Fix
ViewerGL.get_frame()crashing when a CPU model is rendered while a CUDA context is active. - Fix
ViewerUSDleaving stale particle geometry visible when the active particle count drops to zero. (#2992) - Fix
eval_inverse_dynamics_passive()andSolverFeatherstoneintermittently dropping descendant wrench contributions during the articulated-body backward pass on CUDA. (#3443) - Fix XPBD particle-particle contacts to avoid non-finite particle state for exact-overlap contacts. (#1562)
- Refer to
kfconsistently as contact friction gain in public documentation. (#2988) - Fix
SolverMuJoCodropping the authoredactuator_ctrlrange/actuator_ctrllimited/actuator_forcerange/actuator_forcelimitedwhen rebuilding USD/MJCF position/velocity actuators imported asJOINT_TARGET, so the compiledmj_modelnow clamps control targets and actuator forces like native MuJoCo. - Fix
SolverVBDrigid contact injecting kinetic energy for yawed finite-radius contacts (e.g. small-radius cables blowing up). The normal response now acts at the geometric skeleton point rather than the rotating surface anchor, which was non-conservative under reorientation; friction still uses the surface anchor to preserve finite-radius slip. (#3125) - Fix
SolverXPBDrigid restitution activation so contact thickness is not double-counted after applying contact offsets. (#3287; fixes #3034) - Fix
SolverKaminocontact filtering and constraint stabilization so gap/margin contacts are handled consistently, positive-distance contacts can be filtered as configured, and converted contact forces/wrenches populate matching Newton contact slots forSensorContact. (#2908) - Fix
SolverKaminohandling ofControl.joint_ffor joints with implicit joint dynamics: include the load in the joint equation and do not also apply it as an external body wrench. (#3134) - Fix
SolverKaminoPOSITION actuation to apply configured derivative damping toward zero velocity; existing position-controlled trajectories may need retuning ifjoint_target_kdis nonzero. (#3466) - Fix masked
SolverKamino.reset()calls to invalidate the contact and joint-limit warm-start caches only for the selected worlds. (#3393) - Fix
SolverMuJoCoconvergence tolerance scaling for models with kinematic bodies. - Fix
SolverMuJoCoinertia randomization for bodies initialized with diagonal inertia. - Fix
SolverMuJoCostatic worldbody geometry poses so offset batched worlds collide with their local geometry. - Fix memory growth in the Style3D solver when CUDA Graph capture is disabled
- Limit mouse-picking torque using each body's rotational inertia to prevent unstable angular acceleration on low-inertia bodies.
- Fix multi-angular-DOF
JointType.D6kinematics and dynamics: (#2975)- Build
newton.eval_jacobian,SolverFeatherstone, and IK analytic Jacobian angular motion-subspace columns in the current joint frame, soJ @ joint_qdmatchesState.body_qdat non-identity configurations. - Report the correct
SolverMuJoCoState.body_qdangular velocity at non-identity configurations. - Correct
SolverFeatherstoneCoriolis/centrifugal forces so torque-free bodies conserve angular momentum. - Correct
newton.eval_fk()/newton.eval_ik()rotations and joint velocities when three angular axes form a left-handed orthonormal basis.
- Build
- Fix mesh inertia computation to produce deterministic results across repeated CUDA runs. (#3136)
- Fix
SolverXPBD.step()rejectingcontacts=Nonefor particle models with shapes, and align its optional control and contact annotations withSolverBase.step(). - Fix
ModelBuilder.add_builder()andModelBuilder.finalize()time and memory scaling for large replicated scenes with collision filter pairs. (#1675) - Fix mesh-SDF contacts with positive contact gaps by making contact reduction prefer margin-depth contacts over gap-only directional fallbacks. (#3490)
- Fix USD import of
MjcJointAPIjoints without authoredmjc:solreflimitto use MuJoCo's(0.02, 1)default instead ofModelBuilderdefaults. (#3286; fixes #2929) - Fix
SolverImplicitMPMwhole-step CUDA graph capture failing when the rheology inner solver is an iterative linear method such assolver="cg". (#3155) - Fix intermittent
SolverCoupledADMMcrashes when resetting particle-grid state. (#3467) - Fix coupled solvers generating stale contacts after a contact-producing sub-solver is disabled. (#3477)
- Fix
ControllerNeuralMLPandControllerNeuralLSTMto feed raw joint velocity to the network instead of velocity error (target_vel - velocity), matching the actuator-net input convention used for training (position error and joint velocity). (#3413) - Preserve MJCF geom visualization groups when constructing MuJoCo models. (#2492)
- Fix USD import so non-unit
metersPerUnitandkilogramsPerUnitwarn as unsupported, and stop scalingPhysicsScenegravity magnitude bymetersPerUnit. - Fix swapped kinetic and potential energy labels in the
basic_plottingexample, and report per-world values directly so the live plot overlays match the side-panel readouts - Fix free-joint coordinate initialization and
SolverMuJoCocoordinate conversion to respect parent body poses and non-identityjoint_X_p/joint_X_canchor transforms. - Fix
SolverMuJoColoading USD models with supported standalone body-to-world joints outside an authored articulation, including Apptronik Apollo; warn when using this fallback and report unsupported rootless mechanisms explicitly. - Fix USD import of MJCF weld and connect equalities that represent world with the stage's non-rigid default prim.
- Fix USD import of authored rigid-body centers of mass to apply inherited transform scale. (#3332)
- Fix VBD collision damping to use relative normal gap rate so uniform contact-stencil motion and tangential sliding do not create artificial normal damping.
- Fix
SolverVBDbuilding unused per-body rigid and particle contact lists for static and kinematic bodies, which caused unnecessary work and misleading contact-buffer overflow warnings. - Fix multi-world soft contact filtering to avoid cross-world rigid-soft particle-shape pairs and VBD soft-soft triangle/edge candidates.
- Fix
ModelBuilder.add_usdso a stray authored joint outside any articulation root no longer suppresses base-joint (articulation) creation for unrelated floating rigid bodies in the same call. (#3002) - Fix
SolverSemiImplicitball joints to applyjoint_dampingon all three angular DOFs. - Preserve unclassified MJCF geoms referenced by explicit contact pairs when
parse_visuals=False. (#3284) - Fix
RenderContexttriangle mesh construction by removing the unsupporteddevice=keyword fromwp.Mesh(...). - Fix MJCF
eulerproducing wrong orientations for multi-component angles by treating angles as intrinsic rotations. (#3030) - Fix MJCF parsing so attributes from multiple
<compiler>elements, including<include>-expanded children, are merged in document order. (#3030) - Fix MJCF worldbody static geoms bypassing the visual/collider class filter, so
parse_visuals=Falsedrops visual-class geoms attached directly to<worldbody>too. (#3030) - Fix
ModelBuilder.add_usd()creating partial articulation metadata for jointed USD mechanisms withoutPhysicsArticulationRootAPI; keep the authored joints consistently outside articulations without emitting importer warnings. (#3092) - Fix
ModelBuilder.add_usd()silently ignoring authored Newton USD collision schemas whennewton-usd-schemasis unavailable. USD import now fails clearly instead of continuing without the registered schema defaults required for SDF and hydroelastic configuration. - Fix
cable_cross_slide_tableexample stability so the cable-driven table reliably tracks its rectangular path and catches drift during regression runs. - Fix the
robot_policyexample overflowing narrow-phase contact capacity. (#3463) - Fix the
recordingexample's contact gap so the recorded bodies settle on the ground. (#3500) - Fix URDF
package://mesh fallback resolution withoutresolve-robotics-uri-pyso package names only match full path components instead of unrelated directory-name substrings - Fix TetMesh USD loading to infer unambiguous length-1 custom attributes as
AttributeFrequency.ONCE, flatten indexed primvars, and omit uninferable attributes without dropping the soft body.ModelBuilder.add_usd()imports only registered TetMesh attributes using their declared frequencies. (#3228) - Fix
ModelBuilder.collapse_fixed_joints()crashing withIndexErrorwhen amujoco:equality_constraintrow omits optional fields (anchor,relpose) that carry defaults. (#3054) - Fix
ViewerGL.set_model()resetting headless/interactive camera and wind state when switching between models that use the same up-axis. (#2658) - Fix bend force calculation error in Style3D solver
- Fix
SolverSemiImplicitparticle-particle contact evaluation by rebuildingModel.particle_gridbefore contact generation and accumulating contact forces into, rather than overwriting,particle_f. (#2848)
- Remove the non-canonical
material:bindingrelationship fallback from USD material resolution; materials resolve exclusively through UsdShade'sComputeBoundMaterial. Prims that author a plainmaterial:bindingwithout applyingMaterialBindingAPIstill resolve (USD tolerates them with a warning), but assets relying on bare purpose-specific relationships only (e.g.material:binding:previewwith no universal binding) or on binding targets that are notMaterialprims no longer resolve. Validate and repair such assets withusdcheckerorusd-validation-nvidia. (#3350) - Remove support for the legacy
newton_actuators-styleModelBuilder.add_actuator(actuator_class, input_indices=...)signature; useadd_actuator(controller_class, index=..., ...)withnewton.actuatorscontrollers (e.g.ControllerPD,ControllerPID) instead. (#3170) - Remove the deprecated
newton-actuatorspackage dependency; all actuator functionality is built intonewton.actuators. (#3170) - Remove the deprecated
state=Noneandrefit_bvharguments ofSensorTiledCamera.update(); pass aStateand refit BVHs explicitly viaModel.bvh_refit_shapes()/Model.bvh_refit_particles()before rendering frames that change geometry. (#3171) - Remove support for
worlds_per_row=0inSensorTiledCamera.flatten_*_to_rgba()(deprecated in 1.2.0); passworlds_per_row=Nonefor automatic layout (values below 1 now raiseValueError). (#3149) - Remove the deprecated SensorTiledCamera 1.1 API surface:
Config,RenderContext,render_context, image helper methods, and random color helpers; useRenderConfig,default_render_config,SensorTiledCamera.utils.*, and per-shape colors instead. (#3168) - Remove the deprecated
SensorRaycast; useSensorTiledCamera(SensorTiledCamera.utils.compute_camera_rays_pinhole()andcreate_depth_image_output()for single-camera depth) instead. (#3169) - Remove the deprecated
Viewer.update_shape_colors(); write toModel.shape_colordirectly instead. (#3161) - Remove the deprecated
max_worldsparameter ofViewerBase.set_model(); callViewerBase.set_visible_worlds()afterset_model()instead. (#3164) - Remove body armature: drop
ModelBuilder.default_body_armature, thearmatureparameter ofModelBuilder.add_link()andadd_body(), and USD-authored bodynewton:armature(deprecated in 1.1.0); add any isotropic artificial inertia directly toinertiainstead. Alladd_link()andadd_body()parameters are now keyword-only. (#3153) - Remove support for passing a
Gaussianas the second positional argument toModelBuilder.add_shape_gaussian()(deprecated in 1.1.0); pass it via thegaussian=keyword instead. (#3159) - Remove the deprecated
a,b,cparameters ofModelBuilder.add_shape_ellipsoid()(deprecated in 1.1.0); userx,ry,rzinstead. (#3157) - Remove the deprecated Style3D
CollisionHandler; useCollisioninstead. (#3133) - Remove the deprecated implicit MPM
collider_velocity_modealiases'finite_difference'and'instantaneous'(deprecated in 1.1.0); use'backward'and'forward'instead. (#3167) - Remove the deprecated and ignored
rigid_enable_dahl_frictionargument ofSolverVBD; Dahl friction is auto-detected frommodel.vbd.dahl_eps_max/model.vbd.dahl_tau. (#3172) - Remove the deprecated top-level
Model.equality_constraint_*fields,ModelBuilder.equality_constraint_*fields,ModelBuilder.add_equality_constraint*()methods,Model.AttributeFrequency.EQUALITY_CONSTRAINT, andCustomAttribute.references="equality_constraint"; usemodel.mujoco.equality_constraint_*,ModelBuilder.add_custom_values(), and the"mujoco:equality_constraint"custom frequency instead. (#3296)
- Add
newton.use_coord_layout_targetsopt-in flag exposingModel.joint_target_q/Control.joint_target_qshaped(joint_coord_count,)(matchingjoint_q) andjoint_target_qdshaped(joint_dof_count,)(matchingjoint_qd); solvers, the actuator library, andModelBuilder.finalize()honor the flag. Defaults toFalsefor backwards compatibility; will flip in a future release. (#2965) - Add
joint_dampingmodel attribute andJointDofConfig.dampingfor velocity-proportional damping that is always active. (#2304) - Add
SolverBase.reset()method for in-place solver state resets with optionalworld_maskandStateFlags; default implementation is a no-op. (#2657) - Implement
SolverMuJoCo.reset()to reset selected worlds: it resetsState.joint_q/State.joint_qdto the model defaults (gated byStateFlags) and clears the per-world MuJoCo buffers that persist between steps (qacc_warmstart,qfrc_applied,xfrc_applied,act,ctrl), so a world recovers cleanly on the next step after a divergence (e.g. NaNs); accepts an optionalworld_mask. (#3062) - Add
StateFlagsenum to control which state attributes are reset. (#2657) - Add
ModelFlagsas the canonical name for model-change notification flags. (#2657) - Add opt-in
validate_meshparameter toModelBuilder.add_cloth_mesh(),ModelBuilder.add_soft_mesh(), andstyle3d.add_cloth_mesh()that warns on degenerate geometry; add publicnewton.utils.validate_triangle_mesh()andnewton.utils.validate_tet_mesh()utilities - Add edge-simplification options to
Mesh.build_sdf()that drop near-coplanar internal edges from the mesh-edge set used by SDF-mesh contact generation:edge_lower_angle_threshold_rad(default 0.1°; pass a negative value to opt out and keep the full edge set),edge_upper_angle_threshold_rad, opt-inedge_box_absorption, and box half-extent controlsedge_box_half_{normal,lateral}/edge_box_half_{normal,lateral}_rel. (#2894) - Add
ModelBuilder.ShapeConfig.sdf_paddingandModelBuilder.shape_sdf_paddingfor setting the per-shape SDF AABB padding [m] used when building primitive texture SDFs and deferred mesh SDFs - Add
contact_reduction_hashtable_size_factortoCollisionPipeline,NarrowPhase, andHydroelasticSDF.Configfor increasing contact reduction hashtable capacity when fill/failure warnings appear. (#2978) - Add
Model.bvh_build_shapes(),Model.bvh_refit_shapes(),Model.bvh_build_particles(), andModel.bvh_refit_particles()for managing model BVHs, with optionalbvh_constructorselection on the build methods. (#3039) - Add functional
newton.intersect_ray()shape query helper for composing custom raycast sensors. (#2971) - Add
Model.heightfield_countfor the number ofGeoType.HFIELDshapes in a model. (#3039) - Document loop closure in the articulations concept page, covering the omit-from-
add_articulationpattern and USDexcludeFromArticulationwith per-solver caveats - Add
model.mujoco.equality_constraint_objtype,_target_kind, and_targetfields, recording the object kind a MuJoCo equality references and whether it was projected onto a native loop joint or mimic constraint for solver portability. (#2959) - Add
newton.actuators.SchemaNamesexposing the canonical USD schema token constants used byparse_actuator_primfor actuator USD parsing - Parse URDF
<material>colors (inline<color rgba>and named material references) during import and apply them toModelBuilder.shape_colorfor all shape types - Add opt-in
collapse_massless_fixed_rootto URDF and MJCF importers to collapse massless fixed-root chains for maximal-coordinate solvers while preserving topology by default - Parse
NewtonSDFCollisionAPIattributes from USD inModelBuilder.add_usd(), including thenewton:hydroelasticEnabledtoggle, absolute narrow band / margin, texture format, hydroelastic stiffness (newton:hydroelasticStiffness), and applied-API schema defaults. Hydroelastic configuration is folded intoNewtonSDFCollisionAPIand opted into vianewton:hydroelasticEnabled(defaultfalse). SDF generation is opt-in by applying the API; for primitive shapes the SDF is only built when hydroelastic is also enabled. (#2533) - Add USD parsing for
NewtonSiteAPIto mark shapes as sites - Add USD parsing for
NewtonMassAPI: shell mass model (newton:massModel), shell thickness (newton:shellThickness), and compact inertia tensor (newton:inertia). (#2951) - Add USD parsing for contact response attributes (
ke,kd,kf,ka) fromNewtonMaterialAPIon bound materials. (#3005) - Add
ViewerGL.show_loading_splash()/ViewerGL.hide_loading_splash()displaying a stylized Newton's-cradle overlay while the GL viewer waits on Warp kernel compilation; raised automatically bynewton.examples.init()for visible GL viewers - Add an optional
kernel_block_dimargument toSensorTiledCamera.update()for tuning the Warp ray-tracer'srender_megakernellaunch shape - Add
rec_idparameter toViewerRerunfor specifying the recording ID, enabling multiple processes to share a single Rerun recording - Add
ViewerRTX, a real-time ray-traced viewer powered by NVIDIA OVRTX. (#1861) - Add edge overlay toggle (
renderer.draw_edges) for wireframe visualization on top of solid geometry - Add
newton.utils.ColorSpace,color_srgb_to_linear(),color_linear_to_srgb(), andSensorTiledCamera.RenderConfig.output_color_spacefor color-space boundaries. (#2411) - Add
cable_cross_slide_tableexample demonstrating a cable-driven XY table - Add robotics tutorial notebook covering ModelBuilder, solvers, CUDA graphs, IK, and pick-and-place
- Add rigid-soft contact example covering a rigid sphere dropping onto an XPBD tetrahedral soft grid
- Users of heightfield ray queries,
newton.intersect_ray(), or sensor rendering should callModel.bvh_refit_shapes(state)after shape state changes.GeoType.HFIELDray queries now use the mesh BVH built duringModelBuilder.finalize()instead of per-thread DDA grid traversal; only code manually launching internal raycast kernels is affected by the removed heightfield-specific kernel buffers. (#2971, #3039) - Users who update shape or particle state after finalization should call
Model.bvh_refit_shapes()orModel.bvh_refit_particles()before BVH-backed queries.ModelBuilder.finalize()now builds shape and particle BVHs automatically; useModel.bvh_build_shapes()andModel.bvh_build_particles()only when explicitly rebuilding, selecting a custom constructor, or working with manually populated models. (#3039) - Users who relied on
ModelBuilder.finalize()populatingMesh.sdfon sharedMeshinstances should callMesh.build_sdf()directly when reusable SDF data must live on theMesh. The finalized model now retains deferred SDF data internally for contact generation; do not depend onModel.shape_sdf_indexorModel.texture_sdf_data. (#2533) - Users configuring SDF or hydroelastic options on convex-hull shapes should build and attach SDF data on the underlying
MeshwithMesh.build_sdf()instead.ModelBuilder.add_shape_convex_hull()(and any path producingGeoType.CONVEX_MESH) now raisesValueErrorifShapeConfig.sdf_*orShapeConfig.is_hydroelasticare set, matchingadd_shape_mesh(). (#2533) - USD importer users who co-apply
NewtonSDFCollisionAPIandNewtonMeshCollisionAPIon the same prim should expect a warning and SDF configuration to be used. The importer now treats these as independent collision representations, ignoresphysics:approximationon SDF prims with a warning, andModelBuilder.approximate_meshes()raisesValueErrorfor mesh-replacing methods (convex_hull,coacd,vhacd,bounding_box,bounding_sphere) when a target shape carries deferred SDF configuration or theHYDROELASTICflag. (#2533) - USD users with invalid or under-specified SDF configuration now get warnings and degraded imports instead of whole-import failures. A hydroelastic
Meshprim without an SDF source (nonewton:sdfMaxResolution/newton:sdfTargetVoxelSize) imports as a plain mesh collider with hydroelastic disabled. AnsdfMaxResolutionnot divisible by 8, an unknownsdfTextureFormat, and bothsdfMaxResolutionandsdfTargetVoxelSizeauthored on the same prim each warn with the prim path and fall back to defaults (sdfTargetVoxelSizetakes precedence oversdfMaxResolution). The Python API path (ShapeConfig.validate()) still raises. (#2533) - Users comparing SDF-mesh contact distances or normals may see small shifts below typical
contact_thresholdandshape_marginsettings. The SDF-mesh narrow phase now uses hardware-filtered SDF texture sampling with centred-difference gradients; hydroelastic SDF sampling is unchanged. Pass a negativeedge_lower_angle_threshold_rad(e.g.-1.0) toMesh.build_sdf()to disable the new edge-simplification pass and reproduce the pre-optimisation behavior with the full edge set. (#2894) - Support negative (mirrored) scale on mesh, convex hull, and SDF shapes, so a single
Meshinstance can be shared across shapes with different signed scales without re-baking. (#2837) - Users passing negative scale to symmetric primitive shapes (sphere, box, capsule, cylinder, ellipsoid, plane, gaussian) should apply mirrors through the shape transform (
xform) instead if the sign matters.ModelBuilder.add_shape*now normalizes these negative scale components toabs()because the shapes are point-symmetric. (#2837) - Users passing negative scale to cones or heightfields must now mirror cones through the shape
xformand pre-mirror height data before passing positive heightfield scale.ModelBuilder.add_shape_cone()and heightfield shapes now reject negative scale components that were previously silently accepted and produced invalid geometry. (#2837) - MJCF/USD import users who need the legacy MuJoCo equality-constraint arrays should pass
convert_mjc_equality_constraints=False. MuJoCo equality constraints now convert to Newton loop joints and mimic constraints by default while preserving MuJoCo metadata forSolverMuJoCoround-trips. (#2959) - Change
SolverMuJoCojoint-limitjnt_solrefconversion so Newton force-spacejoint_limit_ke/joint_limit_kdmatch the configured limit stiffness/damping at the joint limit instead of MuJoCo's acceleration-space default. The conversion uses MuJoCo's per-DOFdof_invweight0, so effective dynamics depend on asset mass/inertia. (#2610, #3132) SolverMuJoCousers with Newton-authored joint-limit gains should retunejoint_limit_ke/joint_limit_kdper asset mass/inertia and timestep. The same numeric stiffness/damping can produce different dynamics than Newton 1.2, and previously damped assets may become underdamped or hit MuJoCo's timestep safety clamp. MJCF/USD-authored nativemjc:solreflimit/model.mujoco.solreflimitvalues stay in raw MuJoCo mode (SOLREF_MODE_RAW) and are not rescaled; unauthored MJCF defaults stay inSOLREF_MODE_MJCF_DEFAULTuntil their Newton gains are edited. To keep native MuJoCo behavior, author/pass rawsolreflimit, or setjoint_limit_ke <= 0orjoint_limit_kd <= 0to restore MuJoCo's defaultsolreflimit = (0.02, 1.0). (#2610, #3132)- Warn from
SolverMuJoCowhen aJointType.FREEjoint has a non-world parent; MuJoCo requires free joints to attach directly to the world SolverKamino.reset()users should migratestate_out=calls tostate=and pass reset targets by keyword, such asbase_q=.... The method now resets in place onstate, matchesSolverBase.reset(), and no longer accepts betastate_out=or legacy positional reset-target compatibility. (#2657)- Accept plain
intflag bitmasks in solver reset and model-change notification APIs so users can define extension bits beyondStateFlagsandModelFlags. (#2657) - Mark
SolverVBDas experimental. (#3068) - Mark
SolverKaminoas experimental. (#3065) - Mark the actuator API as experimental in its docstring. (#3067)
- Mark the
"sticky"contact-matching mode as experimental in its docstring. (#3067) SensorTiledCamerausers who relied on previous linear-byte packedcolorandalbedooutputs should passRenderConfig(output_color_space=ColorSpace.LINEAR). Packedcolorandalbedonow default to sRGB-encoded bytes so authored display colors render at the expected display brightness. (#2411)- Auto-scale
ViewerGLcontact arrows, joint axes, and COM markers byViewer.scene_scale; to approximate the previous fixed sizes afterset_model(), setviewer.renderer.arrow_length_scale = 0.1 / viewer.scene_scale,viewer.renderer.joint_scale = 0.1 / viewer.scene_scale, andviewer.renderer.com_scale = 0.1 / viewer.scene_scale. (#2856) - Make the
ViewerGLleft control panel movable (drag the title bar) and resizable (drag the bottom-right corner); a vertical scrollbar appears automatically when contents overflow and is operable with the mouse wheel or two-finger trackpad gestures. The initial dock-on-left position is unchanged. (#2926) - Remove the
cbor2<6dependency ceiling after updating recorder deserialization to accept mapping-like decoded containers - Users configuring Warp logging should use Newton's
--quietflag or--warp-config log_level=...instead of legacy Warpverboseorquietconfig keys. Newton now requires Warp 1.14 and configures Warp logging throughwarp.config.log_level. (#2900, #3046) - Rename
SensorContactsensing-object API names:sensing_obj_idxtosensing_indices,sensing_obj_typetosensing_type,sensing_obj_transformstosensing_transforms,sensing_obj_bodiestosensing_bodies, andsensing_obj_shapestosensing_shapes; the old names remain deprecated aliases for compatibility. (#3120) - Bump
newton-usd-schemasto>=0.3.1
- Users of joint target aliases should migrate
Model.joint_target_pos/Control.joint_target_posandModel.joint_target_vel/Control.joint_target_veltojoint_target_q/joint_target_qd. The legacy names emit aDeprecationWarningand raiseAttributeErrorwhennewton.use_coord_layout_targets = True. Set that flag before building a model to switchjoint_target_qtojoint_coord_countshape (matchingjoint_q); the defaultFalsekeeps the legacyjoint_dof_countlayout.ModelBuilder.joint_target_pos/ModelBuilder.joint_target_velare now read-only deprecated aliases (the writable attributes are removed) — set per-axis targets viaJointDofConfig.target_pos/target_velor write directly toModelBuilder.joint_target_q/joint_target_qd. (#2965) - Actuator users should pass
control_target_pos_attr="joint_target_q"(and the velocity counterpart) explicitly to adopt the future default now. The implicitActuatordefault that resolvescontrol_target_pos_attr/control_target_vel_attrto legacyjoint_target_pos/joint_target_velwhennewton.use_coord_layout_targetsisFalseis deprecated and will switch tojoint_target_q/joint_target_qdin a future release. (#2965) - Deprecate
SensorTiledCamera.utils.assign_checkerboard_material_to_all_shapes()in favor ofSensorTiledCamera.utils.assign_checkerboard_material(shape_indices=...). - Deprecate
SolverNotifyFlagsin favor ofModelFlags; migrate calls such asSolverNotifyFlags.MODEL_PROPERTIEStoModelFlags.MODEL_PROPERTIES. (#2657) SolverVBD.register_custom_attributes()users who want Dahl cable friction should passdahl_defaults_enabled=Falseand explicitly author positivemodel.vbd.dahl_eps_maxandmodel.vbd.dahl_tauvalues instead of relying on registered default values. Implicit positive Dahl defaults are deprecated. (#2921)- Deprecate
Model.mujoco.dof_passive_dampingin favor ofModel.joint_damping; MuJoCodampingimport now populatesModel.joint_dampingand the old namespaced attribute remains a warning alias. (#2304) - Deprecate the
ls_parallelargument ofSolverMuJoCo; parallel line search is being removed frommujoco_warp. Removels_parallelfrom solver construction. (#3096) - USD authors should put contact response attributes on bound
NewtonMaterialAPImaterials instead of shape prim custom attributes.newton:contact_ke/newton:contact_kd/newton:contact_kf/newton:contact_kaon shape prims are deprecated in favor ofnewton:contactStiffness/newton:contactDamping/newton:contactFrictionGain/newton:contactAdhesionon the bound material. (#3005) - USD authors should put material-level contact stiffness/damping on bound
NewtonMaterialAPImaterials, or use per-shapemjc:solref(MjcGeomAPI) when per-shape MuJoCo settings are needed. Material-levelmjc:solrefis deprecated in favor ofnewton:contactStiffness/newton:contactDampingon the bound material. (#3005) - Deprecate module-level BVH helpers
newton.geometry.build_bvh_shape(),refit_bvh_shape(),build_bvh_particle(), andrefit_bvh_particle()in favor ofModel.bvh_build_shapes(),Model.bvh_refit_shapes(),Model.bvh_build_particles(), andModel.bvh_refit_particles(). (#3039) - Deprecate
Model.has_heightfieldsin favor ofModel.heightfield_count; usemodel.heightfield_count > 0for boolean checks. (#3039) - Users reading
SDF.texture_block_coordsshould stop depending on it. The attribute now always returnsNoneand will be removed in a future release because the hydroelastic broadphase derives block coordinates arithmetically from each SDF's coarse-texture dimensions. (#2701) - Users reading
Model.sdf_block_coordsandModel.sdf_index2blocksshould stop depending on these internal broadphase caches. Both attributes are now lazily recomputed from each SDF's coarse-texture dimensions (matching the new broadphase semantics) and will be removed in a future release. (#2701, #3072) - Users reading public SDF storage attributes should stop depending on them directly. Public access to
Model.shape_sdf_index,Model.texture_sdf_data,Model.texture_sdf_coarse_textures,Model.texture_sdf_subgrid_textures, andModel.texture_sdf_subgrid_start_slotsis deprecated because these are implementation details of the SDF contact pipeline. The public aliases keep working during the deprecation window and will be removed in a future release. (#2701, #3072)
- Remove
SensorContact.net_force(deprecated in 1.1.0); useSensorContact.total_forceandSensorContact.force_matrixinstead. (#2945) - Remove
SensorContact(include_total=...)(deprecated in 1.1.0); useSensorContact(measure_total=...)instead. (#2945) - Remove
SensorContact.sensing_objs(deprecated in 1.1.0); useSensorContact.sensing_indicesandSensorContact.sensing_typeinstead. (#2945) - Remove
SensorContact.counterpartsandSensorContact.reading_indices(deprecated in 1.1.0); useSensorContact.counterpart_indicesandSensorContact.counterpart_typeinstead. (#2945) - Remove
SensorContact.shape(deprecated in 1.1.0); usetotal_force.shape/force_matrix.shapeinstead. (#2945) - Remove
SensorContact.ObjectTypeenum (deprecated in 1.1.0); use thesensing_typeandcounterpart_typeattributes instead. (#2945) - Remove internal
raycast_kernel_no_hfield; raycast code now usesraycast_kernelwith heightfield raycasting routed through the mesh BVH path. (#2971) - Remove the examples helper
newton.examples.compute_world_offsets; useModelBuilder.replicate()when duplicating a model, ornewton.utils.compute_world_offsets(world_count, spacing, up_axis=...)if you only need placement offsets. (#3075)
- Fix
SensorTiledCameranot rendering heightfield (HFIELD) shapes, which were missing from the render BVH. Heightfields are now rendered through the existing mesh path (they are triangulatedwp.Meshshapes), which also resolves a tiled-camera render-performance regression caused by the unused heightfield branch lowering the render kernel's GPU occupancy. (#3088) - Fix hydroelastic SDF contact surfaces dropping the central region under deep interpenetration. The broadphase used to skip subgrids whose centers were deeper than the SDF narrow band, leaving a hole in the contact patch when overlap exceeded the narrow-band thickness. Broadphase now visits every subgrid in the SDF coarse grid (block coordinates are derived arithmetically from per-shape SDF coarse-texture dimensions); sampling at far-inside locations is correct because the coarse SDF is dense and accurate everywhere. On-disk SDF caches written by earlier versions are transparently re-cooked on first load (
_sdf_cache.CACHE_FORMAT_VERSIONbumped to2). (#2701) - Fix mesh and convex-mesh contact sign classification for watertight meshes with nearby opposing surfaces or inconsistent triangle winding. (#3004)
- Fix
ModelBuilder.collapse_fixed_joints()producing a NaN center of mass when collapsing joints between zero-mass bodies - Fix USD import losing authored negative scales on shape and parent xforms, so mirrored primitives and meshes are now imported with the correct signed scale. (#2936)
- Respect USD color-space metadata for scalar material colors and convert linear-authored USD color textures to display space when loading them. (#2411)
- Fix USD import of orphaned body-to-world fixed joints not accounting for ancestor xform offsets, so pinned bodies now FK to the correct world pose (env origin + spawn xform). (#2974)
- Fix USD import of revolute and D6-angular joint
limit_ke/limit_kdfrommjc:solreflimitbeing over-scaled by ~57x. (#2736) - Fix
SolverMuJoCopassingnumpy.bool_scalars for themocapandactgravcompparameters when building the MuJoCo spec, causing aDeprecationWarningunder NumPy 2.2 and silent behavioral breakage under NumPy 2.5 where boolean scalars are no longer interpreted as integer indices. (#3098) - Fix MJCF
xyaxesparsing to treat the second vector as Y and derive Z from X cross Y - Fix
SolverMuJoCoreturningState.joint_qdin world frame for rootFREEjoints with non-identityparent_xform, violating the documented parent-frame contract and corrupting derivedbody_qd. (#2871) - Fix MJCF joint
dampingattribute being ignored bySolverFeatherstone - Fix
SolverMuJoCogenerated MuJoCo joint names for multi-axis D6 joints to avoid duplicate names - Fix
SolverMuJoCoball-joint frame conversion:joint_qand position-target quaternions were applied in the wrong basis whenchild_xformhad a non-identity rotation, andjoint_qd/ velocity targets / applied / actuator torques were applied and read back in the wrong basis whenever the ball was away from its rest pose. (#2981) - Fix
SolverMuJoCoto preserve authored zero-valued USDmjc:solreflimitvalues as raw MuJoCo data and avoid writing limitsolrefvalues to unlimited joints in saved MJCF - Honor authored
mujoco.solreflimit_modeeven when a non-zeromujoco.solreflimitis also present, so the explicit mode (force-space or raw) is authoritative - Fix
SolverMuJoCoCPU backend overwritingmj_model.body_iquatwith Newton's eigendecomposition result on everyBODY_INERTIAL_PROPERTIESnotify; the compiled principal-axes basis is now preserved, fixing single-contact box equilibrium (incorrect normal force) and stiff WELD-loop instabilities (Nan, Inf or huge value in QACC) caused by basis ambiguity on repeated eigenvalues. (#3018) - Fix
SolverMuJoCoCPU backend dynamics for asymmetric MJCFdiaginertiamodels whose principal moments are reordered during Newton/MJWarp synchronization - Fix
SolverMuJoCohonoring force-spaceshape_material_ke/shape_material_kdfor contacts (use_mujoco_contacts=False); authoredmjc:solrefis preserved via newmujoco.solref/mujoco.solref_modeper-shape custom attributes. Force-space scaling is unsupported onuse_mujoco_contacts=Trueand the MuJoCo CPU backend. (#2964) - Fix MJCF importer rejecting MuJoCo's one-value
solreflimit/solrefshorthand emitted bymujoco.MjSpec.to_xml()for default-valued joints, which brokeSolverMuJoCo(save_to_mjcf=...)round-trips - Fix
eval_fk()overwriting VBD-simulatedJointType.CABLEbody poses - Fix
SolverVBDcustom attribute setup sovbd:joint_is_hardcan be authored without implicitly enabling Dahl cable friction by callingSolverVBD.register_custom_attributes(..., dahl_defaults_enabled=False) - Fix
SolverKaminocontact anchors being shifted off the geometry surface byShapeConfig.margin, which biased friction - Fix rigid-rigid friction in
SolverVBDfor contacts with nonzerorigid_contact_offset0/rigid_contact_offset1 - Fix
SolverXPBDbody_parent_freporting to includeControl.joint_fcontributions and accumulate multiple inbound joint contributions, matching theSolverMuJoCoandSolverFeatherstoneconvention - Fix
SolverXPBDtetrahedral constraints reading static model activations instead of runtime control activations - Fix
SolverXPBDtetrahedral constraints ignoring FEM material stiffness and damping - Fix
ViewerFileplayback dropping namespaced custom attributes (e.g.model.mujoco.geom_solimp) when restoring into a freshModel - Fix
ViewerGLGUI rendering at half size on HiDPI / Retina displays by scaling the ImGui style, fonts, sidebar width, andlog_imagewindow/tile/spacing constants with pyglet'swindow.scale(with framebuffer-to-window ratio as a fallback). DPI changes are tracked at runtime via the pygleton_scaleevent so the GUI follows the window across displays with different scaling. (#2926) - Fix ground grid clipping in the Viser renderer
- Fix
brick_stackingexample contact gaps to avoid oversized contact envelopes around the robot, table, and ground - Fix
example_softbody_giftemitting spurious non-manifold edge warnings caused by mismatched 5-tet diagonals across adjacent cubes in the soft body mesh - Fix
basic_conveyorexample emitting a spurious inertia validation warning at finalize
- Add
ArticulationView.joint_labels,link_labels(aliased asbody_labels), andshape_labelsexposing the full template-articulation labels alongside the existing leaf-only*_names, so callers can disambiguate selected entries whose leaf names collide.
- Fix mesh-convex and heightfield-convex contacts missing when shapes are separated by margin but still within the contact envelope.
- Fix
ArticulationViewlink selections for closed-loop joints so BODY-frequency accessors expose each physical body once. - Fix USD visual mesh imports to preserve face-material
UsdGeom.Subsetcolors and textures by splitting material subsets into separate render meshes; collision/physics import behavior is unchanged
- Add linear HDR color output support to
SensorTiledCameraviahdr_color_image. - Add composable actuator subsystem with pluggable
Controller(ControllerPD,ControllerPID,ControllerNeuralMLP,ControllerNeuralLSTM),Clamping(ClampingMaxEffort,ClampingDCMotor,ClampingPositionBased), andDelaycomponents; supports per-DOF delays, CUDA graph capture, and masked environment reset - Add heatmap rendering for scalar arrays logged through
ViewerGL.log_array() - Add Blender-style orbit, pan, and dolly controls to the GL viewer using middle-mouse drag combinations
- Add
SolverXPBD.update_contacts()to populatecontacts.forcewith per-contact spatial forces (linear force and torque) derived from XPBD constraint impulses - Add
body_parent_fextended state attribute support toSolverXPBDso it populates per-body incoming joint wrenches in world frame at the body's COM (matchesSolverMuJoCo's convention; values are approximate due to XPBD's relaxation and non-momentum-conserving nature) - Add
body_parent_fextended state attribute support toSolverFeatherstonepopulated directly from the RNEA backward pass (per-body net spatial wrench translated to the body's COM, matching theSolverMuJoCoconvention) - Add public
newton.geometry.build_bvh_shape(),build_bvh_particle(),refit_bvh_shape(), andrefit_bvh_particle()helpers for managing model BVHs - Raise process priority automatically in
--benchmarkmode for more stable measurements; add--realtimefor maximum priority. - Import per-shape authored color from USD stages into
ModelBuilder.shape_color - Add
TRIANGLE_PRISMsupport-function type for heightfield triangles, extruding 1 m along the heightfield's local -Z so GJK/MPR naturally resolves shapes on the back side - Add
ViewerGL.log_scalar()for live scalar time-series plots in the viewer - Add
Mesh.is_watertightproperty (cached) that reports whether every geometric edge is shared by exactly two triangles - Add
HydroelasticSDF.Config.mc_edge_clamp_minto expose the marching-cubes edge-interpolation clamp; default0.02matches the previous hard-coded value. Set to0.0to disable the clamp and recover faithful contact-surface dynamics for threading-style scenarios (#2702) - Add
deterministicflag toCollisionPipelineandNarrowPhasefor GPU-thread-scheduling-independent contact ordering via radix sort and deterministic fingerprint tiebreaking in contact reduction - Add
shape_pairs_maxoverride onCollisionPipelineto cap the SAP/NXN broad-phase candidate-pair buffer below the worst-caseN*(N-1)/2per-world bound, avoiding multi-GB allocations on large sparse scenes (a too-small value triggers a runtime overflow warning) - Add fast parity-based SDF construction path for watertight meshes in
SDF.create_from_mesh, usingwp.mesh_query_point_sign_parityinstead of winding numbers; selected via the newsign_methodargument ("auto"— the default — picks parity whenMesh.is_watertightis true, or"parity"/"winding"to force either strategy) - Add
Viewer.log_image()for displaying single or batched images inViewerGL; other backends inherit a no-op. Also addSensorTiledCamera.utils.to_rgba_from_color(),to_rgba_from_normal(),to_rgba_from_depth(), andto_rgba_from_shape_index()(hash palette or caller-provided RGB lookup) adapters producing output consumable bylog_image(). - Add on-disk caching of cooked texture-based SDFs via the new
cache_dirargument onSDF.create_from_meshandMesh.build_sdf. Cached entries are content-addressed by mesh and build parameters, written atomically as a single uncompressed.npz, and versioned viaCACHE_FORMAT_VERSIONso format changes invalidate stale caches transparently - Enable CPU execution of the collision pipeline, including mesh–mesh and mesh–heightfield SDF contacts and contact reduction (
reduce_contacts) that were previously CUDA-only, by replacing the CUDA__shared__fast paths insdf_contact.py,multicontact.py, andcollision_core.pywith portablewp.tile_stack/wp.tile_mesh_query_aabbprimitives. CPU runs now execute the same kernels as CUDA; the previous"NarrowPhase running on CPU: mesh-mesh contacts will be skipped"warning is no longer emitted. - Add
ViewerBase.log_arrows()for arrow rendering (wide line + arrowhead) in the GL viewer with a dedicated geometry shader - Add frame-to-frame contact matching via
CollisionPipeline(contact_matching=...)with modes"latest"(populatescontacts.rigid_contact_match_index) and"sticky"(experimental; additionally replays previous-frame contact geometry on matched contacts — the sticky update strategy may change without warning). Optionalcontact_report=Trueexposes new/broken contact index lists onContacts. - Add VBD rigid-contact warm-starting via
rigid_contact_history, backed byContacts.rigid_contact_match_indexfromCollisionPipeline(contact_matching="latest"). - Add VBD hard/soft controls for body-body contacts and structural joint slots, including
rigid_contact_hard,SolverVBD.set_joint_constraint_mode(), andSolverVBD.JointSlot - Add AVBD contact/joint alpha overrides and linear/angular beta overrides to
SolverVBDfor stabilization and penalty-ramping control - Add
enable_multiccdparameter toSolverMuJoCofor multi-CCD contact generation (up to 4 contact points per geom pair) - Warn when
SolverMuJoCodetects installedmujocoormujoco-warpversions that do not satisfypyproject.tomlrequirements - Support
<joint type="ball"/>in the MJCF importer, and preserve authored damping, stiffness, and frictionloss when exporting ball joints to MuJoCo specs (previously silently dropped) - Add
ViewerViser.log_scalar()for live scalar time-series plots via uPlot - Honor
UsdGeomImageablevisibility (including inheritedinvisible) on USD prims imported viaModelBuilder.add_usd(); visual shapes, gaussian splats, and collider shapes are imported withShapeFlags.VISIBLEcleared when the prim is effectively invisible, while collision behavior is preserved - Add import of
UsdGeom.TetMeshprims as soft meshes throughModelBuilder.add_usd() - Add site-targeted actuator support to MuJoCo solver
- Add USD parsing support for equality constraints based on the
MjcEqualityschema - Add more solver options to implicit MPM:
gs-soa(orgauss-seidel-soa) for improved memory coalescing,gs-batched(orgauss-seidel-batched) merging GS colors with Jacobi-style mass-split parallelism, pluscr(Conjugate Residual) andgmreslinear solver options. - Add frame-by-frame step support to
ViewerGL: press.while paused to advance one simulation frame - Add ViewerBase.should_step() — call once per frame to determine whether the simulation loop should advance; returns True when not paused.
- Add Kamino-specific simulation examples in
newton/examples/kamino - Add per-mesh
coloroverride toViewerBase.log_mesh()for tinting individual meshes without authoring per-vertex colors - Add per-mesh
roughnessandmetallicPBR overrides toViewerBase.log_mesh()
- Use pre-computed local AABB for
CONVEX_MESHshapes incompute_shape_aabbs, avoiding a per-frame support-function AABB computation - Build mesh SDFs via the texture-based sparse path only; sample via
SDF.texture_datainstead ofSDF.sparse_volume/SDF.coarse_volume. - Change implicit MPM default
solverfrom"gs"to"auto", which selects"gs"for trilinear bases and"gs-batched"for higher-order ones. Setsolver="gs"explicitly to restore the previous behavior. - Change
SolverImplicitMPM.Config.solverwarmstart syntax from+-separated strings to ordered sequences; usesolver=("cg", "gauss-seidel")instead ofsolver="cg+gauss-seidel". - Change implicit MPM default
collider_basisfrom"Q1"to"S2"for improved contact quality; setcollider_basis="Q1"explicitly to restore the previous behavior. - Change GL viewer scroll to dolly toward the orbit pivot; use Ctrl+scroll for FOV zoom
- Render all GL viewer lines (joints, contacts, wireframes) as geometry-shader quads instead of
GL_LINESfor uniform width across zoom levels and non-square viewports - Adjust grouping of
reset,step, andpausecontrols so they appear together - Bump
Pillowfloor to>=11.3.0 - Bump
jupyterlablower bound to>=4.5.7to pick up the fix for CVE-2026-40171 - Replace
ModelBuilder.add_actuator(actuator_class, input_indices=..., output_indices=..., **kwargs)withModelBuilder.add_actuator(controller_class, index=..., clamping=[...], delay_steps=..., pos_index=..., **ctrl_kwargs)where each call registers a single DOF - Change
ArticulationView.get_actuator_parameter(actuator, name)andset_actuator_parameter(actuator, name, values)to require acomponentargument identifying the owningController,Clamping, orDelayinstance:get_actuator_parameter(actuator, actuator.controller, "kp") - Update default environment map texture in GL viewer (source: https://polyhaven.com/a/brown_photostudio_02)
- Remove the implicit-MPM rasterized collider's reliance on Warp's
warp.femmodule (behavior unchanged) - Replace the StVK VBD triangle membrane material with the stable Neo-Hookean form (Smith et al. 2018, adapted to 2D shells). The upstream two-constraint Rayleigh damping model is preserved unchanged
- Bump
mujocoandmujoco-warpdependencies to~=3.8.0(mujoco-warprequires>=3.8.0.3) - Bump
GitPythonlower bound to>=3.1.47to pick up the fix for GHSA-x2qx-6953-8485 (multi_optionsargument injection inRepo.clone_from) - Bump
open3dfloor to>=0.19.0 - Bump
meshiofloor to>=5.3.5;5.3.0callsnp.string_which was removed in NumPy 2.0 - Bump
newton-usd-schemasto>=0.2.0introducing new experimental actuator schemas & re-aligning friction defaults - Restrict
usd-coreto<26.5to avoid deprecation warnings introduced in 26.5 - Require explicit
SensorTiledCameraBVH lifecycle management instead of implicit camera maintenance: callnewton.geometry.build_bvh_shape()/build_bvh_particle()once after setup, thenrefit_bvh_shape()/refit_bvh_particle()before rendering frames that change geometry - Increase conveyor rail roughness in
example_basic_conveyorto reduce mirror-like reflections - Remove visual-only procedural terrain from
example_robot_anymal_c_walk - Migrate all raycast logic to
geometry.raycast, all raycast functions now return distance and normal information - Disable process reuse in the test runner on multi-GPU systems to prevent CUDA errors from cascading across test suites, keeping process reuse enabled on single-GPU systems for faster throughput
- Default
python -m newton.exampleswith no argument to launchbasic_pendulum; use--listto print available examples - Reduce default
stretch_stiffnessfrom1.0e9to1.0e5inadd_joint_cable(),add_rod(), andadd_rod_graph() - Treat
stretch_stiffnessandbend_stiffnessinadd_rod()andadd_rod_graph()as direct per-joint stiffness values, matchingadd_joint_cable()and other joint stiffness APIs - VBD solver uses augmented-Lagrangian hard constraints for body-body contacts by default (
rigid_contact_hard=True) - Reduce collision-pipeline overhead in
SolverMuJoCovia incremental contact conversion when the contact set is unchanged (~6× speedup onexample_robot_anymal_dwith 4096 worlds)
- Deprecate the top-level
Model.equality_constraint_*arrays andModel.equality_constraint_count, theModelBuilder.equality_constraint_*accumulators,ModelBuilder.add_equality_constraint{,_connect,_weld,_joint}(), and theModel.AttributeFrequency.EQUALITY_CONSTRAINTenum, in favor of the namespacedmodel.mujoco.equality_constraint_*fields (custom attributes on the"mujoco:equality_constraint"frequency). Migrate reads and writes tomodel.mujoco.equality_constraint_*, and construct rows viaModelBuilder.add_custom_values(**{"mujoco:equality_constraint_*": ...}). The deprecated names forward to the namespace during the deprecation window and will be removed in a future release. - Deprecate
SensorRaycastin favor ofSensorTiledCamera; migrate toSensorTiledCamera.utils.compute_camera_rays_pinhole()andcreate_depth_image_output()for single-camera depth rendering — see theSensorRaycastclass docstring for a complete migration example - Deprecate and ignore
rigid_enable_dahl_frictioninSolverVBD; Dahl friction is now auto-detected from model attributes (model.vbd.dahl_eps_max/model.vbd.dahl_tau) - Deprecate
newton-actuatorspackage dependency; all actuator functionality is now built intonewton.actuators. The dependency is kept for backward compatibility and will be removed in a future release; migrate imports fromnewton_actuatorstonewton.actuators
- Fix
remesh_convex_hullraisingQhullErroron degenerate (coincident, collinear, or coplanar) point clouds; it now returns a zero-volume fallback mesh with aUserWarning, raisesValueErroron empty input, and retries Qhull withQJjoggle as a last resort on the 3D path - Fix narrow-phase CPU launches using GPU-sized block dimensions with kernels that observe
wp.block_dim() == 1, avoiding out-of-bounds tile and strided-loop indexing until Warp GH-1413 is fixed - Fix
ViewerGLStep button remaining clickable while the simulation is running; the button is now greyed out when not paused - Fix
ViewerGLPlotswindow opening on top of thePerformance Statsoverlay by anchoring its default position to the bottom-right corner; user-dragged positions persisted inimgui.iniare unaffected - Fix the example viewer's Reset button discarding user-provided CLI options (e.g.
--world-count) and rebuilding the example with parser defaults instead - Fix
SolverMuJoCoNewton-contact conversion to use geometry-surface contact anchors - Fix
ModelBuilder.finalize()crashing with 3+ articulations aftercollapse_fixed_joints()reorderedarticulation_startand dropped per-articulation metadata - Fix Sphinx docs builds to auto-discover bundled
pypandoc_binarypandoc so notebook tutorials build without manual PATH configuration - Fix
SolverStyle3Dinitialization to precompute its fixed PD matrix from the finalized model - Fix connect constraint anchor computation to account for joint reference positions when
SolverMuJoCois the chosen solver. - Fix joint-synthesized CONNECT constraint anchors not updating when
dof_reforjoint_X_pchanges at runtime vianotify_model_changed() - Fix WELD constraint data corruption when a model contains both FIXED and revolute/ball loop joints
- Fix
SolverMuJoCopassing non-zero geom/pair margins tomujoco_warp.put_model(), which fails when NATIVECCD is enabled. Margins are forced to zero when MuJoCo handles collisions (use_mujoco_contacts=True); the Newton collision pipeline (use_mujoco_contacts=False) is unchanged - Fix
SolverMuJoCofailing to compile planar mesh colliders with MuJoCo's convex-hull path whenuse_mujoco_contacts=False; use MuJoCo contacts only with non-planar mesh colliders, primitive planes, or thick proxy geometry - Fix GPU illegal-memory-access in
SolverMuJoCoNewton-contacts fast path whennotify_model_changed(BODY_INERTIAL_PROPERTIES | JOINT_DOF_PROPERTIES | MODEL_PROPERTIES)was called between substeps (e.g. mass randomization in IsaacLab), or when the boundContactsinstance / MJWarpnaconmaxchanged without invalidating the cachedtid_to_cidmapping. The fast path is now invalidated on any property notify that affects cached MJWarp contact fields, and bounds-checkscidagainstnaconmaxdefensively - Fix
State.assignnot copying namespaced extended and custom state attributes - Fix mesh-convex back-face contacts generating inverted normals that trap shapes inside meshes and cause solver divergence (NaN)
- Fix triangle-mesh-vs-convex collisions silently dropping all contacts under non-uniform (and even large uniform) mesh scale: the BVH AABB query in
mesh_vs_convex_midphaseis now performed in unscaled mesh-local space (matching the BVH built overmesh.points), with the per-axis contact gap converted accordingly. Previously the query was performed in scaled mesh-local space, so any convex shape whose unscaled-space AABB lay outside the BVH bounds would receive 0 triangles and 0 contacts. - Fix finite plane geometry 2x too large in collision, bounding sphere, and raytrace sensor
- Fix MPR convergence failure on large and extreme-aspect-ratio mesh triangles by projecting the starting point onto the triangle nearest the convex center
- Fix MPR/GJK reporting wrong contacts for
CONVEX_MESHshapes whose authoring origin lies outside the hull, and tighten heightfield-vs-convex midphase to use the convex's local AABB instead of an origin-centered bounding sphere - Fix O(W²·S²) memory explosion in
CollisionPipelineshape-pair buffer allocation for NXN and SAP broad phase modes by computing per-world pair counts instead of a global N² - Fix non-determinism in
CollisionPipeline(contact_matching="sticky")where the matcher'satomic_minclaim tie-break used the unsorted narrow-phase thread id (whichwp.atomic_addmakes non-deterministic) instead of the contact's sort key, so two runs of the same scene could pick different winners and diverge across frames - Fix the deterministic narrow-phase sort buffer being sized to the broad-phase candidate-pair bound (
N*(N-1)/2per world for NXN/SAP) instead ofrigid_contact_max, which wasted multi-GB of VRAM on scenes with thousands of shapes - Fix
SensorRaycastignoringPLANEgeometry - Fix
nut_bolt_hydroexample threading regression where some nuts were pinned in static friction; nuts now thread reliably down the bolt under both MuJoCo and XPBD solvers (#2702) - Fix VRAM leak when resetting examples that allocate large GPU state (e.g.
diffsim_bear) - Fix
SensorRaycastand viewer picking ignoringHFIELD(heightfield) geometry - Fix
SensorTiledCameratextured albedo output rendering flat colors when color and normal outputs are disabled - Fix URDF Collada visual meshes dropping diffuse texture bindings
- Fix
contacts_rj45_plugexample crashing on reset - Fix
SolverMuJoCodependency version-mismatch warning being silently skipped when Newton is installed from a wheel - Fix
ViewerGL.log_image()windows persisting across example-browser switches and failing to re-open on re-entry after manual close, by clearing the image logger inViewerGL.clear_model() - Fix
ModelBuilder.add_shape_heightfieldscalebeing ignored by narrow-phase collision and raycast - Fix
collision_filter_parentsilently ignored on joints to world (parent=-1); now honored for alladd_joint_*methods, withadd_joint_fixed(parent=-1, ...)defaulting to filter child shapes against world-static shapes - Fix multi-world
qfrc_actuatorconversion using the wrong body center of mass for worlds withworldid > 0 - Fix
SolverMuJoCo.__init__time scaling withworld_count × actuators_per_worldinstead ofactuators_per_worldby vectorizing the template-world filter for site-targeted actuators - Fix compressed tets in
evaluate_volumetric_neo_hookean_force_and_hessianproducing an indefinite Hessian by clamping the cofactor-derivative coefficient tomax(0, s), removing a contribution that could corrupt the VBD inner solve - Fix SDF hydroelastic broadphase scatter kernel using a grid-stride loop with binary search instead of per-pair thread launch
- Fix box support-map sign flips from quaternion rotation noise (~1e-14) producing invalid GJK/MPR contacts for face-touching boxes with non-trivial base rotations
- Fix USD import of multi-DOF joints from MuJoCo-converted assets where multiple revolute joints between the same two bodies caused false cycle detection; merge them into D6 joints with correct DOF label mapping for MjcActuator target resolution
- Fix USD
MjcActuatorimport so position and velocity actuators populate Newton's joint target arrays and can be driven viaControl.joint_target_pos/Control.joint_target_vel - Fix MJCF importer creating finite planes from MuJoCo visual half-sizes instead of infinite planes
- Fix USD custom-frequency parsing to respect
ModelBuilder.add_usd(root_path=...), avoiding rows from sibling subtrees - Fix USD import of joint limit stiffness/damping from
MjcJointAPI:SchemaResolverMjcnow reads the schema-correctmjc:solreflimitattribute instead of the genericmjc:solref, which was never authored on joints - Fix MJCF importer in
compiler.angle="degree"mode: (1) stop multiplying jointdamping/stiffnessby180/π(MuJoCo stores these inN·m·s/radandN·m/radregardless ofangle); (2) stopdeg2rad-scaling the default±MAXVALsentinel for joints without an explicitrange=, which was turning unlimited hinges into bounded joints with~1.75e8 radrange - Fix MJCF importer ignoring explicit
mass=on visual geoms loaded viaparse_visuals=True; authored visual-only mass now contributes to body mass and inertia like visual-only density already does - Fix ViewerViser mesh popping artifacts caused by viser's automatic LOD simplification creating holes in complex geometry
- Fix ViewerViser notebook recording playback to load the matching browser client from the installed
viserpackage and bind the playback HTTP server to loopback only - Fix rendering of planes in ViewerViser as finite grids of line segments to prevent flickering artifacts
- Fix degenerate zero-area triangles in SDF marching-cubes isosurface extraction by clamping edge interpolation away from cube corners and guarding against near-zero cross products
- Fix multi-world coordinate conversion using the wrong body center of mass for replicated worlds
- Fix MJCF importer ignoring
<default><equality/></default>attribute defaults (e.g.solref,solimp) for<connect>/<weld>/<joint>equality constraints - Remove incorrect body-level
mjc:damping->rigid_body_linear_dampingmapping fromSchemaResolverMjc;mjc:dampingis defined onMjcJointAPI, not on bodies - Fix
target_voxel_sizebeing silently ignored on the texture-SDF path ofSDF.create_from_mesh()and on the primitive-mesh path inModelBuilder; the requested voxel resolution is now honored end-to-end and matches the sparse-SDF path - Fix material-combination inconsistency in the Newton-to-
mujoco-warpcontact converter so combined friction / solref / solimp values match native MuJoCo - Fix
eq_objtypemismatch for joint equality and mimic constraints inSolverMuJoCoso compiled models match native MuJoCo XML behavior - Fix implicit-MPM rheology solver launch-dim handling under
warp-lang1.13's templatedlaunch_bounds(formerly produced out-of-bounds reads) - Fix
SolverKamino.resetclobberingq_j_p,q_j, anddq_jfor worlds outsideworld_maskwhenjoint_q/joint_utargets were provided. The previous unmasked writes broke TWOPI revolute-joint angle unwrapping after partial-mask resets.
- Add repeatable
--warp-config KEY=VALUECLI option for overridingwarp.configattributes when running examples - Add 3D texture-based SDF, replacing NanoVDB volumes in the mesh-mesh collision pipeline for improved performance and CPU compatibility.
- Parse URDF joint
limit effort="..."values and propagate them to imported revolute and prismatic jointeffort_limitsettings - Add
--benchmark [SECONDS]flag to examples for headless FPS measurement with warmup - Interactive example browser in the GL viewer with tree-view navigation and switch/reset support
- Add
TetMeshclass and USD loading API for tetrahedral mesh geometry - Support kinematic bodies in VBD solver
- Add brick stacking example
- Add box pyramid example and ASV benchmark for dense convex-on-convex contacts
- Add plotting example showing how to access and visualize per-step simulation diagnostics
- Add
exposureproperty to GL renderer - Add
snap_toargument toViewerGL.log_gizmo()to snap gizmos to a target world transform when the user releases them - Expose
gizmo_is_usingattribute to detect whether a gizmo is actively being dragged - Add per-axis gizmo filtering via
translate/rotateparameters onlog_gizmo - Add conceptual overview and MuJoCo Warp integration primer to collision documentation
- Add configurable velocity basis for implicit MPM (
velocity_basis, default"Q1") with GIMP quadrature option (integration_scheme="gimp") - Add plastic viscosity, dilatancy, hardening and softening rate as per-particle MPM material properties (
mpm:viscosity,mpm:dilatancy,mpm:hardening_rate,mpm:softening_rate) - Add MPM beam twist, snow ball, and viscous coiling examples
- Add support for textures in
SensorTiledCameraviaConfig.enable_textures - Add
enable_ambient_lightingandenable_particlesoptions toSensorTiledCamera.Config - Add
SensorTiledCamera.utils.convert_ray_depth_to_forward_depth()to convert ray-distance depth to forward (planar) depth - Add
newton.geometry.compute_offset_mesh()for extracting offset surface meshes from any collision shape, and a viewer toggle to visualize gap + margin wireframes in the GL viewer - Add differentiable rigid contacts (experimental) with respect to body poses via
CollisionPipelinewhenrequires_grad=True - Add per-shape display colors via
ModelBuilder.shape_color,Model.shape_color, andcolor=onModelBuilder.add_shape_*; mesh shapes fall back toMesh.colorwhen available and viewers honor runtimeModel.shape_colorupdates - Add
ModelBuilder.inertia_toleranceto configure the eigenvalue positivity and triangle inequality threshold used during inertia correction infinalize() - Add
ViewerBase.set_visible_worlds()for runtime control of which worlds are rendered, replacing the staticmax_worldsparameter - Add
compute_normalsandcompute_uvsoptional arguments toMesh.create_heightfield()andMesh.create_terrain() - Pin
newton-assetsandmujoco_menageriedownloads to specific commit SHAs for reproducible builds (NEWTON_ASSETS_REF,MENAGERIE_REF) - Add
refparameter todownload_asset()to allow overriding the pinned revision - Add
total_force_frictionandforce_matrix_frictiontoSensorContactfor tangential (friction) force decomposition - Add Gaussian Splat geometry support via
ModelBuilder.add_shape_gaussian()and USD import - Add configurable Gaussian sorting modes to
SensorTiledCamera - Add automatic box, sphere, and capsule shape fitting for convex meshes during MJCF import
- Add color and texture reading to
usd.utils.get_mesh() - Export
ViewerBasefromnewton.viewerpublic API - Add
custom_attributesargument toModelBuilder.add_shape_convex_hull() - Add RJ45 plug-socket insertion example with SDF contacts, latch joint, and interactive gizmo
- Require
mujoco ~=3.6.0andmujoco-warp ~=3.6.0(previously 3.5.x) - Replace
plyfiledependency withopen3dfor mesh I/O. Users who depended onplyfiletransitively should install it separately. - Switch Python build backend from
hatchlingtouv_build - Switch mesh-SDF collision from triangle-based gradient descent to edge-based Brent's method to reduce contact jitter
- Unify heightfield and mesh collision pipeline paths; the separate
heightfield_midphase_kernelandshape_pairs_heightfieldbuffer are removed in favor of the shared mesh midphase - Replace per-shape
Model.shape_heightfield_data/Model.heightfield_elevation_datawith compactModel.shape_heightfield_index/Model.heightfield_data/Model.heightfield_elevations, matching the SDF indirection pattern. UseModel.heightfield_dataindexed viaModel.shape_heightfield_indexinstead. - Standardize
rigid_contact_normalto point from shape 0 toward shape 1 (A-to-B), matching the documented convention. Consumers that previously negated the normal on read (XPBD, VBD, MuJoCo, Kamino) no longer need to. - Replace
Model.sdf_data/sdf_volume/sdf_coarse_volumewith texture-based equivalents (texture_sdf_data,texture_sdf_coarse_textures,texture_sdf_subgrid_textures). UseModel.texture_sdf_data,texture_sdf_coarse_textures, andtexture_sdf_subgrid_texturesinstead. - Render inertia boxes as wireframe lines instead of solid boxes in the GL viewer to avoid occluding objects
- Make contact reduction normal binning configurable (polyhedron, scan directions, voxel budget) via constants in
contact_reduction.py - Upgrade GL viewer lighting from Blinn-Phong to Cook-Torrance PBR with GGX distribution, Schlick-GGX geometry, Fresnel-weighted ambient, and ACES filmic tone mapping
- Change implicit MPM residual computation to consider both infinity and l2 norm
- Change implicit MPM hardening law from exponential to hyperbolic sine (
sinh(-h * log(Jp))), no longer scales elastic modulus - Change implicit MPM collider velocity mode names:
"forward"/"backward"replace"instantaneous"/"finite_difference". Old names are no longer accepted. - Simplify
SensorContactforce output: addtotal_force(aggregate per sensing object) andforce_matrix(per-counterpart breakdown,Nonewhen no counterparts) - Add
sensing_obj_idx(list[int]),counterpart_indices(list[list[int]]),sensing_obj_type, andcounterpart_typeattributes. Renameinclude_totaltomeasure_total - Replace verbose Apache 2.0 boilerplate with two-line SPDX-only license headers across all source and documentation files
- Improve wrench preservation in hydroelastic contacts with contact reduction.
- Show Newton deprecation warnings during example runs started via
python -m newton.examples ...orpython -m newton.examples.<category>.<module>; pass-W ignore::DeprecationWarningif you need the previous quiet behavior. - Reorder
ModelBuilder.add_shape_gaussian()parameters soxformprecedesgaussian, in line with otheradd_shape_*methods. Callers using positional arguments should switch to keyword form (gaussian=..., xform=...); passing aGaussianas the second positional argument still works but emits aDeprecationWarning - Rename
ModelBuilder.add_shape_ellipsoid()parametersa,b,ctorx,ry,rz. Old names are still accepted as keyword arguments but emit aDeprecationWarning - Rename
collide_plane_cylinder()parametercylinder_centertocylinder_posfor consistency with other collide functions. The old name is no longer accepted. - Add optional
stateparameter toSolverBase.update_contacts()to align the base-class signature with Kamino and MuJoCo solvers - Use
Literaltypes forSolverImplicitMPM.Configstring fields with fixed option sets (solver,warmstart_mode,collider_velocity_mode,grid_type,transfer_scheme,integration_scheme) - Migrate
wp.array(dtype=X)type annotations towp.array[X]bracket syntax (Warp 1.12+). - Align articulated
State.body_qd/ FK / IK / Jacobian / mass-matrix linear velocity with COM-referenced motion. If you were comparingbody_qd[:3]against finite-differenced body-origin motion, recover origin velocity viav_origin = v_com - omega x r_com_world. DescendantFREE/DISTANCEjoint_qdremains parent-frame andjoint_fremains a world-frame COM wrench.
- Deprecate
ModelBuilder.default_body_armature, thearmatureargument onModelBuilder.add_link()/ModelBuilder.add_body(), and USD-authored body armature vianewton:armaturein favor of adding any isotropic artificial inertia directly toinertia - Deprecate
SensorContact.net_forcein favor ofSensorContact.total_forceandSensorContact.force_matrix - Deprecate
SensorContact(include_total=...)in favor ofSensorContact(measure_total=...) - Deprecate
SensorContact.sensing_objsin favor ofSensorContact.sensing_obj_idx - Deprecate
SensorContact.counterpartsandSensorContact.reading_indicesin favor ofSensorContact.counterpart_indices - Deprecate
SensorContact.shape(usetotal_force.shapeandforce_matrix.shapeinstead) - Deprecate
SensorTiledCamera.render_context; preferSensorTiledCamera.utilsandSensorTiledCamera.render_config. - Deprecate
SensorTiledCamera.RenderContext; useSensorTiledCamera.RenderConfigfor config types andSensorTiledCamera.render_config/SensorTiledCamera.utilsfor runtime access. - Deprecate
SensorTiledCamera.Config; preferSensorTiledCamera.RenderConfigandSensorTiledCamera.utils. - Deprecate
max_worldsparameter ofViewerBase.set_model()in favor ofViewerBase.set_visible_worlds() - Deprecate
Viewer.update_shape_colors()in favor of writing directly toModel.shape_color - Deprecate
ModelBuilder.add_shape_ellipsoid()parametersa,b,cin favor ofrx,ry,rz - Deprecate passing a
Gaussianas the second positional argument toModelBuilder.add_shape_gaussian(); use thegaussian=keyword argument instead - Deprecate
SensorTiledCamera.utils.assign_random_colors_per_world()andassign_random_colors_per_shape()in favor of per-shape colors viaModelBuilder.add_shape_*(color=...)
- Remove
Heightfield.finalize()and stop storing raw pointers for heightfields inModel.shape_source_ptr; heightfield collision data is accessed viaModel.shape_heightfield_index/Model.heightfield_data/Model.heightfield_elevations - Remove
robot_humanoidexample in favor ofbasic_plottingwhich uses the same humanoid model with diagnostics visualization
- Fix GL viewer crash when enabling "Gap + Margin" for soft-body-only states with no rigid body transforms
- Fix inertia validation spuriously inflating small but physically valid eigenvalues for lightweight components (< ~50 g) by using a relative threshold instead of an absolute 1e-6 cutoff
- Restore keyboard camera movement while hovering gizmos so keyboard controls remain active when the pointer is over gizmos
- Resolve USD asset references recursively in
resolve_usd_from_urlso nested stages are fully downloaded - Unify CPU and GPU inertia validation to produce identical results for zero-mass bodies with
bound_mass, singular inertia, non-symmetric tensors, and triangle-inequality boundary cases - Fix
UnboundLocalErrorcrash in detailed inertia validation when eigenvalue decomposition encounters NaN/Inf input - Handle NaN/Inf mass and inertia deterministically in both validation paths (zero out mass and inertia)
- Update
ModelBuilderinternal state after fast-path (GPU kernel) inertia validation so it matches the returnedModel - Fix MJCF mesh scale resolution to use the mesh asset's own class rather than the geom's default class, avoiding incorrect vertex scaling for models like Robotiq 2F-85 V4
- Fix articulated bodies drifting laterally on the ground in XPBD solver by solving rigid contacts before joints
- Fix
hide_collision_shapes=Truenot hiding collision meshes that have bound PBR materials - Filter inactive particles in viewer so only particles with
ParticleFlags.ACTIVEare rendered - Fix concurrent asset download races on Windows by using content-addressed cache directories
- Fix body
gravcompnot being written to the MuJoCo spec, causing it to be absent from XML saved viasave_to_mjcf - Fix
compute_world_offsetsgrid ordering to match terrain grid row-major order so replicated world indices align with terrain block indices - Fix
eq_solimpnot being written to the MuJoCo spec for equality constraints, causing it to be absent from XML saved viasave_to_mjcf - Fix WELD equality constraint quaternion written in xyzw format instead of MuJoCo's wxyz format in the spec, causing incorrect orientation in XML saved via
save_to_mjcf - Fix
update_contactsnot populatingrigid_contact_point0/rigid_contact_point1when usinguse_mujoco_contacts=True - Fix MPR anti-flicker inflate biasing contact distances and witness points for convex-convex pairs, causing phantom overlap in stacking scenarios
- Fix VSync toggle having no effect in
ViewerGLon Windows 8+ due to a pyglet bug whereDwmFlush()is never called when_always_dwmis True - Fix loop joint coordinate mapping in the MuJoCo solver so joints after a loop joint read/write at correct qpos/qvel offsets
- Fix viewer crash when contact buffer overflows by clamping contact count to buffer size
- Decompose loop joint constraints by DOF type (WELD for fixed, CONNECT-pair for revolute, single CONNECT for ball) instead of always emitting 2x CONNECT
- Fix inertia box wireframe rotation for isotropic and axisymmetric bodies in viewer
- Implicit MPM solver now uses
mass=0for kinematic particles instead ofACTIVEflag - Suppress macOS OpenGL warning about unloadable textures by binding a 1x1 white fallback texture when no albedo or environment texture is set
- Fix MuJoCo solver freeze when immovable bodies (kinematic, static, or fixed-root) generate contacts with degenerate invweight
- Fix forward-kinematics child-origin linear velocity for articulated translated joints
- Fix
ModelBuilder.approximate_meshes()to handle the duplication of per-shape custom attributes that results from convex decomposition - Fix
get_tetmesh()winding order for left-handed USD meshes - Fix contact force conversion in
SolverMuJoCoto include friction (tangential) components - Fix URDF inertial parameters parsing in parse_urdf so inertia tensor is correctly calculated as R@I@R.T
- Fix Poisson surface reconstruction segfault under parallel test execution by defaulting to single-threaded Open3D Poisson (
n_threads=1) - Fix overly conservative broadphase AABB for mesh shapes by using the pre-computed local AABB with a rotated-box transform instead of a bounding-sphere fallback, eliminating false contacts between distant meshes
- Fix heightfield bounding-sphere radius underestimating Z extent for asymmetric height ranges (e.g.
min_z=0, max_z=10) - Fix VBD self-contact barrier C2 discontinuity at
d = taucaused by a factor-of-two error in the log-barrier coefficient - Fix fast inertia validation treating near-symmetric tensors within
np.allclose()default tolerances as corrections, aligning CPU and GPU validation warnings - Fix URDF joint dynamics friction import so specified friction values are preserved during simulation
- Fix
requires_gradnot being preserved inArticulationViewattribute getters, breaking gradient propagation through selection queries - Fix duplicate Reset button in brick stacking example when using the example browser
- Cap
cbor2dependency to<6to prevent recorder test failures caused by breaking deserialization changes in cbor2 6.0 - Clamp viewer picking force to prevent explosion when picking light objects near stiff contacts, configurable via
pick_max_accelerationparameter on thePickingclass (default 5g of effective articulation mass) - Fix
cloth_frankaexample Jacobian broken by COM-referencedbody_qdconvention change; adjust robot base height, gripper orientations, and grasp targets for improved reachability (a follow-up PR will migrate the example tonewton.ik)
Initial public release.