Repository navigation
Release v0.7.0 - #47
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v0.7.0 (11 October 2026)
The Python package
dimforge-nexus3dis released as 0.3.0 alongside the crates.Breaking changes
RbdSimParamsgainsnormalized_contact_recycle_distanceand, in 3D,friction_model; its_padding*fields are gone (2D keeps_padding0). Struct literals need..Default::default().RbdState::rigid_contact_constraintsreturns&ContactConstraints(contact links, constraintindices and the friction model's tiles) instead of
&Tensor<TwoBodyConstraint>. Read contactimpulses with the new
RbdState::read_rigid_contact_impulses.GpuMultibodySet::links_staticreturns&Tensor<UVec4>: static link records are interleavedacross environments per 16-byte quad, quad
qof linklof enveat(l * LS_QUADS + q) * num_batches + e. Decode it withls_soa_to_structs. Thelinks_workspacebuffer keeps its type but uses the same per-quad interleaving(
ws_soa_to_structsstill decodes it).RbdPipeline::fused_color_sweepsandRbdGraphKey::fused_color_sweepstofused_color_dispatches, andmb_sweep_indirecttomb_dispatch_indirect.WarmstartArgs,GpuWarmstart::transfer_warmstart_impulsesandGpuColoring::dispatch_topo_gc.SolverArgs,ColoringArgsandColorBucketsArgschanged.entry-pointsfeature (on bydefault): crates depending on them with
default-features = falsemust enable it to get thekernels.
TwoBodyConstrainthas a compact layout (its builder, infos, element andnormal/tangent part types are removed), the multibody Delassus kernels and
MAX_MB_CONTACTS_PER_MB/MAX_MB_CONTACT_CONSTRAINTS_PER_MBare removed,MultibodyLinkStatic::_pad0is nowancestor_dofs(3D),IndexedManifold's padding isrecycle_extent,LbvhNodehas a new layout, and many kernel signatures changed.DemoKindgainsStress,SimSettingsgainsrbd_substepsand (3D)rbd_friction_model, andUiStategainswait_for_render. Sensor rendering(
render_sensor_rgb/depth/segmentation) is not available on wasm32.Added
FrictionModel::Simplifiedsolves one slidingfriction constraint at the manifold center plus one twist constraint, instead of friction at
every point (
FrictionModel::Coulomb, the default). Multibody contacts always use Coulomb. Setwith
RbdSimParams::friction_model,NexusState::set_rbd_friction_modelorRbdState::set_friction_model; switching keeps the bodies but resets the contact warmstarts.RbdSimParams::normalized_contact_recycle_distance(timeslength_unit) since its contactswere computed keeps them instead of running the narrow phase again. Also
RbdSimParams::contact_recycle_distanceandRbdState::set_contact_recycle_distance.NexusState::set_rbd_substeps/rbd_substepsandRbdState::set_timestepchange the substepcount of a running simulation without resetting it.
RbdState::read_rigid_contact_impulsesreturns the last step's contact impulses asContactImpulseSnapshots.NEXUS_NO_FUSED_SUBSTEPSdisables the fused multibody substep kernel (see below).LinkStatics,LinkStaticRef,ls_soa_from_structs,ls_soa_to_structs,LS_QUADSandLS_WORDS.checkbox, and
NexusViewer::with_wait_for_render,with_rbd_friction_model(3D) andwith_snapshot(saves a frame and quits, native only).--headlessand--snapshot <frame> <path>flags, and a "Rigid-bodies - stress tests"group. 3D: brick rings (28k, 110k), brick walls (27k), pyramids (500k), ragdolls on cloth (24k),
box piles (4k, 32k), jointed drop (34k), box columns (100k). 2D: pyramids (1.3k, 5k, 20k), box
rain (1k, 5k, 90k), joint lattices (4k, 100k, 262k), wrecking balls (4k, 40k).
compiled and run by CI.
set_rbd_solver_params(friction_model="coulomb" | "simplified")(an unknown name raisesValueError), a"friction_model"key inrbd_solver_params(), and atwist_impulsekey indebug_rigid_contact_impulses().NexusViewer.set_deterministic/deterministic(applied to thestate by
sync), andNexusState.set_deterministic(viewer, enabled),deterministicandstepsfor states stepped without a viewer sync.NexusViewer.with_backend(name)selects"webgpu"(the default),"cpu","metal"or"cuda", raisingValueErrorfor a backend the wheel was built without;NexusViewer.backend_name()andnexus3d.available_backends()report the selection and whatthe wheel supports.
metalfeature (nativeMetal, alongside WebGPU), and Linux aarch64 wheels are published.
Fixed
never converged and the color budget kept growing.
armature, stiffness, kinematic DOFs and implicit Coriolis terms were ignored on all DOFs but
the first.
storage binding size limit. The pair capacity is now capped by that limit.
multibody DoF state, static link data and (once joint friction is set) multibody info buffers
lacked
COPY_SRC, soNexusState::multibody_joint_velocities(Python:robot_qvel),RbdState::snapshotandGpuMultibodySet::debug_cons_layoutfailed. Native Metal ignoresbuffer usages, which hid the bug.
RbdState::rigid_contact_constraintsand Python'sdebug_rigid_contact_impulsesreturned thecontacts of the step before last.
reserve_rigid_bodiesignored the scene's timestep and substep count.nexus_viewer3ddid not build for wasm32.Modified
0.05timeslength_unit;0disables it), so resultsdiffer from v0.6. Trimesh and polyline sub-shape contacts and multibody contacts are never
recycled. It stays active in deterministic mode, which remains reproducible.
contact, solved independently then averaged. Heavy bodies resting on many others converge
differently and no longer inflate the number of solver colors. Multibody links are not split.
Grow, now also shrink the solver color budgetonce the coloring converges, and large dense scenes (4096 colliders or more) start with 32
colors (64 from 65536 colliders). Deterministic mode keeps a fixed budget.
such multibody per environment, explicit Coriolis terms, no substep refresh, at most 32 links
and no rigid-body contacts or impulse joints, the whole substep loop runs in a single dispatch.
Results can differ from the other backends by floating-point rounding.
NexusViewer::syncalso applies the viewer's substep count and (3D) friction model to thestate after the scene's first sync.
NexusState::add_environmentcopies environment 0'sfriction model.
stepping so the GPU timings exclude it.
constraints are compact, color-ordered tiles solved by specialized kernels, the coloring sizes
its dispatches from the previous step, and multibody batches use per-quad interleaved layouts,
right-sized workgroups and fused kernels, which mostly speeds up many environments with one
robot each.
memory and shrinks the binaries.