Fun with mirrors

Recently, Yayoi Kasama’s exhibit was at the Seattle Art Museum. Her exhibit explored infinity mirrors and inspired local Seattle creator, Neil Merchant, to build an infinity dodecahedron. A friend of mine pointed me to his project on social media and my reaction was,

It’s glorious!

Being the LED fanatic that I am, I immediately decided to try some experiments with two-way mirrors. This post will share observations and showcase progress so far.


I already had plenty of LED light projects for testing in the infinity solids so I focused on figuring out how to source the two-way mirrors.

I’m not the craftiest person, and I’m also impatient and lazy so I found a local retailer (TAP plastics) that would acquire and slice up two-way mirrors. Given the dimensions of the cuts, TAP would provide to me shapes. I had to exercise some control when making my order because two-way mirrors are not cheap. The goal was to produce supplies that would be useful for testing a variety of shapes.

I had recently found a post on constructing polyhedra via Conway operators that showed various interesting shapes:

Wanting to choose the easiest / most common shapes, I observed that I could produce a good number of shapes using triangles and squares with equal sides. Without a clear plan in place, I ordered some triangles and squares from Tap.

The overall idea was to produce some 3D-printed parts that I could use to affix the raw shapes together into mirrored solids, test with objects lit from within, and see what happens. Going into the project, I didn’t know whether the mirrors sourced from Tap would work with an infinity effect or whether I could get good results with basic shapes.

My first shape

I elected to produce a cube as my first shape because I figured the 3D printed parts for holding it together would be the easiest to design. I produced a single joint part that would connect the sides to the bottom / top.

Corner piece with slots for mirrors

After producing the 3D-printed corner piece, I joined the mirrors together and produced a basic infinity solid. The intention with the little notches was to use them to pull the corners of the shape together — this did not work as expected and I ended up just gluing the corners in. I took a LED headdress that I had made for Halloween last year and placed it in the cube. The result was better than I had hoped for.

Vertical video of the cube

Not only did the infinite mirror effect work, it worked in broad daylight. Now that I knew the two-way mirrors worked for the effect I was going for, I felt optimistic about other shapes.

Building more shapes

I took some of the triangles and a square that I had and produced a second shape, a pyramid with square base. Because the pyramid would have more complex corners and I was still exploring and prototyping, I opted out of producing a 3D joint for connecting the edges and instead just glued together the sides.

Vertical video of the pyramid.

For this shape, I added LED lights to the base before putting the pyramid together because I knew that the mirrors would work. I also used LED lighting that would perform a cycle that would use the entire strip as opposed to repeating a pattern across various smaller strips. I experimented with more lights in the cube and produced a fun action shot.

The cube and pyramid looking awesome

When building the pyramid, I found out that gluing the mirrors together produced a number of blemishes. I had to take apart and reassemble the shape a few times and glue invariably was left behind. With this in mind, I then designed another part for creating ziptieable shapes from triangles. This shape was affixed to four triangles and I produced a triangular-based pyramid:

A triangular-based pyramid

Because the faces were easily removed and adjusted, I also opted to place LEDs along each side of each triangle making up the solid’s sides. Unfortunately, there is limited benefit to having this many edges covered in LEDs: the lights project towards other lights within the shape outshining each other.

Mapping and improving LED driver code

To explore actually mapping the LEDs to shapes, I returned to the cube. The cube will ultimately be a gift for a friend, so I adapted Android Things with the intent of being able to remotely update the device software with new features and patterns. I also had a few demos laying around that used APA102 driver for driving the LEDs so much of the groundwork had already been laid.

I had a NeoPixel matrix laying around that I decided would be fun to adapt to the board. Because it’s difficult to drive NeoPixels without PWM and level shifters, I wrote a serial UART-based driver for controlling the matrix and a companion driver for writing patterns to the LED matrix. The library is not as zippy as I’d hoped but is sufficient for minimal animations and flourishes on the matrix grid.

In my Android Things project, I adapted the matrix driver and got it working while also driving the other LEDs. My initial tests looked as follows.

Image showing matrix driver along with direct strip LED driver

The LEDs were mapped out the for “drawing up” towards the top of the shape.

Vertical video showing mapped cube

This is where I’m at today with the cube. With mapping and a solid software stack in place, it’s time to get back to cleaning up the wires on the hardware before what’s next with the software.


The following things work well when working with mirrors:

  • Scaffold the shapes using 3D printed parts, leaving some space between the shapes. This produces an interesting “laser show” effect when light emits between the spaces.
Laser show from light pouring out of the edges
  • Place lights on a single edge on the shape. This will leave a larger surface area on the mirrors for viewing and the reflections on each edge between the faces will be illuminated by the reflection.
  • Make the shapes easily disassembled while working with the scaffolding. This allows you to repair and restructure the shapes should a hypothesis fail.
  • Repeated patterns within the infinity solid do not look as good as ones that chase the structure.

The following don’t work well when working with mirrors:

  • Don’t hold the mirrors together with tape or glue. This causes “dirty” areas should you need to reposition anything. Tape can even remove the reflective surfaces from the acrylic mirrors I used.
  • Keep the wiring clean and tight, the wires distract from the show.
  • Don’t over-saturate the area within the infinity mirror with LEDs. Covering where each of the faces touch on a single side was optimal for me.

What’s next

Wrapping up the cube will come first. I’ll be making the wires tighter and covered and will be stress testing and bulletproofing the connections. With the surface now mapped, I’m ready to set up the cube for reactive effects. For example, I have an idea for a VU meter that would run up the edges and splash down onto the floor. I’ll also be adding support for rendering video and UI in the matrix before sending it to my friend.

Next, I’ll be adding power to the pyramids so they can be held and observed without wires. I’ll also make the structures much stronger as they currently must be handled with great care. Once the smaller shapes are stronger and battery powered, I will be incorporating an IMU so that the shapes can react to their positioning. I have an experiment using a Bare Conductive board that will trigger samples along with the lights in the square-based pyramid — this could be fun for building games like memory or tap hero.

Maybe I’ll make more some day that can network with one another and all share the same software stack ala Rainbow Snake. Maybe it will be a controller for Rainbow Snake, who knows.

But first, before I do any of this, it’s time to tie some bows on my demo for the upcoming talk on Cloud IoT Core at Google I/O.