Instances of FBModel can be assigned to a Rigid Body Physical Property, allowing them to react to forces such as gravity. Models connected to a Rigid Body Physical Property can also collide among each other, as well as with the scene's ground plane.
A Rigid Body Physical Property object is instantiated via FBCreateObject(), using the 'Browsing/Templates/Physical Properties' Asset Browser path, and the 'Rigid Body' entry name. Models are connected to a Rigid Body Physical Property using FBConnect().
# Apply a Rigid Body physical property to the models. # The pActivation parameter defines the Activation value. # 0: Active | 1: Active at Collision | 2: Passive def applyRigidBody(pModelList, pActivation): # Create the rigid body object from the Asset Browser. rigidBody = FBCreateObject( 'Browsing/Templates/Physical Properties', 'Rigid Body', 'Rigid Body' ) # Set the Activation property. activationProp = rigidBody.PropertyList.Find('Activation') activationProp.Data = pActivation # If we are using Active activation, set the Correct Mass Center to false. if(pActivation == 0) : correctMassCenter = rigidBody.PropertyList.Find('Correct Mass Center') correctMassCenter.Data = False # Connect the rigid body to the models. for model in pModelList: FBConnect(rigidBody, model)
The 'Activation' property of a Rigid Body Physical Property denotes when the rigid body behavior of the connected models activates. The accepted values for the 'Activation' property are described below.
Activation Value | Description |
---|---|
0 | Active. The connected models react to physical forces when the session is set to Live or when recording begins. |
1 | Active at Collision. A connected model only begins to react to physical forces when another model collides with it or if it is manipulated. |
2 | Passive. The connected models are not affected by physical forces (ex: gravity), but can collide with other objects. |
The rigid body calculations are solved by a Physics Solver, which must be added to the scene via FBCreateObject() using the Asset Browser path 'Browsing/Templates/Solvers' and the 'Physics Solver' entry name. The 'Gravity' property of the Physics Solver object defines the direction of gravity. The default value for the 'Gravity' property is (0, -9.81, 0).
# Create a physics solver. def createPhysicsSolver(): solver = FBCreateObject( 'Browsing/Templates/Solvers', 'Physics Solver', 'Physics Solver' ) # Set the gravity to accelerate upwards. solver.PropertyList.Find('Gravity').Data = FBVector3d(0, 9.81, 0) # Activate the Physics solver. solver.Active = True solver.Live = True
Program Summary: In the following program, a large cube collides with a grid of smaller cubes below it. The large cube's Rigid Body Physical Property has its Activation set to 0 (active), allowing it to fall when the program is run. The Rigid Body Physical Property bound to the smaller cubes has its Activation set to 1 (active on collision), making the smaller cubes fall to the ground plane if they experience a collision.
from pyfbsdk import * ############################################################### # Helper Function(s). # ############################################################### # Create a primitive from the asset browser. def createModel(pTranslation, pScalingCoefficient): #model = FBCreateObject( 'Browsing/Templates/Elements/Primitives', 'polySphere', 'polySphere' ) model = FBCreateObject( 'Browsing/Templates/Elements/Primitives', 'Cube', 'Cube' ) model.Name = 'myModel' model.Translation = pTranslation model.Scaling = FBVector3d(pScalingCoefficient, pScalingCoefficient, pScalingCoefficient) model.Show = True return model # Create a planar grid of models. def createGrid(pCenter, pModelsPerSide): gridModels = [] spacing = 20 for i in range(-int(pModelsPerSide/2), int(pModelsPerSide/2) + 1): for j in range(-int(pModelsPerSide/2), int(pModelsPerSide/2) + 1): xOffset = pCenter[0] + i * spacing yOffset = pCenter[1] zOffset = pCenter[2] + j * spacing # Create the model at the specific offset. model = createModel(FBVector3d(xOffset, yOffset, zOffset), 0.65) gridModels.append(model) return gridModels # Apply a Rigid Body physical property to the models. # The pActivation parameter defines the Activation value. # 0: Active | 1: Active at Collision | 2: Passive def applyRigidBody(pModelList, pActivation): # Create the rigid body object from the Asset Browser. rigidBody = FBCreateObject( 'Browsing/Templates/Physical Properties', 'Rigid Body', 'Rigid Body' ) # Set the Activation property. activationProp = rigidBody.PropertyList.Find('Activation') activationProp.Data = pActivation # If we are using Active activation, set the Correct Mass Center to false. if(pActivation == 0) : correctMassCenter = rigidBody.PropertyList.Find('Correct Mass Center') correctMassCenter.Data = False # Connect the rigid body to the models. for model in pModelList: FBConnect(rigidBody, model) # Create a physics solver. def createPhysicsSolver(): solver = FBCreateObject( 'Browsing/Templates/Solvers', 'Physics Solver', 'Physics Solver' ) # Set the gravity to accelerate slowly downwards. solver.PropertyList.Find('Gravity').Data = FBVector3d(0, -2, 0) # Activate the Physics solver. solver.Active = True solver.Live = True ############################################################### # Main. # ############################################################### FBApplication().FileNew() model = createModel(FBVector3d(0, 200, 20), 1.5) applyRigidBody([model], 0) # Active gridModels = createGrid(FBVector3d(0, 75, 0), 7) applyRigidBody(gridModels, 1) # Active at Collision createPhysicsSolver()