Hyoungseo Son

Part 0 · Orientation

The Physics Engine Landscape

12 min read

Before any of the math, it helps to see the whole board. This series is about how physics engines work on the inside, so this first piece maps the engines people actually use, and pins down two things: the skeleton they all share, and the small number of choices that make them different.

Everything here is cited. Wherever I make a claim about an engine, there is a link to that engine's own documentation or the original paper, collected under Sources. I got a few of these wrong from memory the first time; the corrected versions are called out in A few claims, corrected.

What every engine does

Strip away the branding and every rigid-body engine runs the same loop each step:

  1. Collision detection. Find which bodies are touching, and where.
  2. Constraint solve. Compute the forces or impulses that stop interpenetration and honor joints and friction.
  3. Integration. Advance positions and velocities forward in time.

The differences live almost entirely in how steps 2 and 3 are posed. The rest of this series walks that loop from the bottom up. The table below is the "you are here."

The map

EngineCoordinatesContact modelSolverGPU / parallelDifferentiableSweet spot
MuJoCogeneralized (minimal)soft, convex (drops LCP complementarity); friction cone elliptic or pyramidalNewton (default), CG, PGSyes, via MJX (JAX, GPU/TPU batches)finite-diff native; autodiff via MJXmodel-based control, robotics, RL
PhysX 5 / Isaacreduced-coordinate articulations (Featherstone) plus per-body rigidrigid (optional compliant since 5.1); Coulomb patch frictionTGS (recommended), PGSyes, large-scale GPU RL (Isaac Gym / Lab)no native autodiff (Warp is the differentiable stack)GPU-scale robot learning
Drakegeneralized (minimal)hydroelastic (pressure-field) plus SAP convexSAP (Semi-Analytic Primal), convexCPU-focused; batch/GPU is a proposalyes (AutoDiffXd)model-based control and planning
Bullet / PyBulletboth: reduced (btMultiBody) and maximalrigid, iterative velocity-level LCPsequential impulse (PGS); MLCPPyBullet is CPU-onlynot native (Tiny Differentiable Simulator is separate)general robotics, RL, games
Braxmultiple backends: generalized, positional (PBD), spring, MJXper backendper backendyes, JAX on GPU/TPUyes, fully differentiablelarge-scale RL on accelerators
NVIDIA Warpmaximal, plus generalized via a Featherstone (CRBA) moduleXPBD; semi-implicit EulerXPBDyes, JIT-compiled to CUDAyes, autodiff kernelsGPU differentiable sim, kernel programming
Newtonvia MuJoCo Warp (generalized)via MuJoCo WarpMuJoCo Warp backendyes (built on Warp)yesrobotics; announced March 2025
RaiSimgeneralized (minimal)rigid; friction-cone projectionper-contact bisectionCPUnolegged locomotion
Genesisgeneralized (kinematic tree)soft quadratic penalty (MuJoCo-style)CG and Newtonyes, GPU (very fast)partial (MPM and Tool solvers only)universal, multi-physics

Two foundations sit underneath several of these rows. Featherstone's articulated-body algorithm is the O(n) forward-dynamics method that makes minimal coordinates practical, and XPBD is the compliant, step-independent form of position-based dynamics. Both get their own chapters later.

Two axes that explain the differences

Read across the table and the divergence collapses onto two axes.

Theoretical axis: how contact is modeled

  • Hard complementarity (LCP). Non-penetration and friction as a linear complementarity problem. Bullet's iterative velocity solver lives here.
  • Convex relaxation. Reformulate contact as a convex optimization, trading a little physical exactness for smoothness and reliable convergence. MuJoCo drops the LCP complementarity constraint outright, and Drake's SAP solver eliminates the constraints analytically into an unconstrained convex problem.
  • Positional (XPBD). Skip forces entirely: project positions to satisfy compliant constraints, stable regardless of stiffness or step size.

Technical axis: coordinates, parallelism, differentiability

  • Coordinates. Minimal / generalized (MuJoCo, Drake, RaiSim) versus maximal per-body (PhysX, Bullet) with reduced-coordinate articulations bolted on. This is exactly the maximal-vs-minimal choice Part 1 builds an interactive around.
  • Parallelism. Single-scene CPU (Drake, RaiSim, PyBullet) versus massively batched GPU/TPU (MJX, Isaac Gym/Lab, Brax, Warp).
  • Differentiability. Whether you can get gradients through a whole step (Brax, Warp, Drake's AutoDiff), the subject of Part 9.

Your three starting topics are not a random walk across this table. Maximal vs minimal coordinates sits on the technical axis; the cone-based contact optimization sits on the theoretical axis; XPBD is the third branch of that same theoretical axis. They are one traversal of these two axes, which is why the curriculum is ordered the way it is.

Concretely, a minimal-coordinate engine spends its life assembling and solving

M(q)q¨+C(q,q˙)q˙+g(q)=τ+Jcλ,M(q)\,\ddot q + C(q, \dot q)\,\dot q + g(q) = \tau + J_c^{\top} \lambda,

where the mass matrix M(q)M(q) and the bias term C(q,q˙)q˙C(q,\dot q)\dot q come from the left side (Part 2 derives them), and the contact forces λ\lambda are exactly what a constraint solver on the theoretical axis produces (Parts 5 to 7).

A few claims, corrected

Building this table caught a few things that "everyone knows" but the primary sources do not actually say:

  • PhysX is not an "LCP" engine, at least not in its own words. The docs describe an iterative (P/T)GS solver with rigid non-penetration and an optional compliant model, and call friction "Coulomb patch friction." They do not use "LCP" or "pyramidal cone," so I do not either.
  • TGS is PhysX's recommended solver, not yet its SDK default. The docs say it "will become the default soon" while PGS stays available. Isaac configs often select TGS downstream.
  • Genesis is not fully differentiable today. It is designed to be, but currently only the MPM and Tool solvers expose gradients; the rigid solver does not yet.
  • Newton's MuJoCo backend is "MuJoCo Warp" (the informal "MJWarp" is not the project name), announced at GTC on March 18, 2025 by NVIDIA, Google DeepMind, and Disney Research.

Sources

Every link below was fetched and checked against the specific claim it backs.

Next in Part 1: rotations and SO(3), then the maximal-vs-minimal coordinate choice with a four-bar linkage you can drag.