How to Model Tire Blowouts in Matter.js
Simulating a sudden tire blowout in a 2D physics environment requires
instantly modifying the dynamic material properties of a wheel body to
reflect sudden depressurization. In Matter.js, this effect is achieved
by immediately updating the rigid body's restitution to
eliminate bounce, altering its friction and
frictionStatic to simulate tread degradation or rim
grinding, and applying asymmetrical forces to destabilize the
vehicle.
The Physical Mechanics of a Blowout
When an inflated tire bursts, two primary physical changes occur immediately:
- Loss of Elasticity (Restitution): A pressurized
tire behaves like a spring, storing and returning kinetic energy upon
impact with an elasticity (
restitution) typically between0.2and0.4. A blown tire becomes a dead weight of deflated rubber and steel, dropping its restitution to near0. - Shift in Traction (Friction): Traction changes
depending on whether the vehicle rides on shredded rubber or the bare
wheel rim. Surface contact shifts from predictable grip to high-drag
sliding or erratic slipping.
frictionStaticand slidingfrictionmust be modified accordingly. - Chassis Asymmetry: The effective radius of the wheel contracts, lowering that corner of the vehicle and creating an instantaneous torque imbalance.
Instantly Modifying Body Properties in Matter.js
Matter.js exposes body properties directly and via the
Matter.Body module. The recommended way to alter these
properties in the middle of a simulation loop is by using
Body.set().
// Reference the Matter.js modules
const { Body, Vector } = Matter;
/**
* Triggers an instant tire blowout on a specified wheel body.
* @param {Matter.Body} wheel - The wheel rigid body experiencing the blowout.
*/
function triggerTireBlowout(wheel) {
// 1. Strip elasticity completely
Body.set(wheel, 'restitution', 0.0);
// 2. Adjust friction values
// A shredded tire increases rolling resistance and loses consistent grip
Body.set(wheel, 'friction', 0.8); // Kinetic sliding friction
Body.set(wheel, 'frictionStatic', 1.2); // Static grip resistance
Body.set(wheel, 'frictionAir', 0.02); // Added drag on the rotating mass
// 3. Mark the wheel state for custom logic
wheel.isBlown = true;
}Direct property assignment (e.g., wheel.restitution = 0)
is also functional in Matter.js, but Body.set() ensures
proper internal updates within the physics engine pipeline.
Simulating Vehicle Instability
Modifying friction and restitution alone creates passive mechanical changes. To fully capture the violent nature of a blowout at high speed, you must introduce an instantaneous force imbalance to pull the vehicle toward the compromised side.
Applying a Sudden Lateral Impulse
When the tire fails, apply an immediate directional impulse to the chassis to mimic the abrupt pull:
function applyBlowoutInstability(chassis, isLeftTire) {
// Determine the direction of the jerk (left or right)
const pullDirection = isLeftTire ? -1 : 1;
// Apply a sudden angular velocity or lateral force
Body.applyForce(chassis, chassis.position, {
x: pullDirection * 0.05 * chassis.mass,
y: 0.01 * chassis.mass // Slight downward jolt
});
}Simulating Rim Drop and Deflation
A flat tire loses structural height. If your vehicle uses
Matter.Constraint for suspension, you can simulate rim drop
by shortening the constraint length:
function deflateSuspension(suspensionConstraint) {
// Shorten the rest length of the spring constraint to drop the chassis
suspensionConstraint.length *= 0.75;
}Alternatively, if the wheel is a single circle body, you can scale
the wheel geometry down using Body.scale():
// Shrink the wheel radius to simulate the drop onto the rim
Body.scale(wheel, 0.85, 0.85);Continuous Post-Blowout Dynamics
After the blowout trigger executes, the wheel should behave
unpredictably while rolling. You can listen to the engine's
beforeUpdate event to inject rim-drag turbulence:
Matter.Events.on(engine, 'beforeUpdate', () => {
if (wheel.isBlown && Math.abs(wheel.angularVelocity) > 0.05) {
// Apply random micro-jitter to simulate an uneven rim skipping on the ground
const jitter = (Math.random() - 0.5) * 0.002 * wheel.mass;
Body.applyForce(wheel, wheel.position, { x: 0, y: jitter });
}
});This combination of instant property updates, suspension collapse, and post-blowout force application yields a stable, physically believable tire failure in 2D space.