|On this page|
The Source Apply DOP turns DOPs and external objects into sources for the attached fluid sim. It also includes numerous post-processing options to manipulate how the object gets turned into a fluid source.
There are two ways to use this. First, it can take a second input. This is often a Static Object which brings in the external object. The second approach is to specify the object in the Non-Wired Sources parameters.
In all cases, the same processing procedure is used. First the object is turned into a Signed Distance Field (SDF). Then the SDF is converted to a 0..1 fog volume storing how much to source each voxel. This conversion is first done with a lookup from the distance to surface, using the Feathering tab. Then optional noise can be added. Finally, point attributes can be multiplied into the value to further mask the emission.
Despite the name, the Source Apply can also apply other field affects such as pump or sink effects.
An overall scale to the source effect.
The source apply will create a new DOP object to store the computed emission information. The Source tab controls the creation of this object along with the where the SDF comes from.
Creation Frame Specifies Simulation Frame
Determines if the creation frame refers to global Houdini
$F) or to simulation specific frames (
latter is affected by the offset time and scale time at the
DOP network level.
The frame number on which the object will be created. The object is created only when the current frame number is equal to this parameter value. This means the DOP Network must evaluate a timestep at the specified frame, or the object will not be created.
For example, if this value is set to 3.5, the
Timestep parameter of the DOP Network must be changed to
1/(2*$FPS) to ensure the DOP Network has a timestep at frame
Number of Objects
Instead of making a single object, you can create a number of
identical objects. You can set each object’s parameters
individually by using the
The name for the created object. This is the name that shows up in the details view and is used to reference this particular object externally.
While it is possible to have many objects with the same name, this complicates writing references, so it is recommended to use something like
$OBJID in the name.
Solve On Creation Frame
For the newly created objects, this parameter controls whether or not the solver for that object should solve for the object on the timestep in which it was created.
Usually this parameter will be turned on if this node is creating objects in the middle of a simulation rather than creating objects for the initial state of the simulation.
By preventing a large object from being cached, you can ensure there is enough room in the cache for the previous frames of its collision geometry.
This option should only be set when you are working with a very large sim. It is much better just to use a larger memory cache if possible.
Source Object List
This is a list of DOP objects in the same simulation that should be used as sources.
SOP Path, OBJ Path
Specify geometry to use as the original source.
If this geometry is animating, the Use Deforming Geometry must be set in the SDF Generation tab.
Use Object Transform
The transform of the object containing the chosen SOP is applied to the geometry. This is required if there is scaling applied to the source geometry at the object level.
To compute the proper grid scaling for the source grids, a path to a fluid object is needed. The default python expression will find this by searching the first input.
The source geometry can be hidden by turning this off.
The final density field controlling how much emission occurs in each voxel.
The signed distance field from which the density is computed. Displaying this is useful for determining how the SDF Generation process is working.
This stage takes the source geometry and turns it into an SDF.
Copy SDF Volume from Source Object
If the source is something like a Static Object, it will already have its own SDF generation parameters. Thus its SDF can be retrieved directly.
If the source is a SOP Path, this controls whether the signed distance field is built in the SOP’s space or in the fluid space. In particular, if one wants to override the number of divisions or use the Proxy Volume, Copy SDF must be set.
Use Deforming Geometry
If the source is animated, then the SDF has to be rebuilt every frame.
Build From Particles
Instead of trying to build an SDF, directly write to the fog field from particle points.
NOTE: In this mode feathering is disabled.
Use Volume Based Collision Detection
Turning on this option causes the RBD solver to use a volume representation of this object for collision detection.
The volume representation results in very fast collision detection and very robust results that are tolerant of temporary interpenetrations. The disadvantage is that a volume representation cannot be used to represent a flat object such as a grid, or a hollow sphere.
When this toggle is turned off, the collision detection is geometry-based rather than volume-based. In this case, the collision code will track the trajectories of moving objects over time to find out whether collisions occurred. This allows more accurate results than volume-based collision detection. For this to work, Cache Simulation must be enabled on the DOP network.
The internal representation used for collision detection is converted to visible geometry. This is useful for debugging problems with collision detection.
This parameter controls the color of the guide geometry.
Use ray intersection with the geometry to create an accurate volumetric representation of the geometry.
Instead of using rays to determine if points are inside or outside, evaluate the metaball field.
This should be used with Laser Scanning turned off on geometry that consists solely of metaballs.
Calculate the bounding box for the geometry, and create a volumetric representation that precisely fills that bounding box. This box is always axis aligned in the DOP object’s local space, which is set by the position data.
Use Object Transform bakes the object transform into the geometry’s transform, leaving the Position Data in world space. Turning this off causes the object transform to be send to the Position Data, which causes the object’s local space to be reoriented.
Calculate the bounding sphere for the geometry, and create a volumetric representation that precisely fills that bounding sphere.
Calculate the bounding box for the geometry, and create a volumetric representation that divides that box along its smallest axis. Everything below that plane is considered inside, and everything above is outside.
This mode is primarily useful for creating ground planes or immovable walls.
Use the distance to the surface or curve. If the Offset Surface is 0, no volume will be made. A positive offset surface will create just that - an offset volume around the object’s surface. This is useful for turning thin objects or wires into actual solids.
The divisions are ignored in this mode, instead they are computed from the first volume or VDB primitive in the geometry. The computed divisions are chosen to match the voxel size of the source volume. The volume primitive is sampled raw and treated as a signed distance field. The assumption is that the source is the output of an Iso Offset or VDB From Polygons SOP. If it isn’t a true signed distance fields, unusual things may happen with RBD collisions.
If Non Square is chosen, the specified size is divided into the given number of divisions of voxels. However, the sides of these voxels may not be equal, possibly leading to distorted simulations.
When an axis is specified, that axis is considered authoritative for determining the number of divisions. The chosen axis' size will be divided by the uniform divisions to yield the voxel size. The divisions for the other axes will then be adjusted to the closest integer multiple that fits in the required size.
Finally, the size along non-chosen axes will be changed to represent uniform voxel sizes. If the Max Axis option is chosen, the maximum sized axis is used.
When By Size is chosen, the Division Size will be used to compute the number of voxels that fit in the given sized box.
Controls the creation of the volumetric representation of this object. This should be set fine enough to capture the desired features of the geometry.
The resolution of the key axis on the voxel grid. This allows you to control the overall resolution with one parameter and still preserve uniform voxels. The Uniform Voxels option specifies which axis should be used as the reference. It is usually safest to use the maximum axis.
The explicit size of the voxels. The number of voxels will be computed by fitting an integer number of voxels of this size into the given bounds.
In laser scan mode the volumetric representation is built by sending rays along the primary axes. Only the closest and farthest intersections are used. The space between these two points is classified as inside, and the rest outside.
The laser scan mode will work even with geometry which has poorly defined normals, self intersects, or is not fully watertight. The disadvantage is that interior features can’t be represented as they are not detected.
When laser scanning is turned off, the volumetric representation is still built by sending rays along the primary axes. All intersections are found, however. Each pair of intersections is tested to see if the segment is inside or outside. This relies on the normal of the geometry being well defined (i.e., manifold, no self intersections), and the geometry being watertight. Complicated shapes with holes can be accurately represented, however.
Even with the best made geometry, numerical imprecision can result in incorrect sign choices. This option will cause the volumetric representation to be post-processed to look for inconsistent signs. These are then made consistent, usually plugging leaks and filling holes.
This takes time, and can be turned off in cases where the volumetric representation is known to generate without problems.
The Fix Signs method alone will smooth out, and usually eliminate, sign inversions. However, it is possible for regions of wrong-sign to become stabilized at the boundary of the volumetric representation. This option will force all voxels on the boundary to be marked as exterior. The Fix Signs method will be much less likely to stabilize incorrectly then.
If you want a hollow box, one method is to build one box inside the other and not use Laser Scanning. A more robust method is to just specify the inner box and use sign inversion. This treats everything outside of the box as inside, allowing the more robust Laser Scanning method to be used.
Sign Sweep Threshold
After the fix signs process is complete there can still be inconsistent areas in the SDF. Large blocks can become stabilized and stick out of the SDF. A second sign sweep pass can be performed to try to eliminate these blocks.
The sign sweep threshold governs how big of a jump has to occur for a sign transition to be considered inconsistent. If the values of the sdf change by more than this threshold times the width of the cell, it is considered an invalid sign transition. The original geometry is then ray intersected to determine inside/outside and the result used to determine which sign is correct. The correct sign is then propagated forward through the model.
Max Sign Sweep Count
The sign sweeps are repeated until no signs are flipped (ie, all transitions are within the threshold) or this maximum is reached. Too low of a sign sweep threshold may prevent the process from converging. Otherwise, it tends to converge very quickly.
A constant amount to offset the signed distance field by. This can be used grow the object slightly or shrink it. Note that it can’t be grown much beyond its original size or it will hit the bounding box of the signed distance field.
This specifies the tolerance used for ray intersections when computing the SDF. This value is multiplied by the size of the geometry and is scale invariant.
The geometry which will be used rather than the base geometry for computing the SDF. This can be a volume or VDB in the case of Volume Sample mode to allow one better control over the cached data.
Controls the operation for this object’s volume data.
If a file with the specified name exists already, it is read from disk. Otherwise the volume is created based on the other parameters on this page, and the specified file is created on disk. This file will never be deleted automatically, even when exiting the application.
The specified file is read from disk.
The volume is created using the other parameters on this page, and is then written to the specified file on disk.
The file is never read or written. The parameters on this page are used to create the volume.
The name of the file to access according to the choice of File Modes above. This is always .simdata file format. Saving to a .bgeo extension will not save a .bgeo file.
Chooses between colliding points against volume or colliding edges against volume.
Optionally, the point attributes
noedgevolume may be added to the geometry to disable individual points/edges from participating in
collision detection against a volume object. An edge is disabled
if either of its endpoints is disabled.
Convert To Poly
This enables conversion of primitives (such as spheres) in the geometry into polygons. Only polygons are used for collision detection.
When this flag is turned on, polygons in the geometry are triangulated.
This controls the Level Of Detail of the triangulation. It is used to specify the point density in the U and V directions.
The barycenters of each polygon can be included in the collision detection as points or edges (connected to the vertices of the primitive).
Particle to Field
The particle attribute to accumulate into the source field. If not enabled, each particle will be treated as having an attribute value of 1.0
Scale by Voxel Volume
Divide the particle contribution by the voxel volume, thereby normalizing the total added independent of the resolution of the field. Because volumes are often small, you likely need to reduce emission amount significantly vs not using this option.
After the SDF field is built, it is next converted into the Density field. Feathering allows you to control the fall-off with distance to surface.
NOTE: Feathering is disabled if Build From Particles is enabled.
Treat SDF as Fog
Depending on the Source object, the SDF may not be a proper signed distance field, but already a 0-1 fog volume. This occurs if sourcing from another smoke sim or from a SOP with a fog volume. In these cases the SDF Generation mode should be set to Volume Sample and Treat SDF as Fog turned on to avoid the feathering look up pass.
By default, any voxels inside the volume are marked as full emitters. However, if you want a emit-from-surface effect, you can add a fall off curve for the interior as well.
The distance is the length of the fall off curve. The feather curve is how the density will fall off with distance to the surface. The left is the surface, the right the farthest from the surface.
Noise will multiply the source field with a noise field. This will turn the solid object into a Swiss cheese like object, often resulting in nicer chaotic behavior.
How much to mix the result of this calculation with the original source. A value of 0 is the same as not adding noise, 0.5 will blend 50% of each, and 1 will use the remapped noise value as the final source value.
These control an anti-aliased flow noise VOP.
How harsh the transition from 0 to 1 should be. A high contrast results in a sharp boundary between the kept and discarded regions, a low contrast results in a smoother drop off.
Remaps the source value. This allows remapping the fall-off of the transition from sourced to non-sourced voxels. Alternately, by building a hill shaped ramp, one can extract a contour of the source shape rather than a solid version.
Multiply by Attribute
Finally, the computed density can be multiplied by a point attribute. The closest points are used for the mapping computation. Combined with the Paint SOP, this allows the easy painting of emission regions.
Name of the float point attribute to use for scaling.
Voxels farther than this from the closest point will be zeroed, rather than using the closest point value. This can be important for efficiency for large number of points or sparse volumes.
The effective temperature of this object for sourcing.
Sets the source to an explicit velocity.
The velocity value should be used if the Velocity Type on the Sources tab of the Fluid Solver is set to use Point Velocity.
If there isn’t a
v attribute present, it is computed by differing frames. If
v is present, it overrides the previous frame. You can add a
v attribute to any source type, and it will use the
v attribute rather than the point deltas.
The fluid object to add a source to.
An optional DOP object to use as a source.
This value is the simulation time for which the node is being evaluated.
This value may not be equal to the current Houdini time represented by the variable T, depending on the settings of the DOP Network Offset Time and Time Scale parameters.
This value is guaranteed to have a value of zero at the
start of a simulation, so when testing for the first timestep of a
simulation, it is best to use a test like
$ST == 0 rather than
$T == 0 or
$FF == 1.
This value is the simulation frame (or more accurately, the simulation time step number) for which the node is being evaluated.
This value may not be equal to the current Houdini frame number represented by the variable F, depending on the settings of the DOP Network parameters. Instead, this value is equal to the simulation time (ST) divided by the simulation timestep size (TIMESTEP).
This value is the size of a simulation timestep. This value is useful to scale values that are expressed in units per second, but are applied on each timestep.
This value is the inverse of the TIMESTEP value. It is the number of timesteps per second of simulation time.
This is the number of objects in the simulation. For nodes that create objects such as the Empty Object node, this value will increase for each object that is evaluated.
A good way to guarantee unique object names is to use an expression
This value is the number of objects that will be evaluated by the current node during this timestep. This value will often be different from SNOBJ, as many nodes do not process all the objects in a simulation.
This value may return 0 if the node does not process each object sequentially (such as the Group DOP).
This value is the index of the specific object being processed by the node. This value will always run from zero to NOBJ-1 in a given timestep. This value does not identify the current object within the simulation like OBJID or OBJNAME, just the object’s position in the current order of processing.
This value is useful for generating a random number for each object, or simply splitting the objects into two or more groups to be processed in different ways. This value will be -1 if the node does not process objects sequentially (such as the Group DOP).
This is the unique object identifier for the object being processed. Every object is assigned an integer value that is unique among all objects in the simulation for all time. Even if an object is deleted, its identifier is never reused.
The object identifier can always be used to uniquely identify a given object. This makes this variable very useful in situations where each object needs to be treated differently. It can be used to produce a unique random number for each object, for example.
This value is also the best way to look up information on an object using the dopfield expression function. This value will be -1 if the node does not process objects sequentially (such as the Group DOP).
This string contains a space separated list of the unique object identifiers for every object being processed by the current node.
This string contains a space separated list of the names of every object being processed by the current node.
This value is the simulation time (see variable ST) at which the current object was created.
Therefore, to check if an object was created
on the current timestep, the expression
$ST == $OBJCT should
always be used. This value will be zero if the node does not process
objects sequentially (such as the Group DOP).
This value is the simulation frame (see variable SF) at which the current object was created.
This value is equivalent to using the dopsttoframe expression on the OBJCT variable. This value will be zero if the node does not process objects sequentially (such as the Group DOP).
This is a string value containing the name of the object being processed.
Object names are not guaranteed to be unique within a simulation. However, if you name your objects carefully so that they are unique, the object name can be a much easier way to identify an object than the unique object identifier, OBJID.
The object name can
also be used to treat a number of similar objects (with the same
name) as a virtual group. If there are 20 objects named "myobject",
strcmp($OBJNAME, "myobject") == 0 in the activation field
of a DOP will cause that DOP to operate only on those 20 objects. This
value will be the empty string if the node does not process objects
sequentially (such as the Group DOP).
This is a string value containing the full path of the current DOP Network. This value is most useful in DOP subnet digital assets where you want to know the path to the DOP Network that contains the node.
Most dynamics nodes have local variables with the same names as the node’s parameters. For example, in a Position node, you could write the expression:
$tx + 0.1
…to make the object move 0.1 units along the X axis at each timestep.
The following examples include this node.
This example demonstrates how to diffuse the density of a smoke simulation using the Gas Diffuse DOP.
In this example, two smoke volumes are merged together using a Gas Embed Fluid DOP and some feathering to help provide a smoother transition between the volumes.