Billiards Ball
Creative Goal
This sequence is the moment when the film’s tension shifts into a full-scale impact.
It was inspired by The Slow Mo Guys’ high-speed billiard ball collision experiment.
I aimed to express the catharsis and visual beauty that a short physical impact creates within slow motion.
In the overall structure of the film, where different sequences are linked by emotional rhythm,
I intended for this scene to feel like a moment where tension is explosively released.
Pre-Production
Reference : The Slow Mo Guys – “400MPH Pool Break with a Cannon at 80,000FPS”
Production in Houdini
Overall OBJ Node set up
*All setups in this scene were built by me. The node workflow was custom-made for this project.
Pre-Simulation Scene Setup - (1) Setting Geometry
I modeled the desk in Maya and brought it into Houdini for simulation, with UV unwrapping support from Jae Chae(SVA 3DAnimation&VFX 26’).
Generated custom points with an Attribute Wrangle to define the triangular billiard ball layout.
Assigned custom orientation values to each point to control the individual rotation of the balls before simulation.
Copied the billiard ball geometry onto the generated points to create the initial rack setup.
For the initial billiard rack, I generated a triangular point layout using an Attribute Wrangle, then copied the ball geometry onto those points.
I also assigned custom orientation values to each point so that every ball could have its own rotation before entering the simulation stage.
Pre-Simulation Scene Setup - (2) Pre-fracturing
In the pre-fracturing stage, I focused on two main points.
The first was making sure there was a clear difference in fragment size between the impact area and the surrounding areas.
The second was creating fracture shapes that looked visually appealing while remaining stable for the simulation.
To achieve this, I first converted the ball into a volume and used a *volume vop to increase the density in specific areas where I wanted more fracture detail.
Based on that density, I distributed points to create size variation between the impact area and the surrounding regions.
Then, using the *Voronoi Fracture node, I extracted only the inside primitives from the fractured pieces to define the internal fracture surfaces.
I added subtle surface variation with a *Mountain node to give the fractured areas more natural detail.
At the same time, I ran the geometry through a cleanup process using *Fuse, *Clean, *Remesh, *Boolean, *Divide, and *Normal nodes,
so the primitives could be managed and processed more stably throughout the simulation.
Simulations
let's dive into the simulation section.
(1) RBD
First, I'll explain how I prepared the RBD assets before bringing them into the DOP network.
For the fractured billiard ball and cue, I generated optimized collision geometry using Convex Decomposition,
then converted them into Packed Primitives for efficient Bullet simulation.
I also created adjacent-piece constraints so the fractured pieces would behave as a single rigid body until the impact force was strong enough to break the constraints.
For the desk, I isolated only the geometry required for collision and prepared it in the same way using Convex Decomposition.
Next is the DOP network.
I imported the target ball, cue, and rest balls as separate RBD Packed Objects.
All objects use Create Convex Hull per Set of Connected Primitives as their collision representation,
allowing the Bullet Solver to calculate collisions more efficiently and stably.
I then adjusted the density, friction, and bounce of each object to achieve the desired look.
One of the key parts of the DOP network: the use of POP Wrangles. Since this shot starts from a static state and the collision occurs at a specific moment,
I controlled the activation timing of each object. I also assigned an initial velocity to the cue ball at the designated frame so it would naturally strike the target ball.
Next is the constraint setup. I first generated constraints between adjacent fractured pieces using Connect Adjacent Pieces.
Then, I used an Attribute Wrangle to set the required constraint attributes. After merging the constraints,
I passed them into the Bullet Solver through a Constraint Network.
Finally, I used the Primitive Intrinsic transform attribute to correct a few pieces that exhibited unwanted motion.
This is the final base motion that serves as the foundation for all the following simulation layers.
Next, I'll use a POP simulation to generate secondary and tertiary debris, building additional layers on top of the base RBD simulation.
I used the RBD simulation as the debris source so the particles inherited the emission position and velocity.
Then, I used the billiard balls, the desk, and the existing RBD fragments as collision sources, allowing the debris to interact naturally with the environment.
Finally, I instanced the debris geometry onto the simulated particles.
And It’s being updated every day!!!!