Kung Fu vs. Zombies – Making Infinitely Scalable Action Movies

Before we start, here’s Kung Fu vs. Zombies for your viewing pleasure.

The premise behind our short Kung Fu vs. Zombies was simple – pay homage to the iconic alley fight scene from Big Trouble In Little China.

Inspiration for Kung Fu vs. Zombies
John Carpenter’s Big Trouble In Little China (1986) – Chang Sing vs. Wing Kong

(If you haven’t seen Big Trouble In Little China yet, please do. You’ll thank me later. It’s on Amazon for a dollar as I write this.)

When watching the clip above (there’s no spoiler in it, don’t worry), there are about 20 different fights happening at once. The fights that we focus on are in the foreground, but there’s a lot happening in the background that fills the scene out beautifully. We’re not supposed to focus on the background fights… but I can’t help myself. They’re hilarious.

Check out the fight in the background
Choreographer: “Alright everyone, even though you’ll be in the background, I want your fight scene to be intense and fast-paced.”
Stuntman with the hatchet: “Whatever, man, nobody’s gonna be watching us.”

Still, anyone who saw this scene ages ago was blown away by the amount of action happening on the screen. We wanted to make that. This would require building a set, hiring 50 martial artists, and shooting for 3-5 days with a crew of 30. Total budget: $100,000 USD on the low end.

Or, we could motion capture the entire thing with TWO martial artists and a crew of THREE. We could get an awesome location on the Unity asset store for $50, buy a couple character assets, and shoot the entire thing in two days in a motion capture volume. Our version would have a twist: the kung fu heroes fight against a zombie invasion in Chinatown. We could even bring in a dragon and a giant zombie that we could climb on. To make it a true homage, include a Jack Burton walk-on at the end.

When we started motion capturing Kung Fu vs. Zombies (KvZ) we didn’t even have a location in mind. We just knew it had to be a Chinatown alley. I’d deal with that later. I had Dennis for a day, so we just started shooting.

We started with the lineup, an iconic Western-style standoff that kicks off the scene. We did 16 or so takes for both sides, including the run up. We only had enough run distance to get a total of 2 steady run cycles, but this is enough when bringing it into post.

Kung Fu vs. Zombies mocap shoot

We then shot a ton of fight scenes. Dennis and I have worked together for over 15 years. Ever since Contour, we’ve figured out how to move together so easily that we can complete each other’s (physical) sentences. Choreography isn’t even really a process. We just move around and it becomes fight choreography. Sometimes I’d be the zombie, other times he’d be the zombie.

Eric and Dennis motion capturing the action in Kung Fu vs. Zombies

The goal, again, was to shoot everything the way John Carpenter did. I’d put every fight scene happening consecutively in the same location and just shoot vignettes, so the entire location would be chock full of action constantly. All the background action is just a repetition of what you see in the vignettes, but the audience is engaged, so they’re only watching the foreground stuff.

Some of these fight scenes were shorter than others. This would become a problem later on.

We then shot the giant zombie scene. This is the tentpole of the whole piece, the “Bad Guys Close In” segment to use Save the Cat terminology. Dennis acted out some basic navigation. We simulated the giant zombie eating one of the characters, which was just me sitting on a barstool, and also did some ladder climbs so we could have some characters climb the giant zombie leg.

Lastly we shot our Jack Burton footage outside. The Xsens system works off a router, as there are no cameras. I went out of range but that didn’t matter, since the suit buffers all the capture and loads it onto the computer once you go back within range.

Post-Production

For post, I decided on Unity because it allowed me to quickly drop the motion capture files in, put them on the free 3D models, and not really have to mess with anything. Plus I had already tinkered a fair amount in Cinemachine in our previous 3Viz video.

When I lined everyone up in Unity, I looped the run-up animations at the crossing of the feet so that it would blend relatively smoothly. You have to tinker with the motion settings so they don’t go off at an angle, but when doing this, I could have them run forever.

A short run cycle for each character that’s repeated so our characters can cover any space we put them in

I used the original Big Trouble in Little China scene as reference and shot it essentially the same way using Cinemachine. All the shots were done manually with keyframes.

I went with these low-polygon heroes at first because they were free, plus I thought it was a cool throwback. But when we released our first and second dev diaries, people commented on the low quality assets compared to the more realistic zombie assets. In the end we purchased some higher quality character packs from the Unity asset store for $12.

Another asset that we needed before making much progress was the location itself. I bought this Chinatown scene for $25 from the asset store and spent many hours tweaking the lighting and environment to get it to look cinematic.

Then I had to fit everyone into the alley. This was redundant work because I had already positioned everybody on the blank white background. Had I started with this set, I would have been done much faster.

Yet more lighting tweaks. You really have to put an arbitrary limit on things like lighting, or else you’ll tweak it forever.

Note: I added a 24-frame pre-roll before my animations started. This allows the lighting to “kick in”. Otherwise, the first second of animation would have various lights clicking on for whatever reason. There might be a toggle switch for this somewhere in Unity but I didn’t find it.

Special thanks to Adam Myhill for the cinematic tips like adding fog and some Cinemachine filters.

What I noticed right away too was the sheer amount of swaying and unnecessary movement from the heroes. The Wing Kong and the Chang Sing were almost perfectly still, but our guys were shuffling around like we all had to pee. And I had tried deliberately to reduce this movement during motion capture, because there’s a tendency for mocap actors to add way too much unnecessary movement (neck kinks, shoulder twists, lots of nervous footsteps in place, random weight shifts, none of which is natural). Still, old habits die hard. I slowed a bunch of these down to 0.5 speed to resolve this.

After ensuring that no characters were clipping through one another or through the surrounding scenery, the lighting looked good enough, the seams in the ground weren’t too obvious (which could be resolved by raising the range and decreasing the intensity of the corresponding light source, a task that became increasingly more complex as more lights were added), I shot this scene with Cinemachine and released it as dev diary episode 2.

Since I was dealing with so many characters, each shot required lots of cheating and shifting of characters and it took many hours more than necessary to shoot this part. If I had to do it again, I could bang this scene out in an hour or two. With an actual Vcam (like Dragonfly, which we used in Cabin Fever) it might take 20 minutes.

Every camera angle was exported using the Unity Recorder package add-in, something you can add to your project for free (make sure you select “Show Preview Packages” in your package manager window). I only exported mp4 files, which are relatively low quality in Unity Recorder, even when the quality is set to “high”. Adding an image sequence export option would have concurrently exported a PNG sequence, which could have been stitched together into a beautiful 422 ProRes file in Media Encoder, something I didn’t do until the next scene.

Movie export settings in Unity Recorder
Image sequence export settings in Unity Recorder

Another mistake I made in this scene was failing to make a proper hierarchy for my vcam assets. All the cinemachine vcams were in the root hierarchy, which was messy, but I was more concerned with just pumping shots out and getting the thing done. I assumed I could rearrange these after shooting everything, and so after I was done I stuck all the vcam shots into an empty “Virtual Cameras” object. But suddenly Cinemachine didn’t know where these vcams were located anymore, even when I re-linked them in the animation window. I would have to move them BACK OUT to the main hierarchy for the Cinemachine angles to function properly again. Still, not wanting to hamper my progress, I just tucked them away somewhere and moved on.

We felt pretty good about our dev diary. Then someone mentioned that the low-polygon heroes looked cheap, especially compared to their sleek, sinewy zombie opponents. So I paid $12 for two packs: PBR Fighters and this Ninja Pack. I spent a day or two re-fitting all the characters with their new, high-poly skins. For $12 I went from Virtua Fighter 1 graphics to PS3-PS4 quality.

Swapping high-poly characters for older low-poly characters

Kung Fu Fighting

With the lineup done and shot, it was time to move on to the fighting. My plan was to animate every fight scene as a single animation strip and layer them on top of one another and place them in various places throughout the scene. The question then became: how do I do a new timeline with all this stuff already in the scene?

I probably went about it all wrong, but it still worked. I basically duplicated all my characters and made one folder for “Fight Scenes”, where each Kung Fu vs. Zombie fight would happen, along with their associated weapons and props and effects, and one folder for “Vcams” with their camera angles.

Since each character had a parent object that could be moved about freely, I could mess with distancing whenever necessary. So when Dennis throws a kick at my stomach, we could do it from 2 feet away and I’d put a keyframe there to move the characters close together. When I grab him immediately after, I keyframe that spot and reposition the characters. It works flawlessly, save for a bit of foot sliding (which you could tweak in MotionBuilder), but the camera rarely looks at the feet. This is the benefit of havirng control of your camera and style. You don’t have to worry about making everything look perfect: just shoot the stuff that looks good and cheat the rest.

Fudging character distance in the Unity timeline

Lots of the fights had swords. We should have done prop capture, which would have made for less work and more realistic looking weapon animation. Instead I had to hand-key all the weapons, though parenting the weapon to the characters’ hands makes this relatively painless.

Some fight scenes were shorter than others. If a background fight suddenly ended, the characters would vanish. I’d catch this most of the time, but sometimes there’d be a distant fight scene with a disappearing kung fu fighter that I didn’t catch until much later into production.

To resolve this, I would go into the vcam animation track group and add an “Activation Track” for the background fight in question and make sure that it was deactivated on a camera cut. Some fights mysteriously disappear between shots, but at least it’s not mid-take, and nobody will notice this stuff.

Activating and deactivating characters per virtual camera in Unity’s Cinemachine

Vcamming all the fights was fun. Shooting and editing is where you can make action really sing. We had all these shots and edits basically planned in our heads as we were motion capturing them, so this part went smoothly.

We don’t shoot coverage-style, which would mean shooting the entire fight from multiple angles and then editing it together later. This shooting-editing style tends to come off as unintentional, but we wanted every shot to have a definite meaning, like a proper kung fu film. We pop off particular shots for particular action, even if that means doing 1 move in a camera setup. This was the Sammo Hung style, which negates the need to repeat action over and over and risk injury. Sammo’s impact-heavy style meant that stuntmen would be subject to wear and tear, so he’d pop off a couple takes of only that action, call it good, and never do that action again. I call this performer-economy since it doesn’t exhaust the performers.

Performer-economy shooting style, with zero coverage
From Sammo Hung’s Pantyhose Hero

In 3D, we’re tempted to over-shoot because it’s free to keep popping off angles. There’s also the perverse incentive of repeating choreography in different angles and attempting to sell it as different action, but we believe in disciplined shooting and maintained this same performer-economy style. In keeping with a rhythm Dennis and I have developed over the years, we would typically do 3-5 camera setups per action vignette, for a total of about 120 vcam shots for the mass-fight scene.

The entire short has the same motion blur. I shoot my live-action fights with a 1/50 or 1/60 shutter, or 1/120 if there are weapons involved (though for this short I never changed it). Strobe-y fight scenes shot with a 1/500 shutter are visually strange. This trend took off after Gladiator, where it was used to effect with the weapons and cool production value, but for some reason cinematographers and directors decided every fist fight needed to also look like Gladiator. The naked eye has a natural motion blur that registers movement to the brain. If your fight has a strobe-like quality, the brain might register the images, but without motion blur, the viewer requires more processing power to string these images together and process the fight scene.

Strobe-y fight scene from Fast & Furious 7 (2015)

Another issue with a strobe-like effect in a fight scene is that contact lines get compromised. A punch across the face shot at 1/50 shutter creates a pleasant motion blur, which allows the performer 2-3 frames of leeway to react in time. But at 1/250 or 1/500 shutter, the punch will be on one side of the face, then the other side of the face, with no blur. The audience will wonder why the impact is off, and it’s because there was never any contact.

So, I applied the Cinemachine motion blur filter to the global camera profile so it would never change.

I had the option of vcamming everything with the Dragonfly vcam, but unlike in Unreal’s Sequencer, there was no obvious way to edit these vcam shots in Cinemachine. Dragonfly works much better in Unreal. There’s also the Expozure vcam system, which is super high-grade, but we weren’t ready to transition by the time we started working with that one. We’ll use Expozure for the next short.

I should have put the vcams in the same folder as the fights themselves, because then if I moved the fight, the cameras would move with them. Instead, whenever I moved a fight, I’d have to move the cameras independently as well, which messed up all my shots.

Benefit of having vcam shots in the same folder as the corresponding action

Some ideas had to be thrown out, such as some bone breaks, which would have required some MotionBuilder work, as well as dismemberment, which would mean editing the 3D model in Blender or some other 3D tool to show the cross-section of the removed limb. The choreography never really called for this, and it was too technical for me. Maybe next time.

Next time, we will do finger capture. This would have been a huge help to the animations, and as it is we only did minimal finger adjustments for the “Hung Gar hands” portions, another nod to Big Trouble In Little China.

Paying homage to the Chang Sing hand signal (“Hung Gar hand”)
Big Trouble in Little China 1986

After an internal viewing, the Sumo stuff stole the show, so we added some shots for him on a pickup day. We also added a comedy bit with the red ninja’s shuriken (Dennis’s idea) and the rhinoceros smashing a zombie into a sign. This was accomplished with a series of 3 animations blended together.

Zombie Giant

In theory, adding a giant to your scene is pretty simple. Just mocap your actor, compensate for his size (maybe 10 meters translates to 50 meters in the 3D scene), and slow him down a bit. We fit the giant zombie into the scene without much of an issue, but I realized that he’d collide with all the Chinese lanterns I’d hung in the scene. I tried to animate them so they’d fall down, but it looked crummy. So, like any good filmmaker, I just cut away and added off-camera effects.

We barely had enough of a “scared run” cycle, and only 4 of them at that. We should have captured 16 of them, and tripled their length. So whatever you see is all that there was. You’ll see some characters begin to stop, but I tried to cut away to avoid showing this.

Climbing up the giant zombie legs was relatively simple. I parented the ladder climb animations to the zombie leg and compensated for the pant leg depth. In the end it looks okay. It would have been even better to animate the heroes’ legs dangling more and swaying with the motion of the walk cycle, but for a cheap edit job this worked pretty well.

Parenting a character animation to another character’s leg, with keyframe editing on the transform properties

We planned for a dragon to enter the scene and didn’t think much more of it. It turned out to be pretty simple, as the dragon cost us $15 on the Unity store. There was a built-in effect for the fire, but I couldn’t get it to work, so I had to build my own using the particle generator. I also parented a similar fire effect to the giant zombie’s head for when he goes down to the ground.

Using Unity’s particle emitter to create a dragon flame

After spending a bit of time learning particle systems, I figured I’d try my hand at making blood effects too. This turned out to be a huge ordeal. I tried purchasing two blood asset packages, neither of which worked. There was no clear-cut tutorial on making a blood particle system. So I tweaked and tweaked, probably for a total of 10-16 hours, until something looked acceptable. Even then, the blood has no collision properties and falls through the floor, so this would have to be (again) hidden with camera and editing.

Using Unity’s particle system to create blood effects

Still, once the blood was made, it was easy to replicate it everywhere. I could easily make splatters for the Sumo attacks, and by parenting a blood particle system to a character, it will follow them around. These really add to the scene and I’m happy I invested the hours.

For the final Jack Burton cameo, I didn’t consider the fact that we’d actually have to find a character that resembled Jack from Big Trouble In Little China. And it turns out there’s nothing out there, nothing even close. Also, creating the iconic Jack Burton tanktop was way beyond my pay grade, so I used Adobe Fuse to build a Jack wearing his simpler cream-colored poncho in the beginning of the film.

Jack Burton created in Adobe Fuse and the $5 truck from the Unity store
Jack Burton, late to the party as usual

Getting your Fuse animation into Unity isn’t a simple task. First I exported it to Mixamo, which generates the rig. However, this skeleton isn’t prepared to run the Xsens mocap animations we had. Our MotionBuilder tech Mike Foster rigged it up in MoBu and made it ready to go. Still, importing the character into Unity results, for some reason, in the textures being set to transparent. So I had to extract the textures and reapply them to all the body elements. Then we had Jack.

I spent about 2 days on sound design. I have a very fast process for doing sound that I developed when doing previz on Heart of a Champion where I can bang out sound designs really quickly. It involves a lot of hotkeys and organization techniques. I’ll write a separate post about that someday. I also nested each character’s sound effect group and created sequences from those and dropped them in as background sound whenever I wanted to fill in some ambient fight sounds.

Sound design and mix done in Adobe Premiere

Mark R. Johnson handled all the titles. We went with the Carpenter style for both the intro and final credits using the Albertus font. And JP Franco created our thumbnail.

Final Takeaways

I learned about 6,482 things doing Kung Fu vs. Zombies, but here they are narrowed down to a top-8 list:

  1. You can make crowds really quickly using motion capture.
  2. Unity assets are cheap and they have everything you could ever want on the asset store.
  3. Cinemachine looks great but takes time compared to using DragonFly iPad-based vcam. (Unreal’s Sequencer takes arguably as much time as Cinemachine.)
  4. Making a single blood particle system is hard, but once you invest in making it look right, you might as well use it everywhere.
  5. If Unity had nested timelines like Sequencer, it would be a far more competitive filmmaking tool.
  6. Organize your vcams carefully when using Cinemachine. If they’re intended to move around with the action, parent them under the same object. Do not start editing your vcams until your hierarchy is set!
  7. Adobe Fuse is a powerful tool for making quick character models, but you’ll need to tweak it in MotionBuilder before it’s ready for an Xsens mocap animation.
  8. When exporting using Unity Recorder, if you’re exporting a clip that starts 2 minutes into the sequence, Recorder renders everything, rather than just skipping to that 2-minute mark. Recorder is solid, except for this one issue.
  9. All the cool people have seen Big Trouble In Little China. Have you?

    and finally…
  10. Learning that we could make a full-blown action movie using nothing but some motion capture suits and a Unity scene changed how I see filmmaking. This kind of movie would have been impossible 10 years ago, but as storytellers we have all the tools we could ever want to make whatever we want. I look forward to seeing how Unity, Unreal, and Maya get utilized by the indie filmmaking world, because today, there’s no longer a barrier to entry to telling a story. Just learn the tool and start making stuff.

Many thanks to the people who have kept watching our projects over the years. We believe the action of Kung Fu vs. Zombies and the ease of creating it is a sign of things to come.