The Infinity Cell: Standing Inside a Reflection Group
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...
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 compose to a rotation by about their shared edge. The reflected images around that edge close up seamlessly if and only if
Among the Platonic solids, exactly one passes this test. The cube’s dihedral angle is : 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 . 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 . Three copies around an edge cover , leaving an angular defect of about 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 refusing to be tiled by dodecahedra.
The other solids fail more dramatically: the tetrahedron misses by , the octahedron by , the icosahedron by . 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 . 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 . In spherical space, dihedral angles grow with size. Inflate the dodecahedron until and the mirrors generate — 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 . In hyperbolic space, angles shrink with size. Grow the dodecahedron until and the mirrors generate the order-4 dodecahedral honeycomb — 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 passes and dies immediately. Convexity gives a better way: a convex cell is an intersection of half-spaces , 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.