The browser became a 3D platform quietly. WebGL is old news, WebGPU is arriving, and the tooling — Three.js, react-three-fiber, drei — has compressed what used to be a graphics-programming career into a weekend project. Yet most 3D websites still feel like tech demos. The difference between immersion and gimmickry is rarely technical; it is choreographic.
Depth is perceived, not rendered
Users do not perceive polygons; they perceive parallax, occlusion, and light. A flat DOM with three parallax layers and a well-placed shadow reads as deeper than a full scene rendered with default lighting. Before reaching for a canvas, ask whether transform-based depth cues can carry the effect — they are cheaper, more accessible, and degrade gracefully.
When a real scene is warranted, the camera matters more than the models. A camera that eases with spring physics — velocity carried between scroll positions, slight overshoot, settle — makes simple geometry feel physical. A linearly interpolated camera makes photoreal assets feel like a slideshow.
The motion budget
Every animated property spends from two budgets simultaneously: the GPU's frame budget and the user's vestibular budget. The first shows up in profilers; the second shows up as a vague urge to close the tab. My working rules: nothing animates faster than 300ms without user input driving it, scroll-linked motion never exceeds a 0.3 ratio of scroll velocity, and there is always a `prefers-reduced-motion` path that disables everything except opacity.
Restraint compounds. The sites that feel most alive animate the fewest things — but animate them with intent.