Generator - Depth & exposure dynamics: per-track chamber depth (z) + event age drive opacity, bubble size and defocus (depthFactors); depth/aging dials. - Palette abstraction (src/render/palette.js) — one registry entry per "feel": mono, charge, beta, kind, kindlife, kindrise, lifecycle, psychedelic, cyanotype, magentarise. Per-track ink + per-bubble bubbleInk hooks. - Global colour controls: saturation, hue shift; paper toning (cream/sepia/ selenium/cool/olive/neutral + brightness + gas-glow), bubble edge softness, iridescent disk (spectral sunburst), chromatic halo. Ink blend chosen by ground luminance so light-on-dark chemistries composite correctly. - Tracks carry charge q; bubbles carry lifecycle position + local beta. - All effects in raster + layered SVG + CMYK/OCG PDF; B&W remains the default. Tooling & art - tools/find-semicircle.mjs; render-svg/pdf --seed mode + k=v overrides. - Curated vector SVG sets under output/ with browsable index.html. Repo hygiene - .gitignore: stop tracking generated rasters/PDFs (reproducible from seeds), the reference image, and a stray db; keep curated SVGs + code + docs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
84 lines
4.5 KiB
Markdown
84 lines
4.5 KiB
Markdown
# Bubble Chamber
|
||
|
||
A seeded, parametric generator of imaginary particle-physics plates — the
|
||
black-and-white "bubble chamber" photographs of mid-century high-energy physics —
|
||
built for large-format art print. One seed → one fully-determined image, rendered
|
||
either as a worn photographic plate or as clean, layered vector for print.
|
||
|
||

|
||
|
||
## How the images are generated
|
||
|
||
Everything derives deterministically from a **seed** string: the seed is hashed
|
||
(`cyrb53`) to seed a chain of salted PRNGs (`mulberry32`) that drive a small
|
||
physics model, so the same seed always yields the same plate. Charged particles
|
||
are launched from interaction **vertices** and integrated step-by-step through a
|
||
uniform magnetic field — curving with radius `r = p/(qB)` and bleeding momentum to
|
||
a simplified Bethe–Bloch energy loss, so slow particles tighten into inward
|
||
spirals. The velocity **β** is tracked along every path and sets both how densely
|
||
**bubbles** nucleate (`∝ 1/β²`) and how fat they are. Low-energy electrons
|
||
knocked loose along the way (**δ-rays**) are drawn as tight logarithmic spirals;
|
||
neutral particles leave **V-decays**; stiff **cosmic rays** and gentle
|
||
**sweepers** cross the frame; a pressure **shock disk**, faint **chamber-optics**
|
||
lines, and **emulsion damage** (scratches, dust, water rings, stains) complete the
|
||
scene. This pure geometric description — the **scene model** — is renderer-agnostic
|
||
and handed to independent renderers: a **photographic raster** compositor that
|
||
layers soft blooming bubbles, halation, film grain, tonal mottle, vignette and
|
||
plate damage for the worn-archival look; and a **vector renderer** that emits the
|
||
identical geometry as **layered SVG** and **CMYK PDF (with OCG layers)** for the
|
||
print shop. Because the seed fixes every choice, an inspiration thumbnail and its
|
||
print master are the same image at different sizes.
|
||
|
||
## Colour, palettes & effects
|
||
|
||
Black-and-white is the default; colour is an optional, seeded **palette** layer
|
||
(`src/render/palette.js`) applied over the same geometry. Shipped feels:
|
||
|
||
- **mono** (B&W), **charge** (duotone by charge sign), **β** (velocity → spectral)
|
||
- **kind** (one hue per particle type), **kindlife** / **kindrise** (type sets the
|
||
hue, lifecycle sets the *intensity* — fading to, or rising toward, the death)
|
||
- **lifecycle** (hue across birth→death), **psychedelic** (hue cycling along trails)
|
||
- **cyanotype** (a full chemistry — blueprint ground + pale ink), **magentarise**
|
||
(a restrained magenta-family example with a burnt-orange disk)
|
||
|
||
Orthogonal global controls: **paper tone** (cream/sepia/selenium/cool/olive/neutral
|
||
toners + brightness + gas-glow), **saturation**, **hue shift**, **depth/exposure**
|
||
(per-trail opacity, size & defocus from chamber depth + event age), **bubble edge
|
||
softness**, **iridescent disk** (spectral sunburst), and **chromatic halo** (a
|
||
hue-shifted aura around trails). Adding a new "feel" is one entry in the registry.
|
||
|
||
## Quick start
|
||
|
||
```bash
|
||
# interactive: open the single self-contained file in a browser
|
||
open bubble_chamber.html # type a seed, hit "Derive all params from seed", tweak sliders
|
||
|
||
# dev build (modular src/ → portable single file)
|
||
node build.mjs
|
||
|
||
# browse random plates, pick by seed, render print masters
|
||
tools/inspire.sh 24 600 # → output/inspiration/index.html
|
||
tools/render.sh LAMBDA-2648 # → output/masters/ (SVG + CMYK PDF + hi-res PNG)
|
||
node tools/render-svg.mjs --seed LAMBDA-2648 out.svg 6000 diskSoften=1.5
|
||
```
|
||
|
||
## Project layout
|
||
|
||
- `src/` — modular source: `scene/` (the deterministic model), `render/` (canvas /
|
||
svg / pdf), `ui/`, `rng.js`, `main.js`.
|
||
- `bubble_chamber.html` — built, portable single-file app (live sliders + export).
|
||
- `tools/` — headless render helpers, the inspiration randomizer, CLI renderers.
|
||
- `output/` — `inspiration/` contact sheets, `iterations*/` curated SVG sets (with
|
||
browsable `index.html`), and `masters/` print files. Raster PNGs and print
|
||
masters are **git-ignored** (large and fully reproducible from their seeds).
|
||
- **[DESIGN.md](DESIGN.md)** — architecture & physics decisions.
|
||
- **[PRINT.md](PRINT.md)** — large-format strategy (vector + texture layers, SVG/PDF layers, sizes/DPI).
|
||
- **[roadmap.md](roadmap.md)** — where the project is going, artistically and technically.
|
||
|
||
## Aesthetic
|
||
|
||
Faithful black-and-white photographic-positive by default (dark ink on milky
|
||
paper), with a "negative plate" variant and an optional colour-palette layer.
|
||
Vector-first for print; the seed/hash makes any preview reproducible at any
|
||
resolution.
|