Planetarium Dome
Animation

20233D  ·  Blender  ·  Animation

The assignment was to create a work evoking calm, peacefulness, and renewal for projection inside a planetarium dome. The projectors could handle 4K at 60fps, so that became the output target. A dome is not a screen — the viewer is inside the image, looking up. Composition, horizon, focal weight: none of the standard rules apply when the center of the frame is directly overhead.


The vision was immediate: stars fading into darkness. The reference was a bouncy ball filled with glitter I had as a kid — there was something calming about the random distribution of the stars and the way the shiny material caught light. I wanted to recreate that sensation procedurally in Blender. Shadertoy was a secondary influence, specifically the quality that code-generated visuals have — they feel found rather than composed.


The first approach used a particle system repeating a plane masked with a star shape, with a normal map made in Photoshop to simulate glitter. A camera pointing straight up recorded the dome randomly spawning stars, which drifted into a black fog outside the dome boundary. It looked okay but lacked depth, and looping was nearly impossible — a persistent dark artifact kept appearing that I couldn't eliminate. The cause was the geometry itself: planes only have a positive normal in one direction, so the lighting broke at certain angles.

Frame from the final planetarium dome animation showing 3D particle star field fading into darkness
Final render — 4096×4096px, 60fps, Blender particle system

I rebuilt the system from scratch. Instead of planes, I modeled fully three-dimensional stars with random location, size, and rotation so normal direction was no longer a problem. A large plane randomly spawned area lights parented to the camera, which moved laterally over the 1,500 frames to create parallax depth through the field.

Rendering ran over three days on my laptop at roughly two and a half minutes per frame. I assembled the sequence in After Effects and had to render it twice — the first pass had a bitrate cap I didn't catch until playback that was visibly limiting the output. Final specs: 30 seconds, 1,500 frames, 60fps, 4096×4096px.