RBD fracture objects in Houdini
RBD fracture objects
summary
This workflow creates several random cuts and also cuts the largest pieces in a second step. for stones, concrete
add base geo
add grid node rows: 100 columns: 100 add mountain node add extrudevolume node add null object name it geo_out
simple voronoi fracture
add object merge node select geo_out add vdb from polygons node uncheck distance VDB check Fos VDB add scatter node uncheck relax interations check force total count: 100 add voronoi fracture node feed base geo into first input and scatter points into second
getting color preview of fractured pieces
click white icon next to piece prefix to get color preview of the different pieces add exploded view node
node graph
object merge ┬─┬ │ └────────────┐ │ │ │ VDB-from-polygons │ ┬ │ │ │ scatter │ ┬ │ │ │ │ │ │ └────┐ ┌─────┘ ┴───┴ voronoi_fracture
boolean fracture
add object merge node select geo_out add vdb from polygons node uncheck distance VDB check Fos VDB add scatter node uncheck relax interations check force total count: 100 (use global seed for variations)
for random cuts on 3 axes
add attribute randomize node attribute name: N distribution: inside sphere
for random vertical cuts (on 2 axes)
(instead of the attribute randomize node) add attribute vop node and dive inside add parameter node label: dir type: 3 float (vector) plug parm it into N of output add random node (connect ptnum with pos) signature: 1D integer input, 3D vector add fit range node (connect rand with val) destination min: -1 -1 -1 add multiply node (connect shift with input1) add constant node (feed into 2nd input of multiply) constant type: 3float (vector) 3float default: 1 0 1 add normalize node (feed multiply node, plug into input of bind) add bind export node (connect shift with input) name: up type: 3 floats (vector) go up one level dir: 0 1 0 add grid node size: 30 30 (3x larger than objectmerge) rows: 100 columns: 100 add mountain node add copy to points node feed mountain in first input feed attributerandomize into second add boolean fracture node feed objectmerge in first input feed copytopoints into second add exploded view node to see inside
adding UVs
add uv texture node (after the object merge) add uv flatten node (after the grid before copytopoints) (add uv transform node afterwards and adjust scale) in boolean fracture node: ouput attributes -> check copy cutting surface attributes vertex attributes: uv
adding a second plane close to existing one
after grid node (cut plane) add copy and transform total number: 2 (or more) add connectivity node (each plane gets a value, in the attribute "class") in mountain node -> noise pattern check use VEXpression offset = @class*5;
further fracturing of single pieces
manually
select a piece
add assemble node (after booleanfracture and normal node) uncheck create name attribute check create packed primitive select one piece, press del in blast node, check delete non selected
fracture piece
add unpack node add scatter node force total count: 3 add voronoi fracture node (feed unpack and scatter) name attribute: append piece prefix: -
merge newly fractured piece with the other pieces
copy the blast node, uncheck delete non selected add unpack node
automatically
select pieces based on their size
add measure node (after booleanfracture and normal node) accumulate: per piece piece attribute: name (this generates an "area" attribute) add split node right click on node -> parameter and channels edit parameter interface add a Float from left side label: threshold click Accept on the node -> right click on threshold copy parameter Group: @area> `chs("newparameter")` (paste relative ref.) add 2 null nodes name them: big pieces and small pieces plug them into out of split node
randomly selected pieces
i.e. 25% of pieces fractured (see video in src)
selection based on distance of input geo
(see video in src)
fracture with foreach loop
add for each named primitive node foreach_end -> check single pass add scatter node force total count: 3 add voronoi fracture node (feed unpack and scatter) name attribute: append piece prefix: - in for each named primitive node foreach_end -> uncheck single pass