This was a passion project that escalated quickly. Becca and I decided to dress as Jack Skelington and Sally for Halloween this year.
But I quickly became convinced that I could make a much better mask than this if I 3D printed a Jack Skelington model.
And if I'm going to print it, I might as well design it for rear projection and mount a mini projector inside so that I can animate Jack's face.
And if it's going to be an animated mask, it would HAVE to animated in real-time using live facial tracking. Right?
Give a mouse a cookie... or Kyle an idea...
Unfortunately, I didn't make it in time to build the mask. But this exercise did give me a great opportunity to play around with Live Facial Capture using Apple's ARKit. I used Blender to produce the model and blendshapes, ported the model into Unreal, and used Live Link Face on an iPad to produce the video below. I tried a number of alternatives, including MeowFace, iFacialCapture, and a couple of options to capture face motion directly into Blender. But the best tool overall was Live Link and Unreal.
- Model Jack Skelington in Blender with clean edge loops.
- Create the 52 blendshapes for ARKit facial tracking. (I even included the classic Tim Burton sandworm as a tongue)
- Port the animated model to Unreal 4.26
- Configure the Animation Blue Print to map the facial animation to the feed from Live Link Face.
- Run Live Link Face on an iPad. I turned off the face mesh overlay because it seemed to be causing a lag in the feed.
There is still quite a lot of work to do to make this idea work, but I have most of the materials, and it is really just a matter of finding the time to work on it.
- Refine the Jack Skelington head model for 3D printing.
- Modify the mask for mounting the mini-projector inside
- Modify the mask for mounting an iPhone camera extender inside
- Print the mask.
- Wire it up to a laptop in a backpack, or preferably a mini-playback device such as a Steam Deck or Windows Surface.
There are some obvious challenges that I just won't be able to resolve until I confront them in real-time: