You are on page 1of 14

Madison McElfish

CG396

Procedural Chandelier Process Paper

Contents
• Project Overview
• Geometry
o Rings
o Gems
o ROP Geometry
• Chain Set Up
o Creating lines
o Chain Subnet
• VDB
• RBD Fracturing
• Constraints and Solver
• Future Milestones

Project Overview
This project is a destruction simulation in Houdini. I plan on destroying a chandelier using a controlled
fireball explosion. This documentation currently includes only the first milestone. Planning
documentation for this project can be found in the “planning” portion of the project on my website.

Geometry

The first step in this process is creating the chandelier geometry that I am going to destroy. There are a
couple components that go into creating the model.
Madison McElfish
CG396

Rings
The ring construction is simple. I started with 2 extruded circles that represent the size of the ring and
the size of the cutout. I used a Boolean Node to subtract the smaller cylinder from the bigger one to
make a ring. I added detail by using PolySplit Nodes to add edge loops and inset the interior faces. I then
added bevel with a Bevel Node. Looking forward, I will want the ring to be made out of wood and
splinter like wood when it fractures. To get more accurate texture layouts and fracturing I split the ring
into 4 quarters using a Boolean Shatter Node. Below is an exploded view visualization.

I then brought the ring to the height I wanted my chandelier to be at using a Transform Node. I
duplicated the rings using a Copy and Transform Node to duplicate and evenly space the rings to
represent the number of tiers I wanted in my chandelier.
Madison McElfish
CG396

Gems
The gems I modeled from primitives I’ve extruded. I made 3 basic gem shapes and arranged them to
form a single gem chain.

I then created points that I will copy my gem chains to. I took the circle from my original ring and used a
PolyFrame Node to ensure all the normals point towards the center of the circle. I then resampled the
number of points to how many chain points I want in my ring. I then scaled it to be slightly inset in the
ring. I then took those points and used a Copy to Points Node to copy my chain geometry to each point.

I used a Copy and Transform Node to duplicate the ring of chains to match how many tiers I want on the
chandelier.
Madison McElfish
CG396

ROP Geometry
I merged both the rings and the gems and fed the combined geometry into an ROP Geometry Node and
saved it to disk. This improved my loading times as I progressed.

Chain Set Up
The chain systems are created by copying chain geometry in a specific way along lines.

Creating Lines
The first line system I created was the support chains at the top of the chandelier holding the entire
structure up.
Madison McElfish
CG396

To do this, I started with a circle that aligns with the top of the uppermost ring. Then, I resampled the
points to be 4. (I later reference the number as an adjustable parameter for number of chains.) These
points will represent where the chains connect to the ring geometry. Then I set up a top point where all
the chains would converge. To do that I just singled out a point out from the support ring geometry.

Now that I have all the support points, I have to create connecting lines so I can copy my chain geometry
onto it. To do this I fed both the top point and the 4 bottom points into a for-loop. In the for-loop, a
Group by Range Node sorts though and grabs one of the 4 support points and merges it with the top
connection point. I then used an Add Node to draw a line between the points. The loop iterates through
all the points, drawing a line between them and merges each iteration.
Madison McElfish
CG396

The next set of chains are the chains connecting each ring to the next one.

To do this, I took the same chain points generated for the supports but lowered them to the bottom side
of the ring. These will represent the top points of the connecting chains. I then fed those points through
another for-loop. This time there is only 1 input. In the for-loop I created 2 diverging paths. One is for
the top points of the connecting chains and the other is for the bottom. Then, similar to the support
chains, I used Group by Range Nodes to single out 1 point each on the top and bottom. I then merged
those points and used an add node to draw the connecting line. The for-loop merges all the iterations,
and we are left with lines that connect one ring to the next.

I then used a Copy and Transform Node to copy the lines to apply to all rings.
Madison McElfish
CG396

Chain Subnet
With those lines now created I fed them through my chain creation subnet. I compiled it into a subnet
for ease of use and to keep my network clean. Inside the subnet is the chain link construction.

The subnet can have multiple inputs. Each input is first fed through a resampling and setup system. The
first thing is of course: a Resample Node. Each input is adjusted to have a comfortable number of
segments that connect the chain links in the correct way when they are copied over.

Then I used an Attribute Create Node to set up the attribute “name” which will be used later for VDB.
Madison McElfish
CG396

The next thing is dividing odds from evens using a Group Range Node. In the Group Range Node, I
selected every other point and named the group “even”. I then used a Split Node to separate the even
group from the rest (odd).

The even points I fed into a Sweep Node and connected the chain geometry as the second input. The
odd points are fed through another Sweep Node but this time, the chain link geometry is rotated 90
degrees in the Z direction before being fed into the second input. I then merged both Sweep Nodes to
create the chain geometry.
Madison McElfish
CG396

It’s important to note that all lines are fed though similar chain networks within the subnet. The
important difference is the amount of resampling to make the link distribution make sense with the line
length.

VDB
The next part of the chain subnet is setting up VDB to simulate accurate collisions between the links and
create to realistic destruction. Setting up the volumes is similar to the way I set up the chain geometry.
This time I have to feed the geometry through both a VDB From Polygons Node and then a VDB to
Spheres Node. This turns the geometry into volumes that I will use to calculate collisions. The important
parameters to change are voxel size and min and max spheres.
Madison McElfish
CG396

This new geometry is fed through an identical same sweep system as the geometry which makes an
identical volume chain.

Next, I used an attribute to promote the “name” attribute to a primitive. Then used a Pack Node and fed
that into the DOP Network. Inside the DOP Network, I imported the RBD packed object and fed it into a
Rigidbody Solver. I then merged it together with a ground plane. Then I used a gravity node and fed it
into the output. When I press play, the volume chain falls and collides with the ground plane.

I have to make the chain geometry and VDB geometry work together. Under the geometry branch, I
used an attribute promote to the “name” attribute from point to primitive. I then used a pack node then
use another attribute to promote the “name” back to point class. I connected this to the first input of a
transform pieces node. For the second input I used a DOP import Node to draw in the DOP Network.
Then I used an Attribute Promote to promote “name” to point class. I connected this to the second
input of the Transform Pieces. I branched off the Transform Pieces Node and use a Time shift Node, then
connected that to the third input of the Transform Pieces Node. Visualizing the transform pieces node, if
I play the simulation, I will see the regular chain geometry fall like the VDB chain did.
Madison McElfish
CG396

RBD Fracturing
For this project I want to fracture two things: rings and gem chains. Previously I combined them into a
ROP Geometry Node and saved it out. To start my next section, I want to use a File Node to bring my
geometry back in. From there I used a Split Node to separate the geometry groups back out. Then for
both groups I set up an RBD Material Fracture node. I followed those with RDBio Nodes to save out the
fractured geometry. I then packed both fractured RBD objects and merge them together.

For the ring fracture, I chose wood as the material type. Because I split the ring into quarters earlier, I
was able to achieve more comfortable fracturing across round parts of the ring. I gave the ring the
fracture namespace “Rings_fracture”. I need that later for configuring. For the gems I chose glass as the
material type. I made the scatter points, radial crack number and detail extremely low to cut down on
loading times because there will be lots of gems in the final model. I gave the gems the fracture
namespace “GlassGems_Fracture”.
Madison McElfish
CG396

Constraints and Solver


I used a RBD Unpack to unpack the geometry. I used an RBDio Node to cache everything before moving
forward. I then used an RBD Configure Node to set up configurations.

I set up 2 custom attributes. One for the gem group and one for the ring group. I set both to active. I
gave the glass gems the glass physical attribute and I gave the wood rings the wood physical attribute.
Madison McElfish
CG396

Next I set up the constraint properties. I used 2 RDB Constrain Properties. The first one is for the glass
gems. I set the strength extremely low so that they will shatter with smaller forces. The next constraint
property is for the rings. Because it’s wood, I gave it moderate glue strength.

Then this is all fed into a bullet solver. When the simulation plays, the rings and gems fall and shatter on
impact with the ground.
Madison McElfish
CG396

Future Milestones
Milestone 2: The simulation with explosive forces and smoke
Milestone 3: Final render of your full destruction sequence

You might also like