Passage
Kevin Peter He
Passage is an audiovisual live cinema performance. Using a sculptural camera controller, the artist navigates a virtual forest in real time: an unbroken, hour-long take that unfolds as both film and performance before the audience. A collaborating musician scores the journey live, responding to shifts in light, camera work, and terrain, creating a dialogue between image and sound.
Project Breakdown
For this project I was tasked with building two principal real-time VFX systems for Passage. Both effects are elemental in nature and both had to be fully procedural and controllable from within the scene.
This was one of the most challenging projects I’ve been a part of, and also one of the most rewarding. It pushed me to learn new techniques in both Unreal and computer graphics in general. Working with Kevin and the team on this produced something I’m genuinely proud of.
Fire
The first was a forest fire system. The fire needed to be spreadable and directable, affecting the scene in two layers. The flames themselves are a particle system that spreads across and consumes the trees. Below that, a tri-planar projection effect handles the environment, scorching the ground and surfaces as the fire moves through. The whole thing is controllable in terms of spread direction and intensity.
On the technical side, this pushed me into fractal Brownian motion for the flame behavior and algorithms like jump flood and diffusion limited aggregation to drive how the fire propagates through the scene.
Lightning
The second system was a procedural lightning effect built entirely in Niagara. The goal was to generate fractal lightning shapes that could be spawned from different points in the scene and ultimately coalesce into a cinematic ending strike that relights the sun in the sky.
This one was heavy on trigonometry. Building a convincing branching lightning system that looks natural but is still fully controllable from arbitrary spawn points was a real challenge. Every branch, fork, and arc had to be procedurally generated while still converging on a target.