Upscales a smoke simulation to a higher resolution by adding turbulence.
The Gas Up Res DOP is designed to scale a low resolution smoke simulation to a higher resolution one. It adds detail by adding turbulent noise at a small enough scale to avoid affecting the bulk motion of the smoke.
Parameters
| Fluid Type | This hint controls how source relationships are used. |
| Use Low Res Source | Rather than computing the source relationship at the full resolution of the upres sim, it is computed at the lower resolution of the base sim. This is faster and will preserve the fuzziness of the base sim’s source. Using the high resolution for the source will create a tighter smoke effect. |
| Auto Regenerate Rest Field | The turbulence needs a rest field so it tracks naturally with the smoke. One option is to use the rest field from the base simulation, in which case this should be turned off. If this is turned on, a new rest field is created. This rest field is partly-updated on demand, so is not useful for shading purposes. |
| Rest Regeneration Threshold | How stretched the rest field can get before it is reset. Making this too near one will just cause the rest field to always be reset. |
| Rest Advection Speed | How quickly the rest field moves compared to the rest of the fluid sim. Slowing down the rest field reduces the rate it stretches, but can cause the turbulence to appear to stick or lag. |
Turbulence Scale
| Source | Controls how the turbulence field is built. The turbulence field defines a per-voxel scale for the amount of turbulence to add to the upres simulation. |
| Peak Turbulence | The output of the sourcing operation might not be in a 0..1 interval. The peak turbulence acts as the hard cap in the turbulence calcluation that will scaled to 1. |
| Blur Radius | Sharp changes in the turbulence amplitude will result in kinks in the resulting velocity field. The Blur Radius allows one to smooth out the turbulence field by the given world distance. |
| Scale By Density | Multiplies the turbulence field by the low resolution density field, after the latter is sent through remap density. This only works if there is a lowresdensity field which currently requires the Gas Upres Object to have Import Density turned on and be in Pyro mode for Fluid Type. |
| Remap Turbulence Scale | The turbulence field is sent through this mapping to get the final amplitude. This allows one to sculpt the fall off or perform an edge detection. |
Noise
| Amplitude | An overall scale to the added turbulence. |
| Separate Temperature Amplitude | When performing a Pyro fluid upres you can have a different amplitiude for the temperature than the density. One can thus have the temperature field move smoother than the density field. This will double the cost of the operation. |
| Compute Frequency Cutoff | Because the goal of the upres stage is not to affect the low resolution simulation, this automatic frequency cut off can have the solver properly determine what frequency will add detail without changing the base simulation’s behaviour. |
| Low Res Divisions | The divisions of the low resolution smoke. This is used to determine the cutoff frequence for the turbulent noise. The uniform divisions is divided by the largest size parameter to get the frequency. |
| Size | The size of the low resolution smoke. This is used only in calculating the cut off frequency. |
| Frequency Scale | The calculated frequency is then multiplied by this scale. Values less than one will introduce lower frequencies, possibly overwriting frequencies already present in the base simulation. However, because numerical diffusion has tended to dampen those frequencies already, it is often useful to dial this down to 0.7 to avoid their being an apparent frequency gap, or lacunarity, between the base sim and the upres sim. |
| Temporal Frequency | Controls how quickly the turbulence changes over time. |
| Noise Type | What form of noise basis to use for the curl noise. |
| Turbulence | Controls how many octaves of noise are added. Each octave doubles the effective resolution of the grid, so this should be set to the number of doublings. For example, if the base smoke is 32^3 and the high res 128^3, there are two doublings so 2 octaves is necessary. If you have a frequency scale of 0.5, you will need an extra doubling to account for it. Turbulence above this amount will show up as chatter at the finest detail level, which may or may not be what you are looking for. |
| Step Size | When computing curl noise, derivatives are computed by making small steps in each axis of this size. If you have a very large (in terms of size, not resolution) simulation the default may lead to precision issues. For example, a volume 10,000 houdini units on a size might need a stepsize of 1 rather than the default. |
Advanced
These options control the resimulation that has to be done in the upres stage. They are usually linked to the corresponding base simulation, but can be overridden to give a different behaviour in the upres. For example, overriding soot rate with a lower value will cause the upres pyro solver to have less smoke than its base simulation did.
| Clear |
|
Outputs
| First Output | The operation of this output depends on what inputs are connected to this node. If an object stream is input to this node, the output is also an object stream containing the same objects as the input (but with the data from this node attached). If no object stream is connected to this node, the output is a data output. This data output can be connected to an Apply Data DOP, or connected directly to a data input of another data node, to attach the data from this node to an object or another piece of data. |
Local variables
| channelname | This DOP node defines a local variable for each channel and parameter on the Data Options page, with the same name as the channel. So for example, the node may have channels for Position (positionx, positiony, positionz) and a parameter for an object name (objectname). Then there will also be local variables with the names positionx, positiony, positionz, and objectname. These variables will evaluate to the previous value for that parameter. This previous value is always stored as part of the data attached to the object being processed. This is essentially a shortcut for a dopfield expression like:
dopfield($DOPNET, $OBJID, dataName, "Options", 0, channelname)
If the data does not already exist, then a value of zero or an empty string will be returned. |
| DATACT | This value is the simulation time (see variable ST) at which the current data was created. This value may not be the same as the current simulation time if this node is modifying existing data, rather than creating new data. |
| DATACF | This value is the simulation frame (see variable SF) at which the current data was created. This value may not be the same as the current simulation frame if this node is modifying existing data, rather than creating new data. |
| RELNAME | This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP). In this case, this value is set to the name of the relationship the data to which the data is being attached. |
| RELOBJIDS | This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP). In this case, this value is set to a string that is a space separated list of the object identifiers for all the Affected Objects of the relationship to which the data is being attached. |
| RELOBJNAMES | This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP). In this case, this value is set to a string that is a space separated list of the names of all the Affected Objects of the relationship to which the data is being attached. |
| RELAFFOBJIDS | This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP). In this case, this value is set to a string that is a space separated list of the object identifiers for all the Affector Objects of the relationship to which the data is being attached. |
| RELAFFOBJNAMES | This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP). In this case, this value is set to a string that is a space separated list of the names of all the Affector Objects of the relationship to which the data is being attached. |
| ST | 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 |
| SF | 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). |
| 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. |
| SFPS | This value is the inverse of the TIMESTEP value. It is the number of timesteps per second of simulation time. |
| SNOBJ | 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
like |
| NOBJ | 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). |
| OBJ | 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). |
| OBJID | 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). |
| ALLOBJIDS | This string contains a space separated list of the unique object identifiers for every object being processed by the current node. |
| ALLOBJNAMES | This string contains a space separated list of the names of every object being processed by the current node. |
| OBJCT | 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 |
| OBJCF | 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). |
| OBJNAME | 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”,
specifying |
| DOPNET | 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. |
Note
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.