Gazing into the Rhombotron
Crawling through the Matrix
Rhombotron on the credenza

Rhombotron

We will continue this pattern until we have reached the Infinite Everything

✓ Completed

Debrief

The Challenge

1/ Explore the reflective possibilities of a new polyhedron — the rhombic dodecahedron

2/ Address the production and quality issues with my Octahedral Infinity Mirror

Process & Iteration

Rhombotron is an iteration on my original octahedral infinity mirror. When I jumped into constructing the octahedron, I had a vision for the end product but failed to consider many crucial aspects of the design, including:

- A way to attach the LED strips along the edges
- A strain-proof way to route the cabling for power and data to the exterior
- An enclosure for the microcontroller
- A way to install the final half-mirrored acrylic panel — which was extremely difficult when all the others were in place!

Additionally, after seeing the octahedron in action, I realized the interior reflections appeared roughly the same through every window. The triangular arrangement of LEDs around a window was simply reflected in perfect opposition by the mirror on the other side and vice versa, creating a nested series of truncated triangles (hexagons) that shifted in parallax fashion when you changed perspective. It was interesting, but that was its full range. I was curious about other polyhedra that might produce a greater diversity of effects depending on the viewer's perspective.

I was struck by the rhombic dodecahedron, a 12-sided polyhedron where each faces is an identical (usually equilateral) rhombus. Like the octahedron and its dual, the cube, the rhombic dodecahedron has octahedral symmetry, with three fourfold axes of symmetry, four threefold axes, and six twofold axes. However, unlike those polyhedra, in which every vertex connects to either 3 or 4 edges (respectively), the rhombic dodecahedron has both 3- and 4-order vertices.

Essentially, all of this means there are 3 unique perspectives:

I needed to see how the asymmetry of the rhombus' interior angles changed the patterns of the internal reflections!

Getting Started

When I started this project, I had been using OpenSCAD for most of my 3D modeling work. Code is second nature to me, and I appreciated OpenSCAD's precise control of the dimensions and transformations of geometry, the ability to compose components like writing functions, and its reliable generation of manifold STLs. My first step was to make the plain, solid polyhedron.

Rather than write out the formulas to precisely calculate the vertex coordinates of a normalized-scale rhombic dodecahedron, I took a slightly lazier approach. If you spend enough time researching polyhedra online, you'll eventually stumble across George W. Hart's incredible website on these fascinating geometric objects. His page has an incredible range of 3D-rendered polyhedra, and he freely provides VRML files (a blast from the past!) for many of them. From his rhombic dodecahedron file, I was able to extract the coordinates and line and face sets I needed. Seriously, if you appreciate the intersection of art and math as much as I do, you will love exploring his page!

I didn't get very far using raw OpenSCAD before I pivoted to SolidPython, a python wrapper that can render SCAD code. I created a class to store the unit-scale parameters and enable rendering the solid polyhedron at arbitrary sizes.

For example, here is the method for rendering a solid rhombic dodecahedron:

def render_solid(self, **kwargs):
    col = {"c": kwargs.pop("color", None), "alpha": kwargs.pop("alpha", 1.0)}

    return color(**col)(
        polyhedron(points=self.vertices, faces=RhombicDodecahedron.base_faces)
    )

Modeling the Rhombotron

I quickly built on this foundation, leveraging my proficiency in python to expand the class. I added new rendering methods to place arbitrary 3D shapes at each vertex and join them together with a convex hull to make solid edges. I also added a method to render the faces with a given thickness and translation inward/outward along the face normal — the acrylic panels that would be used to cut retention channels into the edge and vertex components. Finally, I enhanced the vertex and edge renderers to allow me to orient and cut out additional shapes for the LED strips, wiring, and pocket holes for the screws that would hold everything together.

This class served as the core of the modeling effort, and I continued iterating on it throughout the project. I added several property getters to retrieve different aspects of the polyhedron, such as the set of vertices associated with a given face, the order of a given vertex (3 or 4), or the radii of the insphere, midsphere, or circumscribing sphere. I also created new initializers to generate rhombic dodecahedrons with a particular insphere, midsphere, or circumscribing sphere radius.

Gradually, I generated the models for the standard 3- and 4-order vertices and the edge:

{scad render here}

Special Components

{4-order vertex with barrel jack}

{removable final face panel}

Electronics and Wiring

{number of LEDs was much greater than in the octahedron and while I managed without multiple power injection sites in that, this one required multiple}

{My goal was a single barrel jack to supply power to the MCU and the LEDs}

{non-Hamiltonian path prevented a single, directed route through each vertex without doubling back any where -> network X used to eulerize the path at random until a path with the minimum retraces was found}

{PixelBlaze}

LED Mapping

{la dee da}

The Outcome

TBD

Key Learnings

TBD