Implementing Mathavan Cushion Physics

April 2026 · 5 min read

Billiards is often simplified in games as a series of linear reflections, but the reality of ball-cushion interaction is far more complex. The rebound angle and velocity of a ball hitting a cushion are influenced by its incoming spin, velocity, and the physical properties of the cushion itself.

To capture this accurately, this simulation implements a numerical model based on the work of Mathavan et al. (2010), "A theoretical analysis of the dynamics of a billiards ball colliding with a cushion". This approach models the interaction by breaking down the collision into compression and restitution phases, accounting for slip velocities at both the cushion and table contact points.

Forces on ball at cushion
Forces on ball at cushion. (Source: Mathavan et al. (2010))

The Mathavan Model

The core of the implementation involves calculating the slip velocity at the cushion contact point (I) and the table contact point (C).

Slip velocity at cushion contact point I:

\[ \dot{x}_I = \dot{v}_x + \dot{\omega}_y R \sin \theta - \dot{\omega}_z R \cos \theta \qquad \dot{y}'_I = -\dot{v}_y \sin \theta + \dot{\omega}_x R \] \[ \phi = \arctan\left(\frac{\dot{y}'_I}{\dot{x}_I}\right) \qquad s = \sqrt{(\dot{x}_I)^2 + (\dot{y}'_I)^2} \]

Slip velocity at table contact point C:

\[ \dot{x}_C = \dot{v}_x - \dot{\omega}_y R \qquad \dot{y}_C = \dot{v}_y + \dot{\omega}_x R \] \[ \phi' = \arctan\left(\frac{\dot{y}_C}{\dot{x}_C}\right) \qquad s' = \sqrt{(\dot{x}_C)^2 + (\dot{y}_C)^2} \]

Numerical Solutions

The simulation uses numerical solutions for the centroid velocity of the ball during the interaction.

\[ (\dot{v}_x)_{n+1} - (\dot{v}_x)_n = - \frac{1}{M} \left[\mu_w \cos(\phi) + \mu_s \cos(\phi') \cdot (\sin \theta + \mu_w \sin(\phi) \cos \theta)\right] \Delta P_I \] \[ (\dot{v}_y)_{n+1} - (\dot{v}_y)_n = - \frac{1}{M} \left[ \cos \theta - \mu_w \sin \theta \sin \phi + \mu_s \sin \phi' \cdot \left( \sin \theta + \mu_w \sin \phi \cos \theta \right) \right] \Delta P_I \]

And for the angular velocity:

\[ (\dot{\omega}_x)_{n+1} - (\dot{\omega}_x)_n = -\frac{5}{2MR}[\mu_w \sin(\phi) + \mu_s \sin(\phi') \times (\sin(\theta) + \mu_w \sin(\phi)\cos(\theta))]\Delta P_I \] \[ (\dot{\omega}_y)_{n+1} - (\dot{\omega}_y)_n = -\frac{5}{2MR}[\mu_w \cos(\phi)\sin(\theta) - \mu_s \cos(\phi') \times (\sin(\theta) + \mu_w \sin(\phi)\cos(\theta))]\Delta P_I \] \[ (\dot{\omega}_z)_{n+1} - (\dot{\omega}_z)_n = \frac{5}{2MR}(\mu_w \cos(\phi)\cos(\theta))\Delta P_I \]

Where \(\theta\) is a constant of the angle of cushion contact above ball centre with \(\sin(\theta) = 2/5\). \(\mu_s\) is the coefficient of sliding friction between the ball and table surface, and \(\mu_w\) is the coefficient of sliding friction between the ball and the cushion.

Energy and Restitution

The interaction is governed by the work done by the normal force at contact point I along the \(Z'\)-axis:

\[ W_{Z'}^I(P_I^{(n+1)}) = W_{Z'}^I(P_I^{(n)}) + \frac{\Delta P_I}{2} \left( \dot{z}'_I(P_I^{(n+1)}) + \dot{z}'_I(P_I^{(n)}) \right) \]

The compression phase iterates until \(\dot{v}_y \le 0\), and the restitution phase continues until the work done satisfies \(W_{Z'}^I \ge e_e^2 W_{\text{compression}}\). Some of the Mathavan equations not supplied by the paper were inferred to bridge gaps for a complete numerical solution.

Mathavan cushion model validation graphs
Validation graphs showing how simulated results match the published figures from the Mathavan paper. Click to see interactive diagrams.
Shot editor for tuning Mathavan physical constants
Interactive shot editor — adjust the physical constants in the Mathavan equations and observe the effect on cushion bounce outcomes. Click to open.

To confirm the correctness of this implementation, many of the figures from the paper are recreated in the interactive physics diagrams. These diagrams allow you to see the impulse and velocity changes across different incident angles and spins, proving consistency between the code and the theoretical model.

Experience the physics for yourself in the browser. Nine-ball, snooker, three-cushion, or practice mode.

Play now Practice Join lobby Leaderboard Source on GitHub