Choosing solvers
DART solves two related problems each step: how to integrate body motion and how to resolve contact. DART 7 lets you choose the method for each so you can trade accuracy against speed for your scene. You select methods by capability, not by naming an internal backend.
Setting solver methods
Choose methods when you create the world:
import dartpy as dart
world = dart.World(
time_step=1.0 / 1000.0,
rigid_body_solver=dart.RigidBodySolver.SEQUENTIAL_IMPULSE,
contact_solver_method=dart.ContactSolverMethod.SEQUENTIAL_IMPULSE,
)
The same choices are available as world properties, so you can switch between runs:
world.rigid_body_solver = dart.RigidBodySolver.SEQUENTIAL_IMPULSE
world.contact_solver_method = dart.ContactSolverMethod.BOXED_LCP
Contact solver methods
Two contact methods are useful to know:
Sequential impulse (
ContactSolverMethod.SEQUENTIAL_IMPULSE) iterates over contacts applying impulses. It is fast and robust for real-time, contact-rich scenes — a good default.Boxed LCP (
ContactSolverMethod.BOXED_LCP) formulates contact as a linear complementarity problem. It is the more traditional DART formulation and a useful reference when comparing results.
If you are unsure, start with sequential impulse and switch to boxed LCP when you want to cross-check behavior.
Thinking in capabilities
DART describes solvers by what they do rather than by an engine name. When you reach for more advanced behavior, you are really choosing along axes like these:
Capability |
Example choices |
|---|---|
Integration family |
semi-implicit Euler, implicit Euler, variational |
Constraint solve |
projected Gauss-Seidel / sequential impulse, direct LCP |
Coordinates |
generalized (articulated), maximal (free rigid bodies) |
Supported features |
contacts, joints, friction, closed chains |
This vocabulary is stable even as implementations improve underneath, which means the method you request keeps working while DART gets faster.
A developing area
The exact set of solver and contact methods is still expanding in DART 7. The
rigid_solver_compare and rigid_contact_solver_compare demos
are the best way to see the differences between methods side by side. Treat the
enum values above as the current, stable starting set rather than the final list.
See the differences
Run the comparison demos from a source checkout to watch methods diverge on the same scene:
pixi run py-demos -- --scene rigid_solver_compare
pixi run py-demos -- --scene rigid_contact_solver_compare
Next
To watch any of this happen, open the viewer.