3D printed Zoetrope

For World Makerfaire (NYC) this year I created this 3D-printed zoetrope, dubbed “Ponytrope.” It creates an animation of horses galloping in a circle.

Old meets new

A zoetrope is a pre-cinematic animation technique where a series of animation frames are placed inside a spinning cylinder. Slits in the drum make the frames of the animation visible for only a fraction of the second, as it spins the frames blink in and out of view with the passing of each slit.

My 3D zoetrope relies on the same principles but instead of flat 2D frames I am using 3D models and instead of the slits I use a strobing LED light to illuminate each frame for a fraction of a second. The strobe and slits are necessary to freeze the frames, otherwise you would just see a blur.

This technique has been used by others in the past including the Toy Story zoetrope at Disney’s California Adventure. The first time I saw the technique was Gregory Barsamian’s piece “Die Falle” (The Trap), at the Museum of Glass, in Tacoma, Washington. Seeing a three dimensional animation in person for the first time can be a bit unreal which is part of the reason I wanted to share it with the crowd at Makerfaire.

Modeling the horse

Horse model overlayed with armature in Blender
To animate the horse model an armature is need manipulate the mesh.

I began the project by modeling the horse in Blender. Blender is a 3D animation software designed primarily for film and game character modeling. It has a reputation for being difficult but I find it no more difficult than other pro modeling software. It has a few features for 3D printing preparation as well.

After modeling a standing horse, I used Blender’s rigging features to allow the horse to be easily posed for each frame of the animation. This feature is great because if done correctly, you can move the armature and the form of the horse naturally follows.

If you are familiar with photographic history, Edweard Muybridge’s photographs of a galloping horse are one of the earliest examples of high speed photography. Muybridge’s photographs are easily found online and served as a great reference while I posed the frames of the horse animation.

Prepping the models for print

Original horse model and split version for printing.
Modifiers were added to the model to provide a mounting point and split it for printing.

Because Blender is designed for animation it was easy to simulate the horses movements before printing the models. Exporting each frame of the animation as separate STL files for printing is less convenient as it has to be done manually frame by frame. Thankfully, it has a great Python-based addon engine that so I could automate this process.

Instead of printing the horse whole, I cut them in half to reduce the support structured needed to print. You can apply a boolean modifier to the base model in Blender and it applies to all the poses in the animation. I used another modifier to rotated the two halves so the cut side would lay flat on the print bed. Doing all this in Blender saved me a lot of cleanup work with the final print files.

Designing the motor housing and central hub.

Motor mount and hub in OpenSCAD
The motor mount for the zoetrope was designed in OpenSCAD.

The horses are mounted on a spoked hub that spins on a motor mounted with the axle facing up. I designed the hub and motor mount in OpenSCAD instead of Blender.

While Blender is great for organic forms and animation it is not as great when precise measurements are needed. OpenSCAD is much better for this and because it is parametric I can tweak the design if it turns out a part is a little to big or small.

The spokes coming from the hub in the horse were made from basswood sticks I got from the art supply store. Basswood is so soft if you make the holes a little tight you can push the horse on and get a nice tight fit.

The basswood also proved useful when the zoetrope was bumped by a child on the second day of the fair. Rather than a vital part like the horses breaking the weak basswood snapped and was easily replaced with spares in about a half hour. (With help from Mandy Stultz, thanks!)


The whole piece is controlled by an Arduino with a relatively simple sketch. In addition to the Arduino itself I soldered up a protoboard with some mosfet transistors for controlling the motor and high power LED. The LED circuit is based on this instructable by Dan Goldwater.

There is a hall effect sensor in the motor mount which changes state when a magnet embedded in the hub passes over. A potentiometer is used to dial in the speed of the motor and a push button temporarily turns off the zoetrope.

Determining speed

In order to get the animation effect the strobe has to be timed to the speed of the motor. There are twelve horses in the animation so the strobe should turn on once for each horse or twelve times per rotation. You can actually play with this a bit and get the horses to move backward or forward by increasing or decreasing the number of strobes per rotation slightly.

Once the speed is known the rate of the strobe can be set. While the time between strobes is variable I left the duration they are on at a constant one thousandth of a second. If the light is on for too long the horses will show some motion blur, just like if you use a slow shutter speed when taking a picture of something moving fast.

This short duration is also why the high-power LED is needed. A normal LED might light the horses when on constantly but when strobing on for twelve thousandths per revolution you need something bright to compensate for the low duty cycle.

Using interrupts

Rather than polling the hall effect sensor constantly to get the speed I used an interrupt function. While slightly more advanced than basic Arduino code, using interrupts is pretty straight forward.

You register the interrupt by determining which pin the interrupt will be on, what function to execute and what change in the pin to look for. I chose falling which means that every time the hall effect sensor goes from high (5 volts) to low (0 volts) the Arduino will stop executing the main loop and execute the interrupt function instead.

The interrupt function just checks the time since the last time it ran and then calculates the speed the motor is spinning.

The strobe is handled in the main loop. This too could possibly be handled by a timer based interrupt but I didn’t have time to explore this before the project needed to be finished.


Arduino code

Blender addon for exporting animation as STLs