Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The script calculates the average velocities of a scene's active rigid bodies for each frame of a simulation and prints out the result:

Initializing the Objects

Add the script to Simulation Flow (Ctrl/Cmd + F2) > FramesPreSimulationPre.

The script calculates the normals of particles of a Dyverso domain ("DY_Domain") based on their neighbours. A calculation like that can be used to detect border particles.

To get the normals it is necessary to calculate the particles' centre of gravity by adding up all position values and building an average value. This average is then compared against a threshold.

Border particle detection works best with thin sheets of fluid, e.g. a "Linear" emitter with a "Sheeter" daemon. The main problem is to find a suitable threshold.

Code Block
# Get all objects and create an empty list
objects       = scene.getObjects()
activeObjects = []

# Loop through the objects and add them to the "activeObjects" when they are active rigid bodies
for entry in objects:
	dynamicsMode = entry.getParameter("Dynamics")
	if (dynamicsMode == "Active rigid body"):
		activeObjects.append(entry)

# The global variable is necessary to transfer the active objects from "SimulationPre" to "FramesPost".
scene.setGlobalVariableValue("activeObjects", activeObjects)

Calculating the Velocity

Add the script to Simulation Flow (Ctrl/Cmd + F2) > FramesPost.

The output is formatted ("%.2f" % averageVelocity) and clips the result to two digits, e.g. 3.67 instead of 3.671472813

Code Block
languagepy
# Read out the global variable and make it local again
# Count how many objects are inside "activeObjects"
activeObjects  = scene.getGlobalVariableValue("activeObjects")
numOfObjects   = len(activeObjects)
objectVelocity = 0.0

# Go through the objects and add up their velocities
for entry in activeObjects:
	objectVelocity += entry.getVelocity().module()

# Calculate the average and print it
averageVelocity = objectVelocity / numOfObjects
 
scene.message("The average velocity is "+str("%.2f" % averageVelocity)+" m/s")