|On this page|
The RBD Auto Freeze DOP provides an easy way to freeze down elements of an RBD simulation that have come to a rest.
Freezing is done by adding a new piece of data to the RBD Object called CumulativeMovement. This data tracks the total magnitude of the linear and angular velocity over time. It stores a moving-average which ensures that even if an object momentarily reaches equilibrium (say, at the top of a bounce), the object isn’t frozen. This does mean that the thresholds have to be adjust depending on the simulation, however. The default values are set up for approximately unit-sized objects.
Frozen RBD objects will continue to support other RBD objects, but will no longer move as a result of collisions. This allows for faster processing and ensures that no jittering will occur.
The Melt parameter can be used to wake up RBD Object on a per-object basis. Note that barring the use of melt, once the object is frozen it will stay frozen. Even if the ground disappears from under it, it will continue to float in air unaware of the change.
Often an RBD simulation will have a lot of objects initially at rest, then start moving, and then come to a rest a second time. The RBD Freeze DOP is supposed to mark as frozen objects that return to rest.
For example, if you have a sphere dropping onto a ground plane, at frame 0 the sphere is stationary and has zero cumulative motion. We don’t want to freeze this sphere so we wait for it to first acquire enough motion to be considered truly moving before it is eligible for freezing.
Determines if any testing will be done for auto-freezing. If this is zero, the objects are not tested for freezing and their active values are not updated.
If you are switching to keyframed animation, it is important to make sure that this parameter is zero during keyframed animation to prevent the active value from being overwritten.
Only the input objects which match the Object Group filter will be tested and frozen.
Angular Velocity Scale
The angular velocity of an object is measured in degrees per second. A unit sized object moving its own length every second will have a velocity of 1, but the same sized object rotating once every second would have an angular velocity of 360.
Because this DOP tries to combine these two measurements, it is important to have a scale factor to bring them into the same general range. This factor can be approximate and, for unit sized objects, the default of 0.01 is good.
The total motion over time is tracked by adding the current motion and scaling the previous amount of motion by this decay factor.
1 will cause motion to remain 100% intact, while a value of
.9 would cause the motion to decay to 90% of it’s previous motion. A value of
0 will cause each frame’s motion to have to stand on its own. This means that objects at the top of their parabolic arcs may suddenly freeze.
This will also affect the values needed for the Enable Threshold and Freeze Threshold.
Before an object is a candidate for freezing, it must first attain a minimum cumulative movement.
By having a high threshold you can ensure that objects that are waiting to be hit are not frozen before they first get hit. On the other hand, if this is not high enough, moving objects may never become candidates for freezing.
If you monitor the CumulativeMovement data over time you can get a good idea of a proper threshold for a simulation.
Note that the Enable Threshold should always be larger than the Freeze Threshold or there is the risk that an object freezes before it manages to get moving.
When an object’s cumulative movement has exceeded the Enable Threshold, it is then tested against the Freeze Threshold. When its cumulative movement falls below the Freeze Threshold, the RBD Auto Freeze DOP will turn off the Active Value for that object. This causes the object to stop reacting to the simulation.
The object’s velocity is also zeroed out since, because its simulation has been turned off, it will no longer be moving.
Setting the object’s melt value to 1 will wake it up again if it is frozen. If it is not yet frozen, it will clear the history of whether the Enable Threshold has been reached. After setting the object’s melt value to one, the object will not refreeze until the Enable Threshold is again reached and then the Freeze Threshold is passed.
If the Melt parameter evaluates to non-zero, the object will have its Active Value set to one. The object will then react to the simulation. When the melt parameter is set to one, the object also resets the hasbeenbig flag in the CumulativeMovement data. The object thus will not refreeze until the Enable Threshold is again reached.
The RBD Objects who will be tested for automatic freezing.
The exact same set of objects that feed into the input are sent out through the single output.
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.