{
  "schemaVersion": 1,
  "id": "hawking-radiation",
  "version": "1.0.0",
  "status": "published",
  "kind": "background",
  "title": "Hawking Radiation",
  "summary": "Particle pairs flash out of the vacuum at a black hole's horizon: one escapes, one falls in, and the hole shrinks. Loops perfectly.",
  "description": "A black hole that slowly gives itself away. Pairs of virtual particles flash into being just outside the horizon; in each pair one partner is pulled in and fades (cold magenta), the other escapes along a spiral carrying its energy away (bright cyan), and the hole, which paid for it, shrinks a little. A glowing photon ring, a streaked accretion disc and a halo mark the horizon against a field of stars. Choose the number of pairs, the colours (classic, ice, ember or mono), how many times each pair is born per loop, how much the hole shrinks, the seed and whether the camera sways.",
  "role": "Scene (3D, three.js): a cosmic physics showpiece for science, space and sci-fi content.",
  "collections": [
    "backgrounds",
    "hypnotic-loops",
    "particles"
  ],
  "tags": [
    "hawking radiation",
    "black hole",
    "event horizon",
    "particles",
    "space",
    "physics",
    "accretion disc",
    "glow",
    "stars",
    "loop",
    "3d"
  ],
  "synonyms": [
    "black hole evaporation",
    "virtual particles",
    "event horizon",
    "cosmic physics",
    "space scene",
    "particle pairs"
  ],
  "useCases": [
    "A physics or astronomy explainer",
    "A sci-fi title or space game backdrop",
    "An abstract particle loop"
  ],
  "featured": null,
  "publishedAt": "2026-10-05",
  "implementation": {
    "target": "three",
    "runtime": "browser",
    "language": "javascript",
    "module": "esm",
    "entry": "src/hawking-radiation.js",
    "exports": [
      {
        "name": "createBlackHole",
        "signature": "createBlackHole({ pairs?, palette?, cycles?, shrink?, seed? }) => { group, setProgress(progress), dispose() }",
        "description": "The black hole with its photon ring, disc, halo, star field and particle pairs; horizon radius 2; render through createBloomPass."
      },
      {
        "name": "createBloomPass",
        "signature": "createBloomPass(renderer, { width, height, glow?, exposure?, grain? }) => { render(scene, camera, output?), dispose() }",
        "description": "A small bloom with an anti-aliased, depth-tested scene target."
      },
      {
        "name": "PALETTES",
        "signature": "PALETTES: { classic, ice, ember, mono }",
        "description": "Colours for escaping and infalling particles, the disc and the photon ring."
      }
    ],
    "reusable": [
      "src/hawking-radiation.js"
    ],
    "demo": "demo.js",
    "harness": "index.html"
  },
  "dependencies": [
    {
      "id": "three",
      "version": "0.185.1",
      "reason": "Renderer, geometry and shader materials."
    },
    {
      "id": "apw-runtime",
      "version": "1.0.0",
      "scope": "demo",
      "reason": "Demo harness."
    }
  ],
  "params": [
    {
      "key": "pairs",
      "label": "Particle pairs",
      "type": "integer",
      "min": 16,
      "max": 140,
      "step": 4,
      "default": 64
    },
    {
      "key": "palette",
      "label": "Colours",
      "type": "select",
      "default": "classic",
      "options": [
        {
          "value": "classic",
          "label": "Cyan and magenta"
        },
        {
          "value": "ice",
          "label": "Ice"
        },
        {
          "value": "ember",
          "label": "Ember"
        },
        {
          "value": "mono",
          "label": "Mono"
        }
      ]
    },
    {
      "key": "cycles",
      "label": "Births per loop",
      "type": "integer",
      "min": 1,
      "max": 3,
      "step": 1,
      "default": 2
    },
    {
      "key": "shrink",
      "label": "Shrinking",
      "type": "number",
      "min": 0,
      "max": 2,
      "step": 0.1,
      "default": 1
    },
    {
      "key": "seed",
      "label": "Seed",
      "type": "integer",
      "min": 1,
      "max": 999,
      "step": 1,
      "default": 7
    },
    {
      "key": "orbit",
      "label": "Camera sway",
      "type": "boolean",
      "default": true
    }
  ],
  "presets": [
    {
      "id": "default",
      "label": "Cyan and magenta",
      "params": {}
    },
    {
      "id": "ice",
      "label": "Ice, many pairs",
      "params": {
        "palette": "ice",
        "pairs": 120,
        "seed": 12
      }
    },
    {
      "id": "ember",
      "label": "Ember, slow",
      "params": {
        "palette": "ember",
        "cycles": 1,
        "pairs": 48
      }
    },
    {
      "id": "mono",
      "label": "Mono, strong shrink",
      "params": {
        "palette": "mono",
        "shrink": 2,
        "seed": 3
      }
    }
  ],
  "output": {
    "width": 1080,
    "height": 1080,
    "fps": 30,
    "durationSeconds": 16,
    "posterSeconds": 4,
    "alpha": false,
    "motion": "procedural",
    "loop": {
      "seamless": true,
      "cycleSeconds": 16,
      "method": "Each particle pair is born a whole number of times per loop and is a function of its pair's phase, the disc streaks turn whole cycles per loop, the shrinking is a cosine of the loop and the camera sway is a sine of the loop, so the last frame meets the first."
    },
    "seed": {
      "param": "seed",
      "behavior": "Seed places the pairs, their sizes, reaches and spirals and the stars: same seed, same sky."
    }
  },
  "composition": {
    "inputs": "Time within the loop; the pairs, colours, births per loop, shrinking, seed and camera sway.",
    "outputs": "A full frame rendered in 3D through an anti-aliased bloom.",
    "coordinates": "The horizon (radius 2) is centred on the origin; the disc is tilted 16° and reaches to 7.6; stars sit on a sphere of radius 55–65; the camera sits 22 away.",
    "lighting": "Self-lit additive particles, ring and disc; the bloom gives the glow.",
    "timing": "setProgress(progress) places every particle from its pair's phase; frames render in any order.",
    "compatibleWith": [
      "kinetic-title",
      "number-reveal"
    ],
    "notes": [
      "Each pair has two particles with four trail ghosts each; the hole's scale shrinks by up to 14% at the middle of the loop and returns."
    ]
  },
  "reuse": [
    "Space explainer: Cyan and magenta.",
    "Cold sci-fi: Ice, many pairs.",
    "Dramatic: Ember, slow."
  ],
  "integration": {
    "newProject": "Create a WebGLRenderer, createBlackHole() and createBloomPass(renderer, { width, height }); each frame call hole.setProgress(progress) and bloom.render(scene, camera).",
    "existingProject": "Copy src/hawking-radiation.js; add hole.group to your scene and render it through createBloomPass."
  },
  "performance": {
    "notes": "Up to 1 400 additive instanced spheres, a ring-shaped shader and a bloom: a couple of milliseconds a frame on an integrated Intel GPU.",
    "limits": "Software WebGL renders in about two seconds a frame."
  },
  "limitations": [
    "The hole shrinks and then regrows within the loop; real evaporation is far slower and does not reverse.",
    "The disc is a stylised glowing ring, not a ray-traced lensed image."
  ],
  "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/physics-forces/hawking-radiation (MIT) and rebuilt for AI Pixel Wizard in October 2026 as an original scene: paired particles born at the horizon along a closed-form escape spiral and infall, a streaked accretion disc and a bloom, on an exact loop.",
  "changelog": [
    {
      "version": "1.0.0",
      "date": "2026-10-05",
      "notes": "Initial release."
    }
  ]
}
