def mass_information_fn(self, prim): massInfo = UsdPhysics.RigidBodyAPI.MassInformation() if prim.IsA(UsdGeom.Cube): cubeLocalToWorldTransform = UsdGeom.Xformable( prim).ComputeLocalToWorldTransform(Usd.TimeCode.Default()) extents = Gf.Transform(cubeLocalToWorldTransform).GetScale() cube = UsdGeom.Cube(prim) sizeAttr = cube.GetSizeAttr().Get() sizeAttr = abs(sizeAttr) extents = extents * sizeAttr # cube volume massInfo.volume = extents[0] * extents[1] * extents[2] # cube inertia inertia_diagonal = Gf.Vec3f( 1.0 / 12.0 * (extents[1] * extents[1] + extents[2] * extents[2]), 1.0 / 12.0 * (extents[0] * extents[0] + extents[2] * extents[2]), 1.0 / 12.0 * (extents[0] * extents[0] + extents[1] * extents[1])) massInfo.inertia = Gf.Matrix3f(1.0) massInfo.inertia.SetDiagonal(inertia_diagonal) # CoM massInfo.centerOfMass = Gf.Vec3f(0.0) # local pose if prim == self.rigidBodyPrim: massInfo.localPos = Gf.Vec3f(0.0) massInfo.localRot = Gf.Quatf(1.0) else: # massInfo.localPos, massInfo.localRot lp, lr = self.get_collision_shape_local_transfrom( cubeLocalToWorldTransform, self.rigidBodyWorldTransform) massInfo.localPos = Gf.Vec3f(lp) massInfo.localRot = Gf.Quatf(lr) else: print("UsdGeom type not supported.") massInfo.volume = -1.0 return massInfo
def preTearDown(self, prim): objects = self.getMObjects(prim) nodePolyCube = self.objectFromString(objects[0]) pc = UsdGeom.Cube(prim) self.writeEdits(pc, nodePolyCube) return True