A brass orrery built by one Python script in Blender, turning live in the browser

Client
GrN.dk — demo shelf (demo.grn.dk)
Sector
3D on the web / Blender pipeline
Period
August 2026

The Orrery (demo.grn.dk)

At a glance

The Orrery is a brass planetarium modelled, textured, rigged and animated in Blender 4.5, exported as glTF and played back live with three.js: a meshing gear train under the deck, four planets and their moons on whole-number orbits, a glowing sun with bloom, wireframe and speed controls, drag to orbit. Below it the same scene rendered as a seamless Cycles turntable loop — and the .blend, the .glb and the one Python script that builds all of it from an empty scene.

One Python script builds the model, the animation, the glTF export and the Cycles render — nothing modelled by hand
134,944 triangles and 15 animation clips in a 3.6 MB glTF, loaded in about 2.6 s; a 192-frame Cycles turntable at ~9 s per frame on a 12-core CPU
Source shipped with the demo: the .blend, the .glb and build_orrery.py

The challenge

The card asked for a “mind-blowing Blender demo”. The interesting constraint was that there is no Blender on the web server and no GPU anywhere in the setup: the only machine that could run it was a small office box with a 12-core CPU and an integrated AMD graphics chip, headless. And a 3D showpiece that exists only as a rendered video proves less than one you can grab and turn — so the piece had to exist twice, as a film and as a live scene, without being built twice.

The solution

The whole model is code. build_orrery.py drives Blender’s Python API from an empty scene: primitives and bevels for the brass, gears cut with bmesh so the teeth actually mesh, Principled materials, empties as pivots for the arms, linear keyframes for whole-number orbital ratios, and a compositor bloom for the sun. The same script exports the glTF with scene-level animation and kicks off the Cycles turntable — 192 frames on CPU, about nine seconds each at 720p.

The web side self-hosts three.js with GLTFLoader, bloom and AgX tone mapping, merges the per-object animation clips the exporter emits into one timeline, and keeps the lights sane (physical spot lights blow out fast). The page ships the source next to the scene: anyone can open the .blend, read the script and rebuild the orrery on their own machine.

The results

A 135,000-triangle brass mechanism running in a browser tab from a 3.6 MB glTF, loaded in under three seconds, with the Cycles film below it for the machines that cannot run WebGL. The pipeline it set — author with bpy on the small box, export to glTF, self-host three.js — became the recipe for the spectacles configurator that followed, and is what “Blender on the web” now means on this shelf.