{
  "schemaVersion": 1,
  "id": "orrery",
  "version": "1.0.0",
  "status": "published",
  "kind": "object",
  "title": "Brass Orrery",
  "summary": "A brass orrery: a golden Sun lighting six enamel planets on turning arms, a tower of gear wheels at its foot. Loops perfectly.",
  "description": "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.",
  "role": "Object (3D, three.js): a product-style hero object for science, history, time and \"how it works\" content.",
  "collections": [
    "chrome-glass",
    "hypnotic-loops",
    "product-reveals"
  ],
  "tags": [
    "orrery",
    "solar system",
    "planets",
    "brass",
    "gears",
    "mechanical",
    "astronomy",
    "antique",
    "clockwork",
    "steampunk",
    "loop",
    "3d"
  ],
  "synonyms": [
    "planetarium model",
    "solar system model",
    "mechanical solar system",
    "brass planetarium",
    "astronomical model",
    "clockwork planets",
    "heliocentric model",
    "tellurion"
  ],
  "useCases": [
    "A science, astronomy or history-of-science explainer",
    "A steampunk, fantasy or antique-shop title scene",
    "A time, cycles and \"how it works\" product shot"
  ],
  "featured": null,
  "publishedAt": "2026-10-05",
  "implementation": {
    "target": "three",
    "runtime": "browser",
    "language": "javascript",
    "module": "esm",
    "entry": "src/orrery.js",
    "exports": [
      {
        "name": "createOrrery",
        "signature": "createOrrery({ metal?, planets?, moon?, gears?, anisotropy? }) => { group, sunPosition, planets, setProgress(progress, { speed? }), dispose() }",
        "description": "The orrery as a group of meshes (1 unit ≈ a hand's breadth; base radius 3.2, Sun at y = 1.5); add it to a scene with an environment map and a point light at sunPosition."
      },
      {
        "name": "PLANETS",
        "signature": "PLANETS: { name, r, size, turns, spin, surface, phase, … }[]",
        "description": "The six planets: orbit radius, size, turns round the Sun and on their axes per loop."
      },
      {
        "name": "METALS",
        "signature": "METALS: { brass, gold, silver, bronze }",
        "description": "Metal finishes: colour (sRGB) and roughness."
      }
    ],
    "reusable": [
      "src/orrery.js"
    ],
    "demo": "demo.js",
    "harness": "index.html"
  },
  "dependencies": [
    {
      "id": "three",
      "version": "0.185.1",
      "reason": "Renderer, geometry and physical materials."
    },
    {
      "id": "chrome-material",
      "version": "1.1.0",
      "scope": "demo",
      "reason": "Studio environment light, backdrop and contact shadow."
    },
    {
      "id": "apw-runtime",
      "version": "1.0.0",
      "scope": "demo",
      "reason": "Demo harness."
    }
  ],
  "params": [
    {
      "key": "metal",
      "label": "Metal",
      "type": "select",
      "default": "brass",
      "options": [
        {
          "value": "brass",
          "label": "Brass"
        },
        {
          "value": "gold",
          "label": "Gold"
        },
        {
          "value": "silver",
          "label": "Silver"
        },
        {
          "value": "bronze",
          "label": "Antique bronze"
        }
      ]
    },
    {
      "key": "planets",
      "label": "Planets",
      "help": "How many planets, nearest the Sun first.",
      "type": "integer",
      "min": 3,
      "max": 6,
      "step": 1,
      "default": 6
    },
    {
      "key": "speed",
      "label": "Pace",
      "help": "A whole-number factor on every motion; 1 turns Saturn once a loop.",
      "type": "integer",
      "min": 1,
      "max": 3,
      "step": 1,
      "default": 1
    },
    {
      "key": "moon",
      "label": "Moon",
      "type": "boolean",
      "default": true
    },
    {
      "key": "gears",
      "label": "Gear wheels",
      "type": "boolean",
      "default": true
    },
    {
      "key": "sun",
      "label": "Sun's light",
      "type": "number",
      "min": 0.4,
      "max": 2,
      "step": 0.05,
      "default": 1
    },
    {
      "key": "background",
      "label": "Backdrop",
      "type": "color",
      "default": "#14192b"
    },
    {
      "key": "orbit",
      "label": "Camera drift",
      "type": "boolean",
      "default": true
    }
  ],
  "presets": [
    {
      "id": "default",
      "label": "Brass, six planets",
      "params": {}
    },
    {
      "id": "silver",
      "label": "Silver, midnight blue",
      "params": {
        "metal": "silver",
        "background": "#0c1830"
      }
    },
    {
      "id": "bronze",
      "label": "Antique bronze, warm study",
      "params": {
        "metal": "bronze",
        "background": "#2a1a10",
        "sun": 1.3
      }
    },
    {
      "id": "inner",
      "label": "The inner planets, quick",
      "params": {
        "planets": 4,
        "speed": 2,
        "background": "#1a1a12"
      }
    }
  ],
  "output": {
    "width": 1080,
    "height": 1080,
    "fps": 30,
    "durationSeconds": 16,
    "posterSeconds": 9.5,
    "alpha": false,
    "motion": "procedural",
    "loop": {
      "seamless": true,
      "cycleSeconds": 16,
      "method": "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."
    },
    "seed": null
  },
  "composition": {
    "inputs": "Time within the loop; the metal, the number of planets, the pace, the Moon, the gears, the Sun's light, the backdrop and the camera drift.",
    "outputs": "A full frame, rendered in 3D with shadows and a studio environment.",
    "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.",
    "compatibleWith": [
      "chrome-material",
      "orbit-camera",
      "kinetic-title",
      "number-reveal"
    ],
    "notes": [
      "Planet surfaces and the engraved dial are drawn once with Canvas 2D from fixed seeds (CPU-backed canvases), so frames are identical from run to run.",
      "The gear wheels are extruded 2D shapes with teeth and spoke openings; each turns with its arm."
    ]
  },
  "reuse": [
    "Science or history-of-science explainer: Brass, six planets.",
    "Fantasy or steampunk title: Antique bronze, warm study.",
    "Quiet product-style loop: Silver, midnight blue."
  ],
  "integration": {
    "newProject": "Create a WebGLRenderer with shadows, a studio environment (see chrome-material), createOrrery(), a PointLight at orrery.sunPosition with castShadow; add orrery.group to the scene and call orrery.setProgress(progress) each frame.",
    "existingProject": "Copy src/orrery.js; add orrery.group to your scene (with an environment map so the brass reflects something) and a point light at orrery.sunPosition."
  },
  "performance": {
    "notes": "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.",
    "limits": "Software WebGL (no GPU) renders in several seconds a frame because of the cube shadow map."
  },
  "limitations": [
    "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."
  ],
  "license": {
    "spdx": "MIT",
    "notice": "Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.",
    "thirdParty": []
  },
  "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.",
  "changelog": [
    {
      "version": "1.0.0",
      "date": "2026-10-05",
      "notes": "Initial release."
    }
  ]
}
