Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 def preTearDown(self, prim):
     objects = self.getMObjects(prim)
     nodePolyCube = self.objectFromString(objects[0])
     pc = UsdGeom.Cube(prim)
     self.writeEdits(pc, nodePolyCube)
     return True