LUSTRE — a car detailing page where scrolling changes the paint finish

A one-page concept for a car detailing studio, built around a single three.js scene.

Live: LUSTRE — detailing atelier

What it does

  • The car sits in a dark studio under a hex LED ceiling, like the ones in real detailing bays. A RectAreaLight strip follows the cursor, so you look over the paint the way a detailer does.
  • Scrolling (Lenis) moves the camera around the car through the sections: correction, ceramic, film, colour.
  • Between sections a polishing line sweeps along the body and switches the finish: hazed → gloss → 9H ceramic → stealth film.
  • The colour swatches repaint the body live (chrome, racing green, papaya, Nardo grey, pearl).

How the finish change works
One MeshPhysicalMaterial patched with onBeforeCompile. Each finish is a small parameter set: colour, roughness, metalness, clearcoat, clearcoat roughness, dirt and iridescence. The shader holds two sets, A and B, and mixes them per fragment by world-space z against a uWipe uniform, so the border between old and new finish is a sharp line that travels along the car. A thin emissive glow rides on that line. The “dirt” on the hazed state is two octaves of 3D noise that raise roughness and cut the clearcoat.

Reflections come from a PMREM of a tiny env scene built from the same hex grid and side softboxes, so what you see in the paint matches the ceiling above it.

Performance

  • Draco-compressed glTF (the Ferrari 458 from the three.js examples, CC BY 4.0); the hex ceiling is one instanced mesh.
  • On touch devices DPR is capped at 1.5 and iridescence is off.
  • Time comes only from requestAnimationFrame, which also lets the page be recorded frame by frame for video.

Happy to answer questions about the paint shader.