A small cratered planet with a domed observatory and a lone astronaut beneath a vast black hole with a glowing, lensed accretion disk

A Blender scene · Cycles + OSL

The Last
Observatory

A tiny scientific outpost on an impossibly small planet, orbiting close to a black hole. One astronaut stands at the edge of the world and watches the light fall in.

Six seconds

The camera starts over the astronaut's shoulder and pulls back in log space, so the frame widens at a steady rate. As it retreats it rolls from the astronaut's local vertical to world up, and the horizon tilts away until the planet is a globe in the sky.

Frame 1: over the astronaut's shoulder, the black hole ahead0.0s
Frame 36: the camera begins to pull back1.5s
Frame 60: the astronaut on the curved horizon2.5s
Frame 84: the observatory and path lights revealed3.5s
Frame 108: the planet becomes a small globe4.5s
Frame 144: the full scene6.0s

The still

The final frame of the move is also the hero composition. The planet sits low and left, the hole looms upper right, and the astronaut is silhouetted against the white-hot approaching side of the disk.

A small cratered planet with a domed observatory, radio mast, dish and a lone astronaut, beneath a huge black hole with an orange lensed accretion disk
2560 × 1440, Cycles, 384 samples. Click for the lossless PNG.
Close crop of the black hole: thin photon ring and lensed gas streaks

A real black hole, not a painted ring

The sky is one OSL shader. It traces every camera ray backwards through the curved spacetime around a non-rotating black hole.

  • Gravitational lensing. Photon paths are integrated with a = −1.5 h² r̂ / r⁴, whose orbits match Schwarzschild null geodesics exactly. The far side of the disk bends over and under the shadow on its own.
  • Photon ring and Einstein ring. Higher-order images hug the shadow, and background stars smear into arcs around it.
  • Relativistic Doppler beaming. Gas moving towards us is brighter and hotter, which is why one side of the disk burns white.
  • Keplerian shear. The inner disk orbits faster than the outer disk (ω ∝ r−3/2), so the gas visibly winds during the shot.
  • Seamless sky. Distant rays use the analytic weak-field deflection of the same force law, so the lensed star field has no join.

Everything is procedural

There are no downloaded models or image textures. The scene is generated from Python, and the terrain and rock field stay live, editable Geometry Nodes systems in the .blend.

01The planet

A 9 m icosphere displaced by Geometry Nodes: noise undulation, ridged detail and three scales of craters (Voronoi bowls with raised rims). It also has a levelled observatory pad and a smoothed path. The regolith shader darkens crater floors, brightens ejecta and presses boot prints into the dust.

02Rocks

Nine rock prototypes from a RockGen node group (noise plus Chebychev-Voronoi facets). They are Poisson-scattered as rocks, boulders and pebbles, with keep-out zones around every structure and path. Dust settles on their upward faces.

03The observatory

A panelled drum with seams, rivets, paint chips and creeping dust. It has an open door onto a lit console, glowing portholes, a catwalk, railing and ladder, and a dome whose slit and shutter face the black hole. Inside, a telescope is aimed straight at it under red observing light.

04Antenna equipment

A striped lattice radio mast with guy wires, panel antennas and a Yagi aimed at the hole. Its red beacons blink. Nearby are a parabolic dish with feed struts, a solar array, supply crates, path bollards and cables draped over the terrain.

05The astronaut

A metaball EVA suit with accordion pleats at the joints. A hard-shell helmet with a gold visor, a backpack, a chest control unit with status LEDs, gloves, boots and a handheld tablet. Ray-casts under each boot seat the figure on the terrain.

06Light and grade

A warm key stands in for the inner disk, a cold starlight fill and a cool under-rim keep the night side readable, and warm practicals glow against the dark. The grade is AgX with bloom, subtle lens dispersion, a vignette and a split-tone.

Build it yourself

It runs on Blender 5.2, either the app or the bpy module from PyPI. Rendering needs Cycles on CPU with Open Shading Language enabled, which the saved file already has switched on.

# rebuild the scene from nothing (~10 s)
python scripts/build_scene.py -- --out the_last_observatory.blend

# the hero still (last frame)
python scripts/render_still.py -- --res 2560x1440 --spp 384

# the 6 s animation, then an MP4
python scripts/render_animation.py -- --res 1280x720 --spp 32

Start with shaders/black_hole_sky.osl for the black hole and scripts/lastobs/layout.py for how the layout is derived from the final framing. You can also download the .blend.