What is actually simulated, what is approximated, where the numbers come from, and how the whole thing was checked against theory.
Every piece — each found object and each arm — is a rigid body with a full
inertia tensor derived from its real shape and mass. Cords are inextensible
one-way distance constraints solved with substepped XPBD at 960 Hz: they pull
and never push. That detail matters more than it sounds. Because the loads hang from
strings rather than being bolted on, an unbalanced arm cannot find a new equilibrium
by tilting — every load's moment arm shrinks by the same cos θ —
so with the pivot exactly on the axis it swings all the way down.
Raise the hanging loop and that changes completely: the imbalance and the righting
torque now trade off, and the arm settles at θ = atan(ΔM / g·rise·M). A
2 N·mm imbalance on a 4 mm loop carrying 240 g rests about 12° off level
and stays there. The readout predicts that angle for every arm, which is far more useful
than a pass/fail: a deliberate small imbalance is how you get a mobile whose arms are not
all boringly parallel.
Each cord carries a torsional spring and damper about its own axis, with stiffness
k = GJ / L. Waxed floss tape has a torsional rigidity around
0.008 N·mm², so on a 150 mm cord k ≈ 5×10⁻⁸ N·m/rad — a free-turn
period of roughly forty minutes. There is effectively no restoring torque at all: a
mobile on floss turns freely and is stopped only by air drag. Swap in music wire and
k climbs eleven orders of magnitude into a genuine 0.2 s torsional
spring. Twist accumulates, so cords wind up over time, and past about three turns a
hockling term stiffens them sharply the way a real cord starts to coil.
Floss figures are estimates for multifilament tape, whose filaments slip against each
other in torsion; the effective rigidity is roughly a tenth of the solid-section value.
Every cord's GJ is listed so you can dial it to something you have measured.
Drag is integrated over the body, not applied as a single lumped coefficient. Spheres use the Clift–Gauvin curve across the whole Reynolds range. Flat parts are broken into panels with separate normal-pressure and skin-friction coefficients. Rods are sampled at stations along their length using cylinder cross-flow. Rotational damping is therefore emergent — it falls out of sampling the body at several points rather than being a tuning term someone chose.
Room air is synthetic von Kármán turbulence: twelve divergence-free Fourier modes with inertial-range amplitude and eddy-turnover scaling, advected past the mobile by the mean flow under Taylor's frozen-turbulence hypothesis. Buoyancy and added mass are both included, which is why a ping-pong ball behaves so differently from a marble of the same size.
Each arm is a real Euler–Bernoulli beam. The two overhangs are treated as cantilevers measured from the pivot, each carrying a tip load equal to everything hanging below it plus its own distributed weight:
δ = P·L³/3EI + w·L⁴/8EI
The deflected shape is solved quasi-statically and baked into the arm's geometry, so the drooped tips are where the children actually hang and where the drag stations actually sit. Peak bending stress is checked at the pivot against the stock's allowable, so a drinking straw asked to carry a cue ball is flagged rather than silently drawn straight. This is why the mobile does not start out flat and parallel: soft stock visibly sags.
The pivot solver places each arm's hang point so the moments cancel exactly, including the rod's own weight. But a balanced arm pivoted precisely on its own axis is only neutrally stable: its potential energy is flat at every tilt angle, so it drifts to any angle at all and the mobile looks broken.
Real mobile arms hang from a small loop bent a few millimetres above the wire.
That offset is the entire source of righting stiffness, k = g · rise · M.
It is exposed as the per-arm Loop rise control. Set it to zero and watch the
mobile go limp — that is not a bug, it is the reason the loop gets bent upward on
every mobile ever built.
| Check | Closed form | Simulated | Error |
|---|---|---|---|
| Compound pendulum, golf ball on 300 mm | 1.1384 s | 1.1337 s | 0.4% |
| Torsional pendulum, CD on 200 mm music wire | 0.1837 s | 0.1838 s | 0.05% |
| Ping-pong ball terminal velocity | 8.636 m/s | 8.636 m/s | <0.01% |
| Golf ball terminal velocity | 32.564 m/s | 32.564 m/s | <0.01% |
| Marble terminal velocity | 29.761 m/s | 29.761 m/s | <0.01% |
| Beam tip droop, 7 stocks straw → carbon | δ=PL³/3EI+wL⁴/8EI | exact | <0.01% |
| Rest angle of an unbalanced arm, 7 configs | atan(ΔM/g·rise·M) | matches | ≤0.11° |
| Cord tension vs the weight hanging below it | Σmg | matches | ≤0.14% |
| Peak cord tension, pendulum released 15°–90° | mg[1+2(md²/Ip)(1−cos α)] | matches | ≤1.2% |
| Energy drift, 90 s of still air | 0 | 0.025% | — |
The rest-angle check is the one that earned its keep: it failed at 5–20° until it turned up a real bug — children were still hanging from the arm's undeflected axis while the beam droop was only being drawn. Once the attach points followed the deflected beam, formula and simulation agreed everywhere.
The two terminal velocities are worth a sanity check of their own: 32.6 m/s for a golf ball and 8.6 m/s for a ping-pong ball are both the published real-world figures.
Cords are checked in tension and arms in bending, both against the worst load the
simulation has actually seen rather than the static weight alone. Cord tension is read
straight out of the constraint solver as λ/h², which matches the weight
hanging below each cord to better than 0.15% and matches the classical release-from-angle
formula to about 1%. Every line is derated by a knot efficiency, because that is where
cords actually part — slippery lines like Dyneema and monofilament keep about half
their rated strength through a knot, floss and thread around 60%, a twisted wire joint
about a third.
What it does not cover: knot slippage over time, abrasion where a cord passes over a wire loop (the usual way a mobile fails after a year on the wall), fatigue, creep in natural fibres, and the ceiling fixing. Natural beam stock varies enormously piece to piece, so treat willow and reed safety factors as an order of magnitude, not a number.
Object masses and dimensions are typical measured values for the real article — a regulation cue ball is 170 g at 57.2 mm, a US penny 2.50 g at 19.05 mm, a ping-pong ball 2.7 g at 40 mm. They are starting points, not gospel: every mass, size, colour and finish is editable, and you should weigh your own. Beam stock carries a Young's modulus and an allowable bending stress typical of the material; natural stock like willow and reed varies enormously piece to piece, so treat those as the right order of magnitude rather than a specification.
Air is modelled at 20 °C and sea level: ρ = 1.204 kg/m³, μ = 1.825×10⁻⁵ Pa·s.