The Ultimate Houdini node reference
Visit the Node Bible
To learn more, please log in or sign up for free to explore the Node Bible.
The POP Wind node applies wind to particles by updating their targetv and airresist attributes.
Drag to resize
It's worth pointing out the difference between the POP wind and the POP Force Dop right away - The POP Force will keep applying a forces onto particles over time. This means that your particles get faster and faster as the pop force applies more velocity. The POP Wind will not make things get faster and faster without limit. Instead, it pushes velocity towards the velocity value specified by the @targetv attribute. Once particles reach that velocity, it will try to stay there.
Drag to resize
-- This turns the node on/off
-- This correlates with DOP streams and any imported groups from sops. Read up on the Group SOP node bible entry if you're not familiar with groups yet.
-- Provides a visualization of the force being applied. This does not apply to the noise tab.
-- Should the particle's mass affect how much the force affects it? If so, turn this off. Adding mass makes it more difficult to control, but also provides interesting variety to the simulation.
-- This will update the @targetv attribute to this value. Think of this parameter as the velocity value that the particles are trying to be at. In practice, it's often a good idea to drive this using CHOPs to add variety to the wind direction.
-- This sets the @airresist attribute, and tells the particles how quickly it's going to reach the target velocity defined by @targetv.
-- The vexpressions here are intended to work in conjunction with the Force parameter above. This is not intended to work with the noise tab settings. Be sure to click the drop-down for examples on vexpressions you can use here, and for more information about vex, visit Vex Foundations I
Drag to resize
This section utilizes a curl noise
-- How much force should be applied to the particles with the noise
-- How large the curls ought to be with the curl noise. For more information about how curl noises work, visit this link:
https://www.cct.lsu.edu/~fharhad/ganbatte/siggraph2007/CD2/content/papers/046-bridson.pdf. In practice, it's common to use this noise for large, gradual movement in your particles. Setting a large swirl size will help achieve this.
-- Image this as scaling up the swirls in different directions. To visualize this better, visit this link:
Then, imagine these swirl patterns be stretched in 3 dimensions (x,y,z). The swirl scale lets you scale in these directions.
-- Over time, the curl noise will change direction. How quickly it changes its direction is based on the pulse length. Higher pulse length = direction changes slowly. Smaller pulse length = direction changes quickly.
The next few parameters deal with adding additional smaller details to the simulation via turbulence. Turbulence happens with a certain number of iterations (that's what you're adjusting with the turbulence number), and it's easy to think of the "iteration" of something as the number of times this node will repeat a calculation. In this case, the "turbulence" calculation is calculated multiple times to move the particles around with small details.
-- This is how much force the turbulence is allowed to apply to the particles with each iteration. In the world of noises, each iteration is considered an "octive," and the more technical definition for roughness would be the relative amplitude for each octive. The higher this goes, the more impact each iteration of turbulence will have.
-- According to the docs, "Noise attenuation exponent" which... isn't very helpful. From my estimation, the "Noise attenuation" multiplies the resulting position by an exponent at the very end. If you set this to a value of 2, notice how everything goes in the positive x,y,z direction. That is because it's taking the final position and adding an exponent to (x,y,z). So, as an example, if the position in x calculated a value of -5 and we put this to the power of 2 (amp=2) then that's like doing -52. This would give us -5*-5 = 25. Likewise, everything will go negative if you provide fractional values.
In practice, attenuation isn't usually modified and doesn't seem to have any practical use within the node parameters from what I can tell. However, in vex, it is possible to utilize amplitude without it becoming uni-directional in either the positive or negative directions. The process is outlined here: https://www.keatonwilliamson.com/houdini/noise/about_noise
-- This allows an offset for the noise, and in practice, offers you a different seed to work with. In other words, move the offset for a randomly different version of the noise.
-- Here you can alter the magnitude of these noise parameters using vex. Be sure to play with the dropdown menu for examples and visit Vex Foundations I if you've never used vex before.
Drag to resize
Bindings can be used to tell which nodes are allowed to work with each other. Nodes which belong to the same geometry name are allowed to work with each other.
As an example, if you set the binding on a pop source to "goobie" and leave everything else at its defaults, no other node in your dop network will want to work with the popsource because they have a different binding name. If, however, you go to your solver and change its binding to "goobie" as well - now the pop solver will work with the pop source node. Lastly, if you set a pop force's binding to "goobie", that will now allow the pop force to interact with the pop source node. NOTE: Global forces (ex: the Gravity DOP) do not feature any bindings and will work on all data within the dop network.
Drag to resize
Evaluation Node Path:
In Houdini, you can use ch() expressions within the parameters of this node to do things. By default the path is set to "." This means to look at the current node when using the ch() expression. From the Houdini docs:
"For nodes with local expressions, this controls where ch() style expressions in VEX are evaluated with respect to. By making this ., you can ensure relative references work. It is important to promote this if you are embedding a node inside an HDA you are also exporting the local expressions."
Most of the time you don't need to worry about this.
Drag to resize
This section deals with a situation which you might run into while using vexpressions. In vex, you must specify which input to access data from for most functions. This means 0 = first input 1 = second input, and so-on. In DOPs, you don't have the ability to plug into those inputs. Instead, you specify where that data comes from here in the input tab.
Take this example: Let's say that you want to access a point attribute from the geometry that's plugged into the first input of your dop network. You could say something like this:
v@myAttribute = point(0,"Cd",44)
This function can translate to - "I'm looking for a point attribute, read this data from geometry input #0 (which corresponds with input 1 in the inputs tab), I'm looking for an attribute called "Cd", and I want to read this attribute from point #44."
And then, within the Input tab, you can say that the first input argument (which is 0) corresponds to the first context geometry.