The Infinity Cell: Standing Inside a Reflection Group

geometryreflection-groupswebglraytracing

At a recent event I stood in front of an infinity-mirror dodecahedron: LED strips along every edge, every face a two-way mirror, and through each pentagonal window an endless corridor of reflected copies receding into the dark. The piece is a reflection group instantiated in hardware — each mirrored face is a generator, and the images deep in the glass are the group elements. Here nothing rotates: the object is fixed, and the viewpoint moves. Orbit it, dolly through a face, and stand inside the room the physical piece can only hint at.

Loading...

Dodecahedron
{5,3}
12 mirrors, 30 LED strips · dihedral 116.56°
defect 10.30° per circuit — the reflections never close

drag to orbit · right-drag to look · scroll to dolly · wasd to move · double-tap to enter

Why the cube closes

Reflections in two mirrors meeting at a dihedral angle θ\theta compose to a rotation by 2θ2\theta about their shared edge. The reflected images around that edge close up seamlessly if and only if

θ=πk,kZ.\theta = \frac{\pi}{k}, \quad k \in \mathbb{Z}.

Among the Platonic solids, exactly one passes this test. The cube’s dihedral angle is 90°=π/290° = \pi/2: four mirror-image rooms fit around every edge, and the reflection group generated by its six face planes tiles Euclidean space as the cubic honeycomb {4,3,4}\{4,3,4\}. Inside a mirrored cube, deep reflections form a perfect lattice — straight lines stay straight forever, to arbitrary depth. Switch the visualization to the cube and look: the interior is indistinguishable from an infinite crystalline corridor of rooms.

The 10.31° that makes it art

The dodecahedron’s dihedral angle is arccos(1/5)116.565°\arccos(-1/\sqrt{5}) \approx 116.565°. Three copies around an edge cover 349.70°349.70°, leaving an angular defect of about 10.31°10.31° per circuit. The recursion never closes. Every reflection chain accumulates that defect, and the deeper you look, the more the accumulated error curls the image — that is exactly the kaleidoscopic swirl you see far inside the physical piece. It is not an imperfection of the build; it is the geometry of E3\mathbb{E}^3 refusing to be tiled by dodecahedra.

The other solids fail more dramatically: the tetrahedron misses by 7.36°7.36°, the octahedron by 31.59°31.59°, the icosahedron by 83.62°83.62°. The dodecahedron’s near-miss is the aesthetic sweet spot — close enough to closing that the corridors read as almost periodic, wrong enough that they shear into spirals at depth.

One more structure worth seeing: the dodecahedron’s 30 edges fall into 15 parallel pairs whose directions group into 5 mutually orthogonal triples — the edge-level trace of the five inscribed cubes, on which the rotation group acts as A5A_5. The Five Frames pattern colors each edge by its triple.

Two perfect completions

The defect can be repaired — not in Euclidean space, but by bending space itself.

Shrink the cell in S3S^3. In spherical space, dihedral angles grow with size. Inflate the dodecahedron until θ=120°=2π/3\theta = 120° = 2\pi/3 and the mirrors generate {5,3,3}\{5,3,3\} — the 120-cell. Standing inside the mirrored cell, you would see its reflections close up exactly: 120 dodecahedral rooms receding along great-circle geodesics. The infinity mirror becomes a finite, perfect object — you are inside the 120-cell.

Grow the cell in H3H^3. In hyperbolic space, angles shrink with size. Grow the dodecahedron until θ=90°\theta = 90° and the mirrors generate the order-4 dodecahedral honeycomb {5,3,4}\{5,3,4\} — infinitely many right-angled dodecahedral rooms tiling hyperbolic space.

The physical art piece is the Euclidean shadow of these two exact objects, wedged between a spherical polytope and a hyperbolic honeycomb, belonging to neither.

How it's rendered: one fragment shader

The obvious implementation — mirror the scene recursively with render-to-texture — costs (faces)depth(\text{faces})^{\text{depth}} passes and dies immediately. Convexity gives a better way: a convex cell is an intersection of half-spaces nixdi\mathbf{n}_i \cdot \mathbf{x} \le d_i, so from any interior point the nearest boundary along a ray is a handful of plane tests. Each pixel runs the whole recursion analytically: find the nearest face, classify the hit (LED strip → emit and stop; frame → absorb; mirror → attenuate and reflect), and iterate to a bounce cap. That loop is the infinite mirror room. The CPU uploads a camera matrix and a clock; everything else — thousands of virtual LEDs at fifty reflection depths — is computed per-pixel, per-frame, in one fullscreen pass.

Depth falloff comes from three multiplicative losses, matching the physics of real half-mirrors: reflectivity per bounce, a slightly cyan mirror tint, and colored haze per unit path length. Most rays terminate early on a strip or frame, which is what keeps the average cost far below the bounce cap.

Built with TypeScript + raw WebGL2, zero dependencies. Single-pass analytic raytrace, HDR bloom via Kawase blur, ACES tonemap. Geometry invariants and the cube’s mirror-lattice exactness are verified numerically in CI.