DART 7 · in development You are reading the documentation for DART 7, an in-progress redesign that is not yet recommended for production use. Looking for the current stable release? See the DART 6 LTS documentation.

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.