Home▸Build & Play▸3D Domino Toppling Physics

🎲 3D Domino Toppling Physics

3D domino cascade — a winding chain of dominoes standing in real WebGL space, each tipping and colliding with the next using the exact same rotation/torque formula as the 2D original. Drag to orbit, scroll to zoom.

Build & Play3DModerate60 FPS⇄ 2D version
3d-domino-physics ↗ Open standalone

The Same Toppling Torque, Standing in Real 3D Space

This companion simulation renders the 2D domino row as a genuine winding chain in WebGL: each domino is a rigid box hinged at its base edge, standing along a path that curves through X/Z and rolls gently in elevation — a real 3D layout, not a flat row viewed from an angle.

The tipping physics is an exact port of the 2D model: each domino's rotation angle grows from 0 to 90° as angularVelocity += fallSpeed accumulates every frame, and a domino strikes the next one once its computed tip position — base + up·H·cos(angle) + tangent·H·sin(angle), the direct 3D analogue of the original's x + sin(angle)·H, y − cos(angle)·H — advances far enough along the path to close the gap, at which point 80% of the striking domino's angular velocity transfers to the next, exactly as in the 2D engine. Drag to orbit the camera around the cascade; scroll to zoom.

Same math, new vantage point

Domino count, spacing and fall speed carry over unchanged from the 2D controls; a fourth slider, path curve, is the genuinely 3D addition — it controls how sharply the chain winds through space, something a flat 2D row has no equivalent of. The live readout tracks fallen count, dominoes currently mid-fall, and the chain's propagation speed in units per second.

⚙ Under the hood

A winding chain of dominoes standing in real WebGL space, each tipping and colliding with the next using the exact same rotation/torque formula as the 2D original. Drag to orbit, scroll to zoom.

DominoChain ReactionRigid Body3D

3D · Three.js / WebGL renderer · 60 FPS target · runs fully client-side, no install

What did you find?

Add reproduction steps (optional)