Problem: Why Mapping Exists
Natsura needed a way to control growth that wasn't just “add more sliders to every node”.
For scalars, Mappings solve this: they turn attributes (and other data) into parameter values, so you can build your own behaviours on top of the simulation instead of waiting for new hard-coded parameters.
What Mapping Enables
Mapping lets a single parameter:
Examples of what that means artistically:
Mapping doesn’t change the simulation itself.
It decides what numbers nodes see when they ask “what is my pitch/width/fork probability/etc. here?”.
How to Use Mapping (Artist View)
You can always drop back to “just a number” if you don’t need mapping.
Mapping is there when a single slider stops being enough.
How Mapping Works (Broadly)
At a high level:
If you know Houdini:
You don’t need to know any of the internals to use mapping.
All of the “program assembly” is hidden behind the map nodes.
Where Mapping Is Used Now
Today, mapping is mainly used on Grow to drive:
Where Mapping Will Be Used
Mapping is being extended to:
The goal is that anywhere you see “this could be more interesting than a constant slider”, you can plug in a map chain.
Current Mapping Options and Combinations
Core map node types and how they combine:
u, age, root_distance, branch_id, or a custom one.u lives here).Interesting artistic combinations:
u and then add small random variation → natural, non-uniform branches.u → branches that bend more toward light at the tips than at the base.generation to make higher generations more random and lower generations more stable.Advanced Topics (for Technical Users)
The rest of this section is aimed at tech artists, TDs, and developers.
If you only care about artistic control, you can stop reading here.
Internal Mental Model
Internally, a map chain is:
<parm>.At this stage, the chain does not know which concrete attribute it will write; <parm> is just “whatever this parameter will be”.
Discrete Stages: From Map Chain to Running Code
There are several distinct steps between “artist builds a map chain” and “code runs per point”:
<parm> as its output symbol.<parm> to a real attribute<parm> actually means.<parm> becomes @cluster_pitch.<parm> is replaced by that attribute name.Each Grow with mapped parameters ends up with its own unique program per mapped parameter (or per group of parameters), but:
Primitives, Streams, and primuv
To avoid recompiling whenever a slider or ramp changes:
Code:
Data:
At evaluation time:
primuv() (and related calls) on stream 1 to read its parameters from primitives.Typical pattern:
u) as a UV (or a 1D parameter).primuv() on stream 1 to sample @P.y (or other components) on a ramp curve primitive.<parm>.Because primitives can hold arbitrary data, this mechanism can support more complex map behaviours over time without changing the program structure.
Re-evaluation vs Re-compilation
This separation has a key consequence:
You only pay the cost of rebuilding/compiling when:
Customising and Extending Mapping
For advanced users:
<parm> convention and the expected inputs.Beyond per-node customisation:
One-Line Mental Model
Mappings are deferred scalar programs: