Physics
This part includes the APIs for setting up physics in the stage , read more about USDPhysics
Rigid body & Collision
from pxr import UsdPhysics
# check rigidbody api
prim.HasAPI(UsdPhysics.RigidBodyAPI)
prim.HasAPI(pxr.UsdPhysics.CollisionAPI)
# get api
UsdPhysics.RigidBodyAPI.Get(stage, path)
UsdPhysics.CollisionAPI.Get(stage, path)
# apply/add api
UsdPhysics.RigidBodyAPI.Apply(stage, path)
UsdPhysics.CollisionAPI.Apply(stage, path)
Set up GPU for physics
from omni.physx import acquire_physx_interface
physx = acquire_physx_interface()
physx.overwrite_gpu_setting(1) # 1 means using GPU
Set mass
mass = 10
massAPI = UsdPhysics.MassAPI.Apply(prim)
massAPI.GetMassAttr().Set(mass)
Set/Get Gravity value
# FIXME: correct gravity api
# Assume _my_world is of type World
# self._my_world ._physics_context.get_gravity()
# meters_per_unit = get_stage_units()
# self._my_world ._physics_context.set_gravity(value=-9.81 / meters_per_unit)
Set up collision
from omni.physx.scripts import utils, physicsUtils
utils.setPhysics(prim=cup_shape_prim, kinematic=False)
utils.setCollider(prim=cup_shape_prim, approximationShape="convexDecomposition")
# other approximationShape: none, triangulate, convexHull, e.t.c.
Set up physical material
def _setup_physics_material(self, path: Sdf.Path):
from pxr import UsdGeom, UsdLux, Gf, Vt, UsdPhysics, PhysxSchema, Usd, UsdShade, Sdf
if self._physicsMaterialPath is None:
self._physicsMaterialPath = self._stage.GetDefaultPrim().GetPath().AppendChild("physicsMaterial")
UsdShade.Material.Define(self._stage, self._physicsMaterialPath)
material = UsdPhysics.MaterialAPI.Apply(self._stage.GetPrimAtPath(self._physicsMaterialPath))
material.CreateStaticFrictionAttr().Set(self._material_static_friction)
material.CreateDynamicFrictionAttr().Set(self._material_dynamic_friction)
material.CreateRestitutionAttr().Set(self._material_restitution)
collisionAPI = UsdPhysics.CollisionAPI.Get(self._stage, path)
prim = self._stage.GetPrimAtPath(path)
if not collisionAPI:
collisionAPI = UsdPhysics.CollisionAPI.Apply(prim)
# apply material
physicsUtils.add_physics_material_to_prim(self._stage, prim, self._physicsMaterialPath)