# Black Hole Observatory v0: scientific model

All lengths use the Schwarzschild radius rs = 2GM/c². The black hole is uncharged and nonrotating. Its geometry is fixed; observers are static at r/rs = 6, 8, 12, 20, or 32. This is numerical ray tracing in an exact background solution of Einstein's equations, not a simulation of evolving spacetime or accretion matter.

## Rays

Spherical symmetry confines each ray to a plane. In units rs=1, set u=1/r and b=L/E. For null geodesics:

    (du/dφ)² + u²(1-u) = 1/b²
    d²u/dφ² = -u + (3/2)u²

At the static camera radius R, let α be the ray angle measured from the outward radial direction in its local orthonormal frame:

    b = R sin(α) / sqrt(1-1/R)
    u(0) = 1/R
    u'(0) = -cos(α)/b

The event horizon is at r=1; the unstable circular photon orbit is at r=1.5. For inward rays, the capture/scatter threshold is bcrit = 3sqrt(3)/2. For these outside observers, the critical camera angle is

    αcrit = π - asin(bcrit sqrt(1-1/R)/R).

Inward rays with α >= αcrit cannot escape to the background. The apparent shadow angular radius is π-αcrit. This capture shadow is not the physical surface of the event horizon and should not be equated to an observed accretion image's dark region.

Escaping rays reach u=0 at an accumulated orbital angle Φ. The background direction is n cos(Φ) + t sin(Φ), where n is the observer's radial unit vector and t the tangential projection of the camera ray. The sky texture is an illustrative field at infinity. Its flux/colors are artistic; redshift and radiative transfer are omitted.

## Calculation and validation

The lookup tables are computed from the first integral by SciPy adaptive quadrature. A root solve determines the outer turning point. A substitution u=ut(1-t²) removes its endpoint singularity. Incoming rays combine the inbound and outbound integrals. Outgoing rays use a single integral.

Independent DOP853 integration of the second-order equation checks 205 reference rays, including captured rays, at all five radii. Further checks cover the conserved first integral, the photon sphere, and convergence toward weak-field bending 2rs/b for infinity-to-infinity scattering. The browser's selected-ray diagram uses a third calculation: fixed-step RK4 with root refinement at escape/capture events, checked against the reference rays.

The GPU linearly interpolates Φ in q=-ln(1-α/αcrit), with 4096 samples per radius and q <= 14. It uses float32 textures. The published lookup-error number tests double-precision table interpolation against DOP853; it does not include every GPU rounding, pixel-filtering, or texture-resolution error. Numerical results and tolerances are in data/validation.json. These are sampled checks, not a global error bound.

An escaping angular band of width αcrit exp(-14), roughly 2.5 microradians or less, is unresolved and displayed as black. Higher-order structure at the critical curve is not resolved. The path diagram shows Schwarzschild coordinate positions projected into the orbital plane and clips at its frame. It is not a physical embedding diagram or a local distance ruler. Reported turn angle is the accumulated orbital angle from camera to infinity, not the asymptotic scattering deflection.

## Controls and comparison

Changing radius selects another static observer; it is not a free-fall trajectory. Dragging/arrow buttons move the observer around the center while looking inward. FOV changes angular framing. Lensing off uses straight rays in flat space, with no capture shadow. The optional grid is on the celestial sphere. Diagram rays remain GR reference rays while flat-space comparison is active. Camera tours are illustrative sequences of static views.

## Sources

- Gibbons & Vyska, _The Application of Weierstrass elliptic functions to Schwarzschild Null Geodesics_: https://arxiv.org/abs/1110.6508
- Gralla, Holz & Wald, _Black Hole Shadows, Photon Rings, and Lensing Rings_: https://arxiv.org/abs/1906.00873

No images or code from those papers are redistributed. The synthetic star field is generated with a fixed random seed by Midkernel; it is not an observed star catalog. Three.js is redistributed under its MIT license in licenses/three.txt.
