Skip to content

Brass Orrery

A brass orrery: a golden Sun lighting six enamel planets on turning arms, a tower of gear wheels at its foot. Loops perfectly.

3D object, V2 Objects3DSeamless loop, verified388 lines of codev1.0.0

In Machines & clockwork, Space & cosmos, Craft & heritage

Next: AstrolabeSurprise me

Brass Orrery preview
Starting live preview…
00:00:00:00 / 00:00:00:01

Live, running the real source at reduced resolution.

Your current settings go with it. Combine several clips and hand them over together from your sequence.

Effect controls

Presets

6

How many planets, nearest the Sun first.

1

A whole-number factor on every motion; 1 turns Saturn once a loop.

1

The preview runs the same code your AI receives. These settings travel with the hand-off.

Info

What it is

An eighteenth-century orrery in polished brass: a golden Sun with a ring of rays on a column, and on arms of different heights the planets from Mercury to Saturn (enamelled and banded, Earth with its tilted axis and its Moon, Saturn in brass hoops) circling it, the nearest fastest; at the foot of the column a tower of gear wheels, one to each arm, turns with it; the whole stands on a turned walnut base with a bevelled brass rim, an engraved dial and the orbits scored in it. The Sun is the light: it shades the planets into day and night and throws the arms' shadows across the base. Choose the metal, how many planets, the pace, the Moon, the gears, the Sun's brightness, the backdrop and whether the camera drifts round it.

Reuse it in your own idea

  • Science or history-of-science explainer: Brass, six planets.
  • Fantasy or steampunk title: Antique bronze, warm study.
  • Quiet product-style loop: Silver, midnight blue.

Which part is reusable

src/orrery.js is the ingredient your AI reuses. demo.js is only the example scene around it, and uses chrome-material only for the demo.

Good to know

  • The distances and sizes are not to scale and the periods are whole-number ratios chosen to loop, not the real ones.
  • Pluto and the outer planets are not modelled; Saturn's rings are brass hoops, not a disc.
  • The Sun is a lit emissive ball with a sprite glow, not a light source in the render's physics beyond the point light.

Technical details

Technical details
Implementation
Three.js 0.185.1 (WebGL) · ES module src/orrery.js
Exports
  • createOrrery({ metal?, planets?, moon?, gears?, anisotropy? }) => { group, sunPosition, planets, setProgress(progress, { speed? }), dispose() }
  • PLANETS: { name, r, size, turns, spin, surface, phase, … }[]
  • METALS: { brass, gold, silver, bronze }
Dependencies (exact)
  • three@0.185.1 (source) — Renderer, geometry and physical materials.
  • chrome-material@1.1.0 (demo) — Studio environment light, backdrop and contact shadow.
  • apw-runtime@1.0.0 (demo) — Demo harness.
How it fits a scene

Coordinates: The base is a disc of radius 3.2 on the plane y = 0, the column rises to the Sun at y = 1.5; planets circle at radii 0.72 … 2.68 in the plane y = 1.5; the camera orbits a point at y = 0.95.

Lighting: The Sun is a warm point light at the centre with a shadow map: it shades the planets into day and night and casts the arms' shadows on the base; a dim key light and a studio environment give the brass its reflections.

Timing: setProgress(progress) sets every angle as a whole number of turns of the loop; frames render in any order.

Output
1080×1080, 30 fps, 16 s · procedural (computed from the frame number) · seamless loop — Every arm turns a whole number of times per loop (Mercury eight, Venus five, Earth four, Mars three, Jupiter two, Saturn one, each times the pace), the planets spin and the Moon circles the Earth in whole turns, and the camera drift is a sine of the loop, so the last frame meets the first.
Tested
Rendered 480 frames on 2026-10-06 in Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0 (WebGL 2 via SwiftShader (software)). Same frame twice from fresh pages: identical. Loop: Frame 0 vs end state (progress 1): mean |Δ| 0.0000, max |Δ| 0 of 255.
Performance
About 150 meshes, one point light with a cube shadow map (six shadow passes) and anti-aliasing. About 22 ms a frame at 1080p on an integrated Intel GPU. Software WebGL (no GPU) renders in several seconds a frame because of the cube shadow map.
Export a video yourself
Download the source, then in the folder: npm install npm run render -- orrery/1.0.0 --out my-video.mp4Needs Node 18+, ffmpeg and Chrome/Chromium. Add --params my-settings.json (from Copy settings) for your own settings.
Version
1.0.0 · sha256:4e4c78e04fc2b4d2…
Files
License
MIT. Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder. License details
Provenance
Adapted from the owner's threejs-sketches/mechanical-kinetic/orrery (MIT) and rebuilt for AI Pixel Wizard in October 2026 as an original object: a Sun-lit instrument with textured enamel planets, tilted axes, a Moon, extruded gear wheels, an engraved dial, shadows from the Sun and whole-turn motion for an exact loop.
BinMore like this

Astrolabe

3D object3DSeamless loop16 seconds

Music Box

3D object3DSeamless loop12 seconds

Gyroscope

3D object3DSeamless loop16 seconds

Hourglass

3D object3DSeamless loop16 seconds