Houdini 20.5 Nodes Dynamics nodes

RBD Auto Freeze dynamics node

Automatically freezes RBD Objects that have come to rest

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.

Note

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.

Parameters

Activation

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.

Group

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.

Motion Decay

The total motion over time is tracked by adding the current motion and scaling the previous amount of motion by this decay factor.

Values of 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.

Note

This will also affect the values needed for the Enable Threshold and Freeze Threshold.

Enable 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.

Freeze Threshold

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.

Melt

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.

Inputs

First

The RBD Objects who will be tested for automatic freezing.

Outputs

First

The exact same set of objects that feed into the input are sent out through the single output.

Locals

ST

The simulation time for which the node is being evaluated.

Depending on the settings of the DOP Network Offset Time and Scale Time parameters, this value may not be equal to the current Houdini time represented by the variable T.

ST 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.

SF

The simulation frame (or more accurately, the simulation time step number) for which the node is being evaluated.

Depending on the settings of the DOP Network parameters, this value may not be equal to the current Houdini frame number represented by the variable F. Instead, it is equal to the simulation time (ST) divided by the simulation timestep size (TIMESTEP).

TIMESTEP

The size of a simulation timestep. This value is useful for scaling values that are expressed in units per second, but are applied on each timestep.

SFPS

The inverse of the TIMESTEP value. It is the number of timesteps per second of simulation time.

SNOBJ

The number of objects in the simulation. For nodes that create objects such as the Empty Object DOP, SNOBJ increases for each object that is evaluated.

A good way to guarantee unique object names is to use an expression like object_$SNOBJ.

NOBJ

The number of objects that are evaluated by the current node during this timestep. This value is often different from SNOBJ, as many nodes do not process all the objects in a simulation.

NOBJ may return 0 if the node does not process each object sequentially (such as the Group DOP).

OBJ

The index of the specific object being processed by the node. This value always runs from zero to NOBJ-1 in a given timestep. It does not identify the current object within the simulation like OBJID or OBJNAME; it only identifies 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 is -1 if the node does not process objects sequentially (such as the Group DOP).

OBJID

The unique 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. This is very useful in situations where each object needs to be treated differently, for example, to produce a unique random number for each object.

This value is also the best way to look up information on an object using the dopfield expression function.

OBJID is -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

The simulation time (see variable ST) at which the current object was created.

To check if an object was created on the current timestep, the expression $ST == $OBJCT should always be used.

This value is zero if the node does not process objects sequentially (such as the Group DOP).

OBJCF

The simulation frame (see variable SF) at which the current object was created. It is equivalent to using the dopsttoframe expression on the OBJCT variable.

This value is zero if the node does not process objects sequentially (such as the Group DOP).

OBJNAME

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 strcmp($OBJNAME, "myobject") == 0 in the activation field of a DOP will cause that DOP to operate on only those 20 objects.

This value is the empty string if the node does not process objects sequentially (such as the Group DOP).

DOPNET

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 DOP, you could write the expression:

$tx + 0.1

…to make the object move 0.1 units along the X axis at each timestep.

Examples

Stack Example for RBD Auto Freeze dynamics node

Teapots are dropped every ten frames onto a ground plane. The RBD AutoFreeze DOP is used to detect and freeze the teapots that have come to rest, stabilizing and speeding up the simulation.

Dynamics nodes