October 8, 2017

Making an Infinity Mirror

An infinity mirror is a cool visual effect where you can make a small disk look like an infinite tunnel. We can achieve this taking advantage of the fact that a transparent but reflective surface (a so called ‘2 way mirror’) between a dark and a well lit space will appear transparent on the dark side, but behave like a mirror on the lit one.  By having a string of lights in an enclosed space between a mirror and a 2 way mirror, much of the light will bounce between the two surfaces before escaping out the 2 way mirror, which to an onlooker generates the effect of a long tunnel.

In my previous attempts to make one I was stuck at finding a surface container which is the right size for both a mirror and a piece of acrylic or glass to fit well and snug with the right amount of space for an LED strip between.  But this problem is easily solved 3d printing a container to precise specifications and using the laser cutter to cut a piece of acrylic to size.  This makes this an exciting project because we get to use a variety of tools in the lab towards one goal.

Theory behind infinity mirrors.

Contrary to popular belief, there is no such thing as one way glass.  There is no surface that allows light to pass only in one direction.  Nevertheless, we can achieve a similar effect.  This is the effect we see, for example, in a cop show interrogation scene, where observers can be in a dark room behind a mirror hidden from view, but still are able to watch the interrogation through the mirror.

The trick is to have a partially reflective piece of glass, so that, say, 70% of the light reflects, and the other 30% passes through.  Then to have one side brightly lit, and the other much darker by comparison.  An observer on the dark side would see the 30% of the light in the bright room passing through the mirror overwhelming their own dim reflection, and therefore the glass would appear to be a mirror.  On the other hand, and observer on the bright side has 70% of their own bright reflection overwhelming any light passing through from the dark room, and so the glass appears to be a mirror.

We take advantage of this effect in making an infinity mirror.  Here we put a string of LEDs between the mirror and a partially reflective piece of acrylic.  When the light hits the partially reflective acrylic, 30% of it passes through appearing to be the top layer of lights, the rest bounces down and back up, and 30% of that passes through appearing to be a layer below.  This continues giving the appearance of layers of lights fading into the distance.

(image credit)

The cylinder.

As mentioned above, making sure the cylindrical case, mirror, and reflective acrylic all fit together is a main challenge.  But with the 3d printer, we can design and print a case that perfectly fits all the necessary components.  I chose to do this in Rhinocerous, but I’m sure the process is similar with other software.

Since the Glowforge can’t cut mirrors or glass directly (I have yet to experiment with scoring and breaking glass with the Glowforge), it seems easiest to buy a circular mirror and print the case to match the size.  I went with this relatively inexpensive set of mirrors. For this first prototype we use the 6″ diameter mirror.

Since the case we are building has radial symmetry around the vertical axis, we should just be able to draw an unbroken line and build a surface of rotation.  I started 6 inches from the center, and went up, adding a groove for the LEDs to fit in, and a lip at the top for the 2 way mirror to sit on top of (this lip doesn’t need to be too precise, as we will cut the acrylic to size, but we should record the radius).  Next we rotate around the z-axis, and there is our container! I added fillets to round out a few of the edges to make it more visually appealing.




Then we send it to the printer!

Preparing the 2 way mirror.

After throwing in the lip, the top of the bowl had a radius of 78mm, so in Inkscape we make a circle of 156mm diameter.  The hope is that the laser would cut at the circle, and give us an acrylic disk of slightly less that 156mm diameter, so it would fit in the top of the bowl, but sit on the lip.  Upload the file to the GFUI, put clear acrylic in the Glowforge and cut out a perfect circle.

This ended up cutting a disk that fit a bit loosely in the bowl, but the lip we built in holds it up, and a bit of glue at the end should keep it snug.  Now we need to make this transparent piece of acrylic into a partially reflective surface.  The most affordable way to do this is to use reflective window tinting film.  This is perhaps the most annoying part of this project.  Start by cleaning both sides of the acrylic disk to remove any fingerprints and streaks, then apply the film as best you can.  I haven’t found any surefire way to do this yet, it took me 4 or 5 tries to be satisfied, and even then, I had to iron out the extra air bubbles with a makeshift squeegee.  Once satisfied, trim the excess film.


Whats left should be a partially reflective, partially transparent surface!

Preparing the LEDs.

We want a strip of lights to go around the edge of the cylinder.  To minimize the amount of soldering and programming involved, I decided to go with an addressable LED strip.  Any flexible LED strip should do, but the wiring and coding will be slightly different.  I went with this one.  Each light can be individually controlled in this strip, and you can cut between any lights which makes it perfect for trying to acheive a specific circumference.  It also can run the adafruit neopixel library when hooked up to arduino, which allows for easy control of each individual light with minimal programming.


Cut a 14 LED length (a bit more than 18 inches), making sure to cut along the marked lines.  Then solder jumper cables to the GND, 5V, and DI (digital in) side of the strip.  The digital chain goes only in one direction so it’s important to make sure you aren’t soldering on the DO (digital out) side.

Then I connected the GND and 5V chords directly to the ground and 5V pins in the Arduino UNO, and run the digital signal through 300-500 Ohm resistors (I put two 220s in series), to prevent damage to the first light on the strip, and then into one of the digital pinouts of the arduino (I think most of the available code uses pin 6).

(image credit)

Finally we just run one of the preset neopixel test codes to test out the strip!


The final assembly is now fairly simple.  Since the LED strip is going to sit between to mirror, the bowl will need a hole through which the electronics can be connected to the arduino.  So we drill one.

Next we clean the mirror to remove any fingerprints and streaks, and lie it flat at the bottom of the bowl.  It is important that the mirror lie as flat as possible, or else the infinite tunnel will appear to be curving away rather than straight.  It turned out to be a little too big, so I had to sand down the edges of the mirror, but then it fit snug enough that it didn’t need any glue, helping the flatness.

We then string the wiring through the hole, and let the LED wire wrap around the inside of the bowl, using small bits of hot glue to affix it to the sides.


Finally we put the 2 way mirror we build on top, wire it up, plug back into the Arduino, and we’re good to go!