The new RBD Car Fracture SOP and RBD Car Transform SOP, combined with the existing RBD Car Rig Tools in Houdini, make it quick and easy to set up a working car crash simulation.
This tutorial covers the full process:
- Rigging and driving two cars
- Fracturing them using the new tools
- Simulating collision destruction with the RBD Bullet Solver
We’ll walk through setting up the example HIP file, helping you understand the workflow so you can either recreate it from scratch or build upon it. For the best experience, keep the HIP file open as you follow along. Click the "Download HIP File" button above to get the project files. With that ready, let’s get started!
STEP 1 - The Setup
It's important to start the rigging process with well-prepared geometry. This includes proper grouping for different parts, clear name attributes, and clean geometry—free of open faces, loose points, or interpenetrating meshes. While the RBD Car Fracture SOP can handle some topology issues, it's recommended to clean and prep the geometry for optimal results. Open the GEO_car_asset geometry node to view the car asset used in this project.
In this case, the car model already has proper groups and a name attribute. It's recommended to copy the name attribute and rename it to @path, which will be useful for applying textures later in Solaris. Fortunately, we also have an existing @shop_materialpath attribute that can be renamed to @path for the same purpose. Some additional steps include coloring parts of the wheels to better visualize their rotation and correcting the car body’s UV maps for use later during texturing in Copernicus. With that, we're ready to begin rigging.
The project file includes several versions of the ramp geometry, as well as the ramp HDA. You can use any of the provided variants or modify the HDA to create your own—just make sure to install it beforehand. You can find the ramp in the GEO_procedural_ramp geometry node, along with the heightfield used as collision.
STEP 2 - Rig and Drive
Once the car and ramps are set up, we can begin rigging the car. In this example, the same car model is used twice, but the setup works just as easily for simulating multiple cars. Let’s dive into SIM_car_driving to see how it's set up.
The RBD Car Rig SOP controls the driving parameters, while the RBDxform SOP sets the car's start position after rigging. Begin by assigning the Wheels Group and Steering Wheel Group in the car rig, then animate the Steer, Speed, Brake, and Hand Brake parameters to shape the drive simulation. For more accurate results, configure additional settings such as Center of Mass, Acceleration Profile, Tire Friction, Wheel Scale, Suspension, and Density. Since both cars are identical except for the animated elements, all the parameters remain the same for each.
The cars are packed using RBD Pack SOP before merging, and then separated with RBD Unpack SOP by enabling "Enforce Unique Name Attribute per Instance" and using the @index attribute. This ensures each car has a unique name attribute, which is essential for the Bullet Solver to distinguish between them.
Geometry Wrangle used within the Bullet Solver to ignore collision between cars.
In the RBD Bullet Solver, using a Geometry Wrangle,
collision is set to ignore everything except the ground plane to reduce
simulation time by preventing inter-car collisions. All we need is for the cars
to launch off the ramp and continue through the scene. The VEX code is as follows:
s@collisionignore = "* ^groundplane";
Additionally, the @restxform attribute output from the Bullet Solver is required to transform the fractured geometry with the simulation points down the line.
In this setup, the ground plane is a heightfield that includes both the ramp and terrain. It’s prepared in the GEO_procedural_ramp geometry node and assigned as the collision object under the Collision tab in the RBD Bullet Solver.
The two main outputs from this process are:
- Simulation points—unique to each car.
- Deformed car geometry—with wheels and suspensions animated using RBD Car Deform SOP.
The same heightfield is used in the RBD Car Deform to ensure accurate deformations on the wheels and suspensions post the simulation.
STEP 3 - Fracturing
This is where most of the work happens—but all within a single node. Inside the SIM_car_fracture, he same car used in the driving simulation, with the same RBD Car Rig (but without any keyframes), is connected to a new RBD Car Fracture SOP. This preserves not only the names and constraints generated by the rig—crucial for the following simulation—but also key properties like Center of Mass, Tire Friction, Wheel Scale, Suspension, and Density, ensuring consistency throughout the setup.
We use a separate Car Rig to keep the driving and fracturing processes independent. This makes it easier to iterate on the driving—tweaking parameters like Speed or Steer—without needing to re-fracture the car each time. However, if significant changes are made to attributes such as Wheel Scale or Center of Mass, it's important to update this Car Rig and re-fracture the car to maintain accurate simulation results.
The first step is to set the Chassis Group. For a frontal impact, the chassis group is split into three parts: front suspensions, chassis (the exhaust in this case), and rear suspensions. We will use only the chassis and rear suspensions, locking them as a single packed object that holds the wheels together. This setup allows us to fracture the front suspension separately.
If there are external objects like carriers or antennas that should be excluded from the simulation, specify them in the Ignore Group. Since we don’t have any, we can proceed.
You can also specify a Rest Frame and enable Re-Align Wheels if you have an animated car geometry. Since we're fracturing a static car, we can leave the Rest Frame at 1 and the Re-Align Wheels disabled.
We start by fracturing the front tires, as they will be squished upon collision. Although the Wheels Group combines all four wheels into one primitive group, it’s essential to have separate groups for each tire and rim. This allows the tires to fracture while keeping the rims intact, so the wheels remain attached to the car. By default, the tires have soft constraints without switching, enabling them to behave like 'rubber'.
Adjust the Fracture Density for more pieces and enable Edge Detail to break up the uniform voronoi pattern you get by default. One thing to note: when tweaking the Edge Detail parameters, the proxy geometry may start to behave oddly. To prevent this, avoid extreme adjustments or compensate by adjusting the Fracture Density accordingly.
Next, the process becomes straightforward in the Sections tab. You can assign different parts of the car to separate sections for independent control over the fracture type (metal, glass, wood, rubber). Aside from adding Edge Detail, Proxy to Geometry can be enabled for an additional fracturing layer with varied fragment sizes. Constraint attributes like Strength Scale, Stiffness Scale, and Angular Stiffness Scale can also be adjusted per section.
There is also a checkbox for enabling Constraint to Neighbor Sections. When enabled, it automatically links nearby sections using glue constraints.
It’s best to turn this off for parts like doors, hoods, or trunks that require manual constraint setups, such as hinge constraints. For metal, we use the Sheet model since these parts are planar geometry rather than solid objects. Despite being planar, the
RBD Car Fracture SOP extrudes the planes and converts them into solid objects when creating proxies. This extrusion can be controlled
by the Thickness parameter.
For the glass, we apply the Safety model to all windows except the windshield, which uses the Impact model. This is a creative choice allowing the windshield to crack in a concentric pattern. The Safety model also has plastic deformations enabled, while the Impact model requires more manual setup—since it only includes glue constraints by default. This would cause the glass to break immediately, but we want it to bend slightly first to reveal the concentric crack pattern. To achieve this, we override the constraints using an RBD Constraints Properties SOP to switch from glue to soft constraints—either right after the fracture node, within it, or later in the network before simulation, as done in this project.
If you check the Sections tab in the RBD Car Fracture SOP, you’ll see how the car is divided into different sections based on components and material types. For now, all section values are left at their defaults, except for Edge Detail and Constraint Color, allowing for quick iteration of the fractured car.
Additionally, you can control the Section Connector Constraints and global Constraint Attributes. Parameters like Strength Scale, Stiffness Scale, and Plastic Hardening Scale affect all constraints between pieces and sections collectively. Since the suspension comes from the Car Rig, the Suspension Stiffness Scale can also be adjusted here, without needing to return to the rig each time. The values shown were finalized after multiple test iterations, just before caching the fractured car.
These constraint values can be adjusted at this stage or later using a separate RBD Constraints Properties SOP before the simulation. The reason for using extremely low values for Strength Scale, Stiffness Scale, and Plastic Hardening Scale is due to the high Constraint Iterations setting on the RBD Bullet Solver. With more iterations, constraints become harder to break unless their glue strengths are significantly reduced. This is where the global parameters become especially useful—they let us fine-tune all constraints across sections without having to adjust each one manually, streamlining the workflow compared to older methods.
The Constraints tab and RBDs tab on the RBD Car Fracture SOP
It’s important to enable Disable Motors if you want the car to stop running after the crash, and to turn on Retarget Anchors for the wheels so they break apart with the front suspension upon impact. This is necessary in this case because we’re dealing with a frontal collision, and parts of the front suspension are expected to break. Without retargeting, the wheels might remain attached to nothing, which looks unnatural. When retargeting is enabled, constraint anchors that were previously attached to the 'body' (the Chassis Group) are reassigned to the nearest fractured piece—since those pieces are no longer labeled 'body' . This allows the wheels to detach along with the broken front suspension and axle.
To optimize performance, you can reduce the poly count of the proxy geometry for a lighter simulation, or keep it detailed to preserve smaller fragments. Disabling Poly Reduce Proxy Geometry can also help avoid volume loss errors, especially with smaller pieces. Compute Collision Padding can be adjusted here or in the Bullet Solver, which also helps prevent the same issue.
By default, Match Input Density is enabled to match the car’s weight as defined in the Car Rig. However, you can disable it and manually adjust the weight here if needed, without going back to the Car Rig.
Here’s how the initial fracture looks after all these settings are applied.
Despite offering extensive control over sections and automatic constraint and proxy setup, this workflow can be further enhanced by diving inside the RBD Car Fracture SOP.
To add more detail to the windshield crack, perform an additional fracturing layer by separating the windshield with a Split SOP. It’s best to use the RBD Material Fracture to preserve the existing constraint setup. Be sure to transfer the original attributes to the newly fractured pieces and proxy to maintain consistency. It is imperative to copy the @__section attribute to the newly fractured pieces based on the @name attribute.
The next important step is to set up the RBD Connected Faces SOP and enable the Opposite Face Name for both the existing inside group and the newly fractured pieces’ inside groups. Disable Create Constraints as it’s not needed here. This step is crucial for rendering fractured glass, ensuring that inside faces are revealed only upon breakage. After this, it’s also important to copy the necessary attributes again. You can do this step once after secondary fractures and setting up connected faces attributes as well, unlike what is done here.
In parallel, set up hinge constraints for the hood and trunk. This allows them to pop open upon impact, creating more natural collision destruction. The hinge constraints should be set to Hard and Position Only to lock their position while allowing rotation along the hinges.

After all the custom fractures and constraints, it’s a good idea to cache the car geometry using an RBD IO SOP. This lets you retain a single fractured version of the car while freely adjusting the drive simulation. Since the fracture setup is independent of the drive, you can also iterate on the fracture after testing it in the crash simulation, as done in this case. Don't forget to cache the re-fractured car when making major changes to the Car Rig as mentioned before.
STEP 4 - Crash Simulation
As mentioned earlier, the Car Fracture SOP allows you to build further on the existing setup. At this stage, we have one fractured car and two sets of car points with the @restxform attribute and drive simulation data. Using the new RBD Car Transform SOP, we can drive the fractured car using these simulation points, since the original body and wheel name attributes from the RBD Car Rig are still intact. Open the SIM_car_crash geometry node to follow along.
Note
Why use the RBD Car Transform instead of Transform Pieces?
Transform Pieces works by matching the name attribute on points to corresponding geometry pieces. However, the drive simulation only provides 6 points—4 wheels, 1 body, and 1 steering—while the fractured car has many uniquely named pieces. The RBD Car Transform SOP solves this by using the @sourcename attribute on the proxy geometry, which matches the original name given to each piece before fracturing, allowing accurate transformation of the entire car.
Before plugging in the points, it's important to remove the @index attribute from the points, as it's not present on the fractured car. While you can recreate the @index on the fractured geometry and merge it later, it’s cleaner and more efficient to skip this step and instead use RBD Pack and RBD Unpack nodes downstream to manage and align the data.
Some additional constraints are setup in this phase to lock the hood of one car and the trunk of the other using more hinge constraints. This is to have them locked until a certain point in the simulation after which these constraints are deleted to allow these doors to pop open.
Since this is specific to each car and is better to create on static fractured geometry, it is done right before transforming the car. Once this is done, we can connect the geometry, constraints and proxy along with the simulation points, to the RBD Car Transform SOP. This node has Re-Align Wheels enabled by default and it is necessary to leave this as is in order to prevent any sort of weird rotations on wheels during the crash simulation.
You can also perform other car-specific operations, such as editing constraint properties on individual sections before packing and merging. In this example, overall metal constraint strength has been tweaked independently to make one car more rigid than the other. Even velocity manipulation is possible using a simple VEX expression: v@v *= chf("Multiplier");
This creates a float parameter that multiplies the velocity by the specified value. It's used here to make one car push into the other and penetrate upon collision.
After that, both cars are packed and merged—just like in the drive simulation phase
Adjusting the constraints created in the RBD Car Fracture SOP based on requirement
After unpacking, you can modify constraint properties shared by both cars. In this case, the following adjustments have been made:
- Glue strength increased on the wheel constraints.
- Angular damping adjusted on the soft constraints of the tires.
- Constraints of the windshield redefined.
- Angular properties of the hood and trunk door constraints tweaked.
- Strength of the Section Connector Constraints and window constraints increased.
All these adjustments are specific to this setup and were refined through multiple iterations of the crash simulation.
Right before simulation, the cars are split and frozen at frame 1 using a Timeshift SOP. These are later used in the RBD Car Deform as reference inputs for deformation.
Separately, both cars are also frozen at the simulation's start frame to serve as high-res geometry, which will be transformed using the Transform Pieces SOP with the simulation points. Why? Because we have points with unique name attributes corresponding to each piece. This approach reduces the need to cache heavy geometry to disk.
Since constraints cannot be transformed like geometry—because we are setting them up for deletion on the Bullet Solver— they must be cached separately alongside the simulation points. Retiming the simulation for slow motion is a requirement, so it is advisable to cache more substeps to disk for better accuracy in this case.

Most of the key work happens under the Constraints tab on the RBD Bullet Solver. Here, constraint groups are selected using the @constraint_tag attribute and deleted either based on a threshold or at a specific frame. This gives you fine control over how the cars break apart, allowing for more art-directed destruction.
For example, in the image above on the right, all metal constraints—which are soft constraints—are selected and set to be deleted beyond a threshold of 0.055, causing impacted pieces to break off and fly apart, adding a more dynamic feel to the simulation. You can explore all the tabs under Break Thresholds to see how these are configured—it’s all fairly straightforward.
Beyond that, several other parameters help improve the simulation:
- Constraint Iterations have been significantly increased.
- Collision Padding is set for both piece-to-piece and geometry-to-collision interactions.
- Drag is enabled to help stabilize the motion.
- Randomize Constraint Order is turned on to improve solver stability.
A common issue with simulating very small pieces is that they don’t settle easily and continue to jitter. This happens because their mass is extremely low—well below 0.1. To address this, we read the computed mass and velocity of each piece every frame using a SOP Solver within the RBD Bullet Solver. Using an Attribute Wrangle, we multiply the velocity by 0.96 to gradually reduce the movement if a piece has a mass less than 0.1 and velocity less than 1. Additionally, we start a timer for these pieces, and if the timer exceeds 24 frames, we deactivate the piece entirely so it no longer moves.

After this, you can either set up a TOP network—such as the FARM_cache TOP shown on the geometry level—to procedurally simulate all the caches, or just cache each simulation to disk manually. You can also go one step further and create wedges for any of the parameters you want to iterate on. Now we'll open the POST_retime_for_slomo geometry node to see how to retime the RBD simulation.
STEP 5 - Retime and Deformations
The deformation process has been significantly simplified. The RBD Deform Pieces SOP and the RBD Car Deform SOP are the two main nodes to focus on. However, before deforming, we need a slow-motion version of the cars for the final output, so it’s wise to use the Retime SOP beforehand.
In this example, we’re stretching 5 frames of the simulation to 50 frames. Therefore, retiming by frame range is a better option, as it gives us an exact 90% speed reduction. This same factor can later be applied to the time scale of all secondary simulations like debris and dust.
It’s better to perform this retiming on packed geometry or simulation points, as it requires caching more substeps to disk. This is easier on the disk instead of caching the geometry itself and without substeps the retiming can introduce artifacts—such as stepping or scaling issues—especially on fast-rotating parts like wheels. This is why retiming at the point level gives better results.
After retiming, we can split the two cars into separate streams to perform individual deformation operations. This allows for manual adjustments to each car, such as post-impact animations.
The RBD Deform Pieces SOP requires three inputs: geometry, constraints, and proxy geometry. The group must be set using the name attributes created during the fracturing stage. Since we only need to deform metals and rubbers, it's best to name the parts accordingly (e.g., metalxyz, rubberabc, etc.). Set the Group Type to Points, and the Boundary Connection to Cluster Attribute and Constraints. This ensures that pieces with deleted constraints don’t remain deformed but instead break apart correctly. Set the Cluster Attribute to @parentpiece. Finally, for the RBD Car Deform SOP, use the reference geometry output from just before the crash simulation as the second input.
Make sure to set the Chassis Base Group on the RBD Car Deform SOP to @name=body-(@index) based on the index of your car, in this case 0 or 1.
After unpacking the output geometry, we need to use the RBD Disconnected Faces SOP to re-enable the @oppositefacename attribute and also create a @disconnected attribute. This allows us to delete the inside faces based on that attribute and also use it to scatter points on the inside faces for sourcing glass debris.
One of the problems with using an asset that contains interpenetrating geometry is that, although the Car Fracture SOP can
still fracture it, the simulation may produce unexpected behavior in
certain pieces. In this case, the front left wheel—which is expected to
spin since it doesn’t receive much impact—fails to behave correctly
because it collides with other geometry that intersects the tire. A
simple fix for this is to isolate that wheel and manually animate it
based on the overall movement of the vehicle.
After addressing this, the next step is to clean up any unnecessary attributes and groups, and compute velocity on the deformed geometry. Since we use the fractured version of the cars only from the frame of impact onward, we can blend it with the non-fractured car from the drive simulation up until that point.
All that’s left is to use the simulation geometry to source and simulate all secondary effects, such as glass debris, glass dust, car dust, ground impact dust, and tire trail dust. You can download the HIP file to explore some intermediate-level setups for the secondary simulations. These setups are reusable and can either be broken down into simpler versions or expanded into more complex simulations, depending on your needs.
Fast and Fracturous - Equinox
This presentation dives into what’s new in Houdini 21 for Rigid Body Dynamics, focusing on how the new nodes improve and simplify the existing workflows. We break down the different Car RBD workflows and show how these tools give you more control and flexibility when setting up vehicle destruction simulations. You’ll also learn how to adapt these methods to different types of vehicles, helping you push the limits of what’s possible with RBD setups in Houdini. By the end, you’ll have a solid understanding of how to leverage these updates to create more efficient, realistic, and customizable simulations.
コメント
Please log in to leave a comment.