A Haunted Mansion Halloween

October, 2018

This year for Halloween I wanted to build on top of the work done for last year's Forbidden Forest by extending the software control system to coordinate multiple projectors to try to build a show that was larger in scope. I also wanted to experiment with more complex projection mapping. We discussed several possible themes, including having the Dementors from Harry Potter decend on the house, or creating a time vortex where you see things behaving out of order. But we settled on a long time favorite of mine, the Disneyland Haunted Mansion.

Prototyping The Pieces

This year's project evolved incrementally. The first effect I wanted to create was to have ghosts appear in the front yard, but with no obvious screen, so I started looking at various scrim materials. Scrims are fabric screens with an open weave that lets light pass through them. The fabric can appear opaque or transparent depending on if it is backlit or frontlit. After searching around, I found a remenant section of black sharkstooth scrim from the theatrical supply company Rose Brand. Once it arrived, I set out to experiment with it in the workshop.

Learning How to Project On a Scrim

I hung the scrim in the workshop and then using some footage found on YouTube, I tested both front and rear projection to get an idea of how bright an image I could generate and the quality of the effect. I also experimented with various lighting in the room to make the scrim itself appear more transparent. The rear projection had a noticably sharper image, with the tradeoff being you could see the light coming from the projector.

Knowing that it worked in the workshop was one thing, but I was concerned I would not be able to get a bright enough image outside. Even at night our street has a fair amount of ambient light. After a trip to the hardware store for some parachute cord and clamps, I temporarily rigged the scrim in the front yard for a quick test.

The strange looks from passing neighbors and cars slowing down as they passed told me that was definitely bright enough to work.

Madame Leota

I next wanted to recreate Madame Leota, the speaking head in a crystal ball. My plan was to record someone on a green screen and map their face to a styrofoam head using a small projector, but I quickly found that you can find anything on YouTube. I used this video as a starting point and re-edited a loop that worked for what I wanted.

I ordered two different types of foam heads from Amazon to try and a large acrylic sphere for the crystal ball. I found the male heads worked better, but they it had to be split in half to fit it into the crystal ball and then reassembled with pins, sort of like building a ship in a bottle.

The first tests worked far better than I expected.

The Raven

In the Haunted Mansion, the raven appears in several locations, including the seance scene with Madam Leota. Using a raven ordered from Amazon and some LED lights, I made a raven to perch in a tree near the crystal ball.

The Signing Busts

Excited from how well the Madame Leota effect worked, I decided to add a third component to this year's show and build the signing busts from the graveyard scene of the Haunted Mansion. Crawling YouTube I found another amazing gift that meant I didn't need to green screen my own video. I neede four additional heads, but as with many things on Amazon, it was cheaper to order a case of eight. Once armed with more foam heads than I will ever know what to do with, I set out to see if I could align them in a way to get the video to line up from a single projector. I temporarily used a bunch of scrap wood to find the right heights and angles to make it work.

I then made small stands from wood that would be painted to look like stone pedistals.

The Director

For each project I typically fork the set of python scripts I've built over the years to quickly build what I need to coordinate each show because I've never had the time to step back and build the generalized system I've envisioned. Although I didn't have time this year either, I did take the next step to start the process. This year there were many independent systems to coordinate so I took some time to improve the software into a system called Director.

Director is a python application that loads a Script, which can contain one or more Scenes. Each Scene lists a series of Cues that are given to Actors. Every Actor is it's own program, optionally running on a different computer on the network, that can perform specific tasks. The system has Actors that can:

  • Play audio
  • Play video
  • Control a Philips Hue Light
  • Control a Samsung Smartthings device
  • Control Raspberry Pi GPIO for custom hardware or lights
  • Custom code triggered in a Unity GameObject
Actors can run on macOS or Rasbian Linux for Rasberry Pi.

Because Actors can fail, break or run into problems, the Director knows how to skip cues for Actors that don't show up. Also, to driving timing the director can choose to wait for an Actor to finish performing their cue before advancing or it can call multiple Cues in parallel to let Actors run at the same time.

Getting software updates to each Actor with the latest audio and video files is tedious, so each Actor patches itself with the latest released code from Github when it boots. Also the Director serves the needed media files to each Actor to perform each Cue.

The code is still pretty hacked up, but I hope to find time time some day to take one more pass to clean it up and open source it.

The Graveyard Band

The next step was to create the actual ghosts to appear in the graveyard. Originally I planned to record people in costume and use looping video for the ghosts, but as I started scouring the web for photo references, I realized I might be able to use the photos themselves. I ultimately found an extensive collection of photos and then selected a few to extract out the individual ghosts from the background in Photoshop. I ended up with the musicians, the opera singer, and the king and queen on the seesaw.

Once I had the individual ghosts, I used Spine to rig and amimate them (after a quick tutorial from the artists at work) and placed them into the Unity scene I created for the graveyard. I also filled out the rest of the scene with gravestones from the Unity Asset Store.

Tech Tests

I've struggled with previous projects where everything works just fine in the workshop, but fails to function when I install it. This year I did several night time technical tests to ensure everything would work and I made several improvements along the way as a result. For example, I found the projected graveyard ghosts needed to be much brighter than I expected to get the intended effect when projected on the scim. Also, I originally planned to use rear projection from a six foot tall stand because the workshop tests showed the image was sharper when projected from behind. However when I tested, I could not get the projector high enough to avoid having the light shine directly into your eyes as you walked up the front path. Ultimately I moved the scrim much further back from the path to the other side of the yard and built a box to conceal the projector so it could front project.

One challenge that ultimately did affect the final show was getting the proper audio sync with the various animations. The Director called animation cues that are supposed to sync to the signing ghosts and other animations. At my desk I was able to get these to sync perfectly but when installed there were often several hundred milliseconds of delay, which is quite notacable. Although I improved the timing during these tests, it was never as good as at my desk.

Show Time

The night before Halloween I did one last technical test and invited some friends over to watch me stumble through the final setup. Up to this point, I had tested each show element individually but I had never run all of them together. Getting everything set up took longer than expected, but ultimately I got everything running.

Halloween night prooved to be a success with at least 400 kids coming to trick-or-treat. Excepting the audio sync bug, everything ran perfectly all night and I was quite happy with the results!