Houdini & Procedural Workflows / Houdini
How to Make Procedural 3D Trees | Houdini Tutorial
Written guide

Playing loads YouTube content. YouTube processes data after activation.
Watch on YouTubeIf the player is blocked or unavailable, use Watch on YouTube.
This procedural tree uses the same construction at three scales: a trunk, branches copied onto the trunk, and twigs copied onto the branches. A shaped line supplies each level’s direction, PolyWire gives it thickness, and a grayscale attribute controls taper and the size of attached parts. Leaves are then copied onto selected twig-surface points.
The lesson focuses on geometry. The opening preview includes simple wood colors and randomized leaf colors added separately, and shows that the asset can be copied into a forest-like arrangement. It does not build a complete forest-distribution, wind, UV, or rendering system. The recording uses the historical Copy Stamp workflow; its exact Houdini release is unverified.
Shape a line before turning it into a trunk
From 01:01, create a Line inside a tree Geometry object. Increase its length from one to three scene units and its point count from two to ten. Add PolyWire and give it eight circumferential divisions for a more rounded cross-section without making this initial example excessively dense.
The line and PolyWire have different resolution controls. More line points give the trunk more places to change direction along its length. More PolyWire divisions make each cross-section rounder. Increase the one that addresses the visible limitation rather than treating both as a generic detail setting.
Place Group by Range before Point Jitter and switch the group type to points. Exclude the initial points from the jitter group so the base does not receive the same positional variation as the upper trunk. The demonstrated selection leaves the first two points unaffected by Point Jitter.
Reduce jitter intensity, change its seed to compare shapes, and add Smooth afterward to soften abrupt bends. Inspect the line and the final PolyWire output. Excluding points from jitter is one control on the base; it is still useful to inspect the downstream smoothed result before assuming the entire chain preserves the attachment exactly.
Create a gradient that controls thickness
Around 06:02, assign black point color to the line. Create a small polygon Sphere with white color and use Attribute Transfer to transfer from that sphere onto the line. The line is the receiving input; the sphere is the source of the attribute values.
The initial transfer distance is too broad and makes the whole line white. The instructor reduces the distance threshold to zero and connects the transfer’s blend-distance control to the Line length through a relative parameter reference. The result is a falloff from white toward black along the example trunk.
This gradient is built through spatial attribute transfer. It is not a separately measured arc-length coordinate, so inspect it again if the source sphere or the curve shape changes substantially. The purpose is to obtain a useful varying value, not to assume that the transfer will always describe the trunk’s height perfectly.
From 10:03, use an Attribute VOP to pass color through a Ramp Parameter and back to color. The ramp allows a thick base, thin tip, or other variation to be shaped visually. At this point color is a control attribute, rather than the final brown appearance of the wood.
Drive PolyWire’s radius from that value. Direct use gives an excessive range, so the instructor remaps the grayscale value into an example radius interval of 0.01–0.2 using fit01. The captions do not reliably preserve the final attribute-channel spelling and expression punctuation; use the parameter view in the video when entering the exact expression.
Test the ramp while looking at the wire geometry. The curve color should change first, and the radius should follow it. This gives a clear place to distinguish an attribute problem from a radius-expression problem.
Reuse the construction for branches and twigs
At 13:00, copy the line-shaping and thickness setup for the branch and twig levels. Add point groups that specify where attachments can begin and end. Restricting the branch group keeps the lower trunk clear; the twig group performs the same job one level farther out.
Use Copy Stamp with branch geometry as the geometry to copy and the selected trunk points as the template points. The instructor initially connects the inputs incorrectly, then corrects them and selects the branch group as the template group. Changing that group’s range should now change where branches appear.
Disable Transform Cumulative before adjusting the demonstrated per-copy rotations. Use a point-number-seeded random value remapped into 0–360 degrees to distribute branches around the trunk. The instructor tests axes until the rotation goes around the trunk rather than changing the wrong angle.
For upward tilt, place a Transform in the branch construction and drive its rotation from a named stamp variable on the branch-copy node. The lookup needs the copy-node path, variable name, and fallback value. The example random angle range is 20–60 degrees, with changes to the random seed producing other arrangements.
Repeat the copy relationship for twigs. The duplicated copy initially still uses the branch group, so it must be changed to the renamed twig group. This is a useful check whenever a working branch is duplicated: the new geometry can look plausible while still selecting the wrong parent’s points.
Use the taper attribute for attached-part size
Around 25:01, the instructor replaces merges at the wood junctions with Boolean Union so intersecting parts can be combined, then works toward a remeshed result. Inspect the junctions after changing branch sizes or angles; the recording does not establish watertight geometry for every possible control combination.
From 27:02, add stamped scale values for the nested branches. The first version uses point-based randomness, then is corrected to use the grayscale color attribute without randomization. Remap that value into an example scale interval of 0.1–1 and read it in the relevant Transform’s uniform scale.
This change links attached-part size to the existing taper pattern: smaller parts appear where the parent’s control attribute calls for them. A random scale would create variation, but would not necessarily preserve that progression toward the tips.
Repeat the relationship at the other branching level. Adjust the point density and selected ranges if too many branches are being copied. More attachment points can multiply the downstream work because every branch carries its own twigs and eventual leaves.
Model a leaf with its attachment at the origin
At 32:01, create a Grid for a leaf, using a one-by-one size and five-by-five segments in the example. Edit its points into a leaf-like outline and curve the surface slightly. This is simple modeled geometry rather than a texture card with an opacity map.
Create another Copy Stamp after the twig’s PolyWire stage so it can use points on that generated surface. Add Group by Range to select a subset of those points for leaves. The instructor tries a selection such as one point in seven, but the group highlighting does not behave as expected.
After a pause around 38:03, the cause of that visualization problem remains unknown. The instructor tests the group through the leaf-copy result instead: selecting it as the template group and changing its range does change the visible leaf distribution. This is an observed workaround for inspecting the output, not a diagnosed repair of the viewport highlighting issue.
Use the range limits to remove leaves from unwanted base or end regions, checking point numbers rather than assuming the surface numbering increases in the desired spatial direction. Then move the leaf’s attachment end to the origin. Copies should grow from their stem end at each target point instead of being centered halfway through the twig.
Vary leaf size and orientation without losing placement control
From 40:07, use the carried color attribute to scale leaves. The instructor first tests a direct multiplication, disables Transform Cumulative, and then uses a remapped range of approximately 0.6–1 for more controlled size variation.
Add point-seeded random rotations remapped into 0–360 degrees, copying the expression to the other rotation fields in the demonstration. That creates a varied look, but copying the same seed expression does not by itself establish independent random values on each axis. The lesson judges the visible arrangement rather than claiming a particular statistical distribution.
Adjust the leaf group’s density and range again after seeing the full tree. A good leaf shape in isolation can still produce an overloaded canopy or leaves at unwanted junctions when repeated. The final remeshed evaluation is slower because it must process the larger procedural construction.
Give each copied branch its own shape variation
Around 45:06, the instructor adds a branch-jitter stamp variable. Its value uses a random function of the target point number, scaled by ten and offset by one in the example. The offset keeps the demonstrated result away from zero.
Reference that variable from the Point Jitter setup in the source branch. The stamp expression’s quoted node path and variable name are corrected during entry. After cooking, changing the stamp values produces visibly different branch shapes instead of repeating the exact same jittered branch everywhere.
This final step distinguishes transforming a repeated shape from changing the shape generated for each copy. Rotation and scale can arrange one branch in many ways; a varying upstream jitter value changes the branch itself.
The finished geometry combines those levels of control: a shaped trunk, selected attachment regions, taper-driven size, per-copy orientation, and varying branch form. The recording leaves the asset’s parameter packaging, texturing, animation, and production optimization for further work, while providing a complete source-grounded construction of the procedural tree shown.