This project centers on the timescale and control of an RBD simulation of destroying a violin via a golf ball. This tutorial will guide you through preparing and setting up smaller, unique objects for an RBD simulation, while controlling their destruction in slow motion. Follow along with the HIP File for better understanding.
Step 1 - Asset Preparation
To start off any RBD simulation we need to make sure that the model is prepared for destruction. This means closing up any holes as well as fixing any geometry that could cause issues for fracturing. In our case this means ensuring that as much of the model is 3D pieces, ensuring no “disconnected” parts, and recreating missing geometry behind the neck of the violin.
The model has a few issues that have to be fixed. Start off with cleaning up a gap under the neck where it connects to the case which has to be filled so that there are no holes. The side panel is only 2D and needs to be thickened, as well as some smaller fixes such as filling in cylinder-like objects and blasting off some interior floating pieces.

We then just need to group off some parts for easier selection/naming for when we fracture and render. We can then create an extra placeholder name attribute called pname which will hold the original names of the pieces as it will help when naming things for Solaris. There are some additional changes made after due to certain edits for grouping and geometry that need to be made later down the road, but they are minor. For the additional assets create a box with some bevels as a stand, a simple curved backdrop, and a goofball although a plain sphere is also just fine, and we are good to go. Once it is all modelled and placed upon the stand we can move on to fracturing the geometry.
Step 2 - Fracture the Violin
Now that the model is cleaned up its time to begin fracturing the violin to prepare it for the RBD simulation. It is good practice to do the fractures and constraint set up on objects at rest and then simply copy the transformations or animations back onto the object later. Even though our scene is relatively simple, set the violin back to rest and we can start fracturing.
Fracturing an object like a violin is a bit more complicated than say a rock as with wood you have to take into account grain structures and in our particular case referring back to the reference to see the general shape of the pieces we are looking to create. Using the groups and names from before we can fracture the main violin case needed for the RBD simulation as well as ensure that the parts which are not breaking; in this case the neck, tail and small parts at the bottom are properly prepared for the RBD sim.

RBD Material Fracture on bad geo vs On fixed geo
Starting off, the wood case of the violin will be fractured using a RBD Material Fracture however even if we cleaned up the model sometimes some issues may arise. In this case the RBD Material Fracture node may struggle to properly create fractured geometry, usually due to non-airtight geometry. In order to fix that we will convert the pieces to VDB and back but ensure that we transfer back attributes and especially the UVs as we still want to use the original textures for the violin. This will ensure that the piece has 0 holes and is airtight so the RBD Material Fracture can easily give us good looking fractures. Aim to keep the fractures larger as it makes controlling the simulation easier and the splinters/shards can be done as secondaries. The bridge and soundpost being so small can also cause issues so we will simply enlarge them, fracture them and then scale them back down.
Note
The front piece of the case needs to have its UVs manually adjusted as we reconstructed the geometry behind the neck therefore it needs to be reconstructed in the UVs as well. The rest of UVs for the reconstructed parts are fine and don't have to be adjusted since we will not be seeing them anyways.

Broken Uvs vs Fixed at top
Once all of the wood pieces have been fractured, we can work on the rest of the pieces which will not be fracturing but still part of the simulation. We simply need to have them named correctly for the RBD Bullet Solver and that means giving each piece a name attribute unique to itself which can be done a variety of ways, in this case we can just turn off the cutters in the RBDMaterialFracture and turn on the Fracture per Piece option. Reassemble the violin and we are ready to set up constraints for the RBD simulation.
Step 3 - Constraint it all together
Next step is to set up constraints between these pieces. We will be using SOP level tools to set up the connections and then tweak the constraints in order to control where and what pieces are breaking.
Begin by constraining the violins main wooden case, this will be the most complex constraint system but by using the RBD Constraints from Rules and RBD Constraint Properties nodes it will do a lot of the work for us allowing us to focus on figuring out the values for the parameters. Create the constraints for each of the 3 pieces, the front, the sides and the back and then combine them together with a different set of constraints for the pieces making up the case vs the 3 main sections of the violin. Make sure to keep the constraint tags separate so that we can have more control over the pieces themselves versus the connections between them.
The constraint type should be Glue as it will hold pieces together without letting them move until broken however for anything breaking ensure that Constraint Switching is on and set to Soft as this will allow us to switch pieces that have to be broken to Soft constraints right before impact. I found trying to allow the solver to calculate breaks based on Glue strengths resulted in strange results such as the ball shifting suddenly or coming to a complete stop against the strength of the wood. Soft constraints allow us to skip that and focus on the final feel of the wood shattering.

Constraints set up exploded view
Ensure that the Override Angular Stiffness and Damping Ratio is on as this will give us better control over the strength and oscillations of the wood that is being bent away due to the impact. It should be weaker than the general Stiffness and Damping Ratio as wood is bendable, and we hope to imitate those aspects.
The same applies for the bridge and soundpost, however for the rest of the pieces which are not breaking, simply connect them to the case as close to a realistic assembly as you can. That means attaching the connectors and then the pieces to said connectors rather than the whole piece directly to the case.
Note
The constraint values for the Soft constraints are what we are focused on through some trial and error you can dial them in however the general idea is for the wood we want high oscillations and more freedom to “bend”, however for the pieces which are not breaking we just want them to stay generally in place with slight vibrations to help sell the impact.

Step 3.5 - Controlling the Breaks
A large part of this setup is controlling where the breaks are going to occur. As mentioned earlier, we will be switching some constraints to Soft right before impact so that the golf ball can cleanly pass through without needing to truly break through the Glue strength wood. Doing this allows a much easier time controlling the simulation as we know the impact will be breaking through the violin fairly quickly and cleanly.
In order to achieve this control, we will set up bounding boxes to select constraints we wish to break and switch to Soft. This is much more convenient than selecting the constraints manually as if we ever want to change fractures/constraints it would break the selection. This allows us to freely make changes and not have to spend too much time readjusting selections if we go back and change things. Plus, small adjustments to a handful of constraints to adjust certain pieces.
Start by splitting off the pieces that will be breaking from the pieces which we are trying to allow to vibrate and rattle a little bit. In this case, if we look at the reference its mainly the top right side that is breaking and opposite side is generally less impacted. Set the bounding boxes to capture that area and give the group a name that we can use later for Break Thresholds. For the unbreaking pieces just some small tweaks have been made to ensure certain results like the pegs not moving and adding a separate group for those pieces to control when they should switch to Soft constraints for vibrations.
Step 4 - Shatter
The last step of the simulation is to just set up the RBD Configure and RBD Bullet Solver node as we need to make some tweaks to get the look we are aiming for.
Note
A lot of these values take time and some wedging to figure out as well as going back and forth between the simulation, fracture and set up. The same goes for what pieces to select to switch constraints on or just figuring out ways to circumvent certain unwanted issues. However, Houdini's proceduralism allows this to be a simple workflow and going back to edit and make changes is just part of it.
Starting off with the RBD Configure we will set the density of the wood to a large number to add some weight to them as well as making the button at the bottom inactive until right after impact to prevent the violin from flying off the stand. Then just move the violin into position by copying the transform from the asset to a rbdxform node. Finally, take the golf ball and give it a good amount of density and velocity but remember the shot is in slow motion and golf balls are extremely fast off the tee so it will have to be quite fast. We are keeping the density of the violin and ball unrealistically high because of the nature of the shot and details we want to capture.
Then just move the violin into position by copying the transform from the asset to a rbdxform node, adjust the golf ball and give it a good amount of density and velocity towards the violin. Remember the shot is in slow motion and golf balls are extremely fast off the tee so it will have to be quite fast. We are keeping the density of the violin and ball unrealistically high because of the nature of the shot and details we want to capture.
Finally, onto the RBD Bullet Solver to really set up the controls and look we are going for. Start with the Time Scale, since this is a slow-motion shot set the time scale to 0.1 as that is around where the reference seems to be at, it's hard to tell without exact numbers but it seems about right. The rest of the numbers can take some trial and error to get right however, I found setting the Bullet World Scale to 1000 gave stable results as well as 400 Bullet Substeps and 100 Constraint Iterations. As for drag, set it 0 initially until impact since the golf ball is an active object it'll make it easier to judge how fast it is going at impact and not require us to spend too much time adjusting its values
Onto the Constraints tab where a lot of the setup from earlier comes into use. For the Soft constraints we can set the Break Thresholds to 0.45 for the Angle Threshold and 0.01 for the Distance Threshold as we want to allow pieces to hinge at the point of connections but once separated break. Finally, for the Impact group set a tab to Switch to Next Constraint and set the frame to switch to 24. This ensures that a frame before impact the constraints at the impact location are no longer Glue but now operating as Soft constraints.

Break Thresholds for the violin
Note
Remember to add name and pname to the Attribute Transfer parameter in the Output tab of the RBDBulletSolver as we will need them later to set names for rendering.
Step 5 - Adding Details and Solaris Prep
Now that we have the RBD simulation completed, we will add some smaller details that are not simulated to further add some weight and feel to the impact before moving on to secondaries.
Start off by unpacking the simulation and setting the names for Solaris as we will be using Karma XPU for the render. Reset the name attribute using the pname attribute that we set at the start will make it very easy as the RBD sim has changed the naming of the pieces. Then, like many other RBD simulations we will switch between the unfractured original asset a frame before impact using a switch to hide some of the imperfections.
We also need to set up proper UVs for the inside of the breaks as this is new geometry we created. Split off the inside group then give it a name so that we can assign the material easily in Solaris, and finally set up UVTextures on a time shifted and frozen version of them before copying the UV attribute back to the simulated geo. We now have rock steady UVs for the inside pieces. Also split off the interior face of the violin so that we can name it correctly for textures later and we are good to go to add some vibrations and a peg twisting animation.

Bend node set up
For the reverberations we can just select all the pieces that aren't being sent flying from the impact and add some twist and bend using the Bend node. We just need to add some wave noise from CHOPs to the Bend Angle and Twist that is animated towards 0 after a few frames as we want the vibrations to end fairly quickly. Remember to enable Deform in Both Directions and Continuous Twist in Both Directions so that the vibrations are correct. Finally, add a peg twisting animation by extracting the centroid of whichever peg to add the animation to, time shift and then animate the peg twisting, then copy it back to the centroid of the original peg.

Step 6 - String Simulation
So we have an RBD Simulation for the wood, but we are still an important part of the violin, the strings! We can use the RBDs to drive a vellum string simulation however we first need to convert the strings from the asset into lines so that it can be run through the simulation.
Once that is done, add some cuts to some points so that we have breakpoints for the strings to snap at impact. Then it is just time to stitch these cuts back together so that they hold before impact. Set up the strings as Hair and add names for each string so we can control which ones break later. To get the “pop” of the strings as they break, set the Edge Length Scale of the strings to a value under 1 this will cause the points on the string to try to contract towards each other so that when they break, they will try to contract.

There's a few settings that should be tweaked to help stabilize the sim and give us a more accurate result. For the VellumSolver itself remember to set the Time Scale to 0.1 as the strings should be in slow motion as well. Increase the Substeps, Collision Passes and Polish Passes as well to keep the strings from acting erratically and then finally animate the Static Threshold to a high value before impact and then down to 0 after as we need the strings to stabilize across the bridge of the violin and this will help prevent them from slipping off.
The final step for the string vellum simulation is to set up the breaks in the vellum strings themselves, add some Vellum Constraint Properties nodes and animate the Remove parameter to remove the constraints holding the cut breakpoints together at impact. All that's left now is to Extrude By Thickness so that we can transfer the original UVs onto the simulated strings and actually render them.
Note
The strings may have a few frames of weird jumps and strange behaviour as they try to stabilize but that is ok. As long as they are stable enough for a few frames to freeze before impact and also after we are good to go. Any irregularities will be hidden through the time freeze and switch in the render set up.
Step 7 - Dust
Now that we have the main portion of the Violin shatter done it's time to add in some secondaries. In this case we will add some particulate debris, some dust and some smaller pieces to help fill out the general debris cloud.

VDB For Pyro Collisions
Start off by taking the simulation of the violin and combining it with the stage and converting both of those to a VDB cache that we can then use to provide collisions for the pyro simulation. Using a VDBFromPolygons node, drop the Voxel Size low enough to keep a good amount of the detail of the violin, and then change the Distance VDB name to collision. Change the Surface Attribute to point.v, the VDB name to collisionvel, and finally the Vector Type to Displacement/Velocity/Acceleration. The collisions are now ready to be cached out to be fed into the pyro simulation.
Note
Ensure that the VDB from the violin doesn't have holes and is reasonably detailed or else the collisions may be off. Using a VDBReshapeSDF node can help adjust the VDBs using erode and dilate.
We will be sourcing points from a debrisSource, however since this simulation is in 0.1 time scale the points that are created have velocity values that are far too fast. adjust the velocity of the points that are created to compensate for this by simply multiplying the velocity of the points by the time scale in order to fix them. These can then be fed into a popnet with some popforce added but remember to set the timescale on the popsolver down to 0.1 and also adjust the sourcing of the particles to only a few frames as well as the life expectancy down to a very short time as it is in seconds which at 0.1x the speed is extremely long. Take these points and set some density and pscale based on the nage, add some noise to the velocity, and rasterize the density and velocities so that we can feed them into a pyrosolver.

Optimization for Pyro Solver
For the smoke itself due to the scale of the scene, we will need to drop the voxel size to a fairly small number to preserve details, in this case 0.02 and once again don’t forget to set the time scale to 0.1. As for the pyroSolver settings ensure that the Collision Type is set to SDF+Volume Velocity and that the Velocity Volume is collisionvel, the name we set earlier for the collision VDB. Cache out the smoke and we are almost done.
Optimization Note
Make sure that we are not outputting anything we don't need for the dust sim as volumes can get fairly heavy we don't want to be caching extra data. Turn off any field we aren't using such as temperature and flame as well as turn on some post-processing features to help cull the size of the cache.
Step 8 - Debris & Splinters
The final secondary we will be adding is debris, some particulate from the impact as well as some very small splinters of the violin flying around after impact.
Start off with another debris source only emitting off the fast-moving large pieces and add some velocity noise to these as the original velocity will probably be too linear without much detail. Run these points as sources for particles in a popnet with the violin and stage as colliders, again at 0.1 timescale, however, add some popforce and popAdvectByVolumes bringing in the vel field from the dust sim to help provide some more details to the simulation. Source these particles for a few frames as well however their lifespan can be a big longer as we will scale the pscale off their nage to have them shrink and disappear as they get older.
Points to copy to and further fractured pieces
In the copytopoints turn on the Piece Attribute parameter and set it to piece and check on the Pack and Instance parameter. Finally, add a randomized name to the pieces using an attribrandomize as this will be used to assign materials to the splinters.
Step 9 - Render
We are finally ready to render the scene!
Head into Solaris and drop down sopImports to bring in all the aspects of the shot. The violin with the strings, the dust, the particles, the splinters and the stage. Assign materials to these objects taking into account specific cases such as the inside of the violin should have a different texture than on the outside as well as insides of the broken pieces. We can reuse the violin materials for the splinters as they were originally just part of the violin anyways.Once the materials have been assigned, drop down some lights as well as a karmaFogBox for the hazy feel. Split the render into its separate passes using karmaRenderSettings so that the violin, the dust, the particulate and the splinters are all separate for both of the cameras. For the karmaRenderSettings, we are rendering using the Karma XPU engine and make sure you have Motion Blur enabled as well as the Depth of Field set to off. Turn on Velocity Blur and that is everything needed to recreate this shot! Hope you found this tutorial helpful and thank you for reading!

コメント
Manuko 3 週間, 4 日 前 |
Love this kind of walkthrough-tutorials!
Keep going!
QuantumCabbage 3 週間, 3 日 前 |
Great tutorial, thanks a lot! One thing I noticed: The front and back pieces of the violin are airtight, they've just got their normals reversed. That's why the RBD material fracture doesn't work. As soon one flips the normals and they are facing the right direction, the fracturing works without any issues.
alucula 2 週間, 4 日 前 |
Beautifull! Great work, Gur! :)
Please log in to leave a comment.