Two phases, two different physics problems
A fireworks shell is really two simulations chained together. First it behaves as a rigid projectile: the mortar tube gives it a fixed launch velocity, and from the moment it clears the muzzle it follows ballistic motion under gravity and air drag, the same as a cannonball. Then, at a height and time set by an internal time fuse, it stops being one object and becomes hundreds of independent projectiles -- the stars -- that inherit the shell's velocity at burst and then fly outward on their own.
The launch phase is standard projectile motion with quadratic drag: a = g - (k/m) v |v|. The drag term matters a lot for a shell moving 40-70 metres per second through air, so a simulation that only applies gravity will overshoot the real apex noticeably. Shell height at burst is tuned by fuse timing, not by aiming -- pyrotechnicians cut the time fuse to the burn duration that matches the seconds needed to reach the desired apex; a typical 3 inch (75 mm) shell bursts around 100 metres up after roughly 3 to 4 seconds of flight.
The burst: radial symmetry from an internal charge
Inside the shell, the stars are packed in a spherical or hemispherical shell around a small central burst charge. When the time fuse burns through, it ignites that charge, and the resulting pressure wave drives every star outward along the line from the shell's centre through that star's position in the packing -- which is why a well-built shell produces a nearly perfect expanding sphere rather than a random splatter. Special packing geometries -- a ring of stars, a heart, a smiley face -- carry that same radial symmetry into the sky as a recognisable shape.
// per-star velocity immediately after burst const theta = Math.random() * Math.PI * 2; const phi = Math.acos(2 * Math.random() - 1); // uniform point on a sphere star.vx = shell.vx + burstSpeed * Math.sin(phi) * Math.cos(theta); star.vy = shell.vy + burstSpeed * Math.sin(phi) * Math.sin(theta); star.vz = shell.vz + burstSpeed * Math.cos(phi);
Falling stars: drag, gravity and burning out
Once free of the shell, each star is its own tiny projectile: gravity pulls it down, drag slows the burst velocity, and its own internal composition burns for a fixed duration -- typically half a second to a few seconds -- before going dark. That burn time, not the burst speed, is what limits how big the flower of light appears to grow: stars that fly fast but burn briefly make a small, sharp burst; stars that burn slowly trace long, drooping trails as gravity pulls the whole shape into a downward teardrop. Willow and palm-tree effects come from slow-burning stars with a high drag coefficient; crackling and glitter effects add a secondary micro-explosion timed inside each star's own burn.
Chemistry sets the colour, physics sets the shape
The two effects are independent and a simulation can treat them separately. Colour comes from metal salts in the star's composition emitting at characteristic wavelengths when heated by the burn -- strontium for red, barium for green, copper for blue, sodium for yellow -- so colour is a per-star property, constant for the star's whole flight. Shape comes purely from the kinematics above: launch angle and speed set where the shell goes, fuse timing sets when and how high it opens, and the burst-charge geometry sets whether the stars fly out as a sphere, a ring, or a more elaborate pattern.
What the simulation approximates
This site's model keeps the physics honest while staying fast enough for hundreds of simultaneous stars: constant gravity, linear-in-time fuse burn, and a simplified drag term rather than a full aerodynamic model of a tumbling ember. It ignores wind shear and the slight asymmetry real shells pick up from imperfect star packing, both of which a professional pyrotechnic design program does model, because for a single shell on a dark canvas those details are invisible to the eye but expensive to compute every frame.
Frequently asked questions
Why do fireworks stars fall as curved streaks instead of straight lines?
Each star launches outward from the burst point in a straight radial direction, but gravity immediately starts curving that path into a parabola, and air drag bleeds off the burst speed. The combination bends the initially straight radial spray into the familiar drooping arcs.
What decides how big the burst looks?
Burst speed sets the initial radius growth rate, but burn time -- how long each star keeps glowing before going dark -- caps how far it travels before it disappears. A shell with fast stars and a short burn makes a small, tight flash; slow-burning stars with the same burst speed make a much larger flower.
Why does the fuse timing matter so much?
The fuse is the only thing that decides burst altitude, since the mortar cannot re-aim mid-flight. Too short a fuse bursts the shell dangerously low and close to the crowd; too long a fuse lets it fall past apex and burst on the way down, distorting the intended shape.
Try it live
Everything above runs in your browser — open Fireworks Shell Burst and change the parameters while it is running. Nothing is installed, nothing is uploaded, the whole model lives in one tab.
▶ Open Fireworks Shell Burst simulation