Versions Compared

Key

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

During Simulation

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

The script creates particles from the "Sphere01" (active rigid body) object's vertices when it is colliding with other objects. The object's velocity is transferred to the particles, but must be greater or equal to the a given speed limit. When the object rests no particles will be emitted.

New particles are being added to a standard particle fluid "Container01" node. Be aware that the number of particles can grow quickly, and we recommend using low-resolution objects for this example:

 

 

...

Code Block
languagepy
import random

rndNumber       = random.uniform(-0.2,0.2)
speedLimit      = 2.5
emitter         = scene.get_PB_Emitter("Container01")
collisionObject = scene.getObject("Sphere01")
 
if (len(collisionObject.getCollidingObjects()) > 0):
	vertices       = collisionObject.getVertices()
	objectVelocity = collisionObject.getVelocity()
 
	for vertex in vertices:
		if (objectVelocity.module() >= speedLimit):
			vertexVelocity = vertex.getVelocity()
			vertexVelocity.scale(1.2 + rndNumber)
			emitter.addParticle(vertex.getPosition(), vertexVelocity)

As Batch Process

The script covers an object's surface with particles:Add this script to a "Batch Script" editor (F10) and execute it with Script > Run.

Get a torus object's polygons and get the three vertices of each polygon. Then, calculate each polygon's midpoint and place a particle there:

 

Code Block
languagepy
polygonObject   = scene.getObject("Torus01")
polygons        = polygonObject.getFaces()
vertices        = polygonObject.getVertices()
vertexPosition  = Vector.new(0,0,0)
container       = scene.get_PB_Emitter("Container01")
 
for polygon in polygons:
    vertexIndices  = polygon.getIndices()
    vertex0        = vertices[vertexIndices[0]]
    vertex1        = vertices[vertexIndices[1]]
    vertex2        = vertices[vertexIndices[2]]
 
    vertex0Pos     = vertex0.getPosition()
    vertex1Pos     = vertex1.getPosition()
    vertex2Pos     = vertex2.getPosition()
 
    vertexPosition = vertex0Pos + vertex1Pos + vertex2Pos
    vertexPosition.set(vertexPosition.x / 3, vertexPosition.y / 3, vertexPosition.z / 3)
 
    container.addParticle(vertexPosition, Vector.new(0,0,0))