def testSkelWithoutBindPose(self): """ Tests export of a Skeleton when a bindPose is not fully setup. """ mayaFile = os.path.join(self.inputPath, "UsdExportSkeletonTest", "UsdExportSkeletonWithoutBindPose.ma") cmds.file(mayaFile, force=True, open=True) frameRange = [1, 5] usdFile = os.path.abspath('UsdExportSkeletonWithoutBindPose.usda') cmds.usdExport(mergeTransformAndShape=True, file=usdFile, shadingMode='none', frameRange=frameRange, exportSkels='auto') stage = Usd.Stage.Open(usdFile) skeleton = UsdSkel.Skeleton.Get(stage, '/cubeRig/skel/joint1') self.assertEqual(skeleton.GetBindTransformsAttr().Get(), Vt.Matrix4dArray([Gf.Matrix4d(1.0)])) self.assertEqual(skeleton.GetJointsAttr().Get(), Vt.TokenArray(['joint1'])) self.assertEqual(skeleton.GetRestTransformsAttr().Get(), Vt.Matrix4dArray([Gf.Matrix4d(1.0)])) self.assertTrue(skeleton.GetPrim().HasAPI(UsdSkel.BindingAPI)) skelBindingAPI = UsdSkel.BindingAPI(skeleton) self.assertTrue(skelBindingAPI) animSourcePrim = skelBindingAPI.GetAnimationSource() self.assertEqual(animSourcePrim.GetPath(), '/cubeRig/skel/joint1/Animation') animSource = UsdSkel.Animation(animSourcePrim) self.assertTrue(animSource) self.assertEqual(skeleton.GetJointsAttr().Get(), Vt.TokenArray(['joint1'])) self.assertEqual(animSource.GetRotationsAttr().Get(), Vt.QuatfArray([Gf.Quatf(1.0, Gf.Vec3f(0.0))])) self.assertEqual(animSource.GetScalesAttr().Get(), Vt.Vec3hArray([Gf.Vec3h(1.0)])) self.assertEqual( animSource.GetTranslationsAttr().Get(Usd.TimeCode.Default()), Vt.Vec3fArray([Gf.Vec3f(5.0, 5.0, 0.0)])) self.assertEqual( animSource.GetTranslationsAttr().Get(1.0), Vt.Vec3fArray([Gf.Vec3f(0.0, 0.0, 0.0)])) self.assertEqual( animSource.GetTranslationsAttr().Get(2.0), Vt.Vec3fArray([Gf.Vec3f(1.25, 1.25, 0.0)])) self.assertEqual( animSource.GetTranslationsAttr().Get(3.0), Vt.Vec3fArray([Gf.Vec3f(2.5, 2.5, 0.0)])) self.assertEqual( animSource.GetTranslationsAttr().Get(4.0), Vt.Vec3fArray([Gf.Vec3f(3.75, 3.75, 0.0)])) self.assertEqual( animSource.GetTranslationsAttr().Get(5.0), Vt.Vec3fArray([Gf.Vec3f(5.0, 5.0, 0.0)]))
def main(): print("UsdSkelAppleFixup Begin.") # Create a new out usd file that sublayers the in usd file. All edits # will go to the out usd file. Start and end time is copied over. inFile = args.inusd outFile = args.outusd from pxr import Usd, UsdGeom, UsdSkel, Sdf dstLyr = Sdf.Layer.CreateNew(outFile) srcLyr = Sdf.Layer.FindOrOpen(inFile) stage = Usd.Stage.Open(dstLyr) stage.SetEditTarget(dstLyr) layerStack = dstLyr.subLayerPaths layerStack.insert(len(layerStack), inFile) start = int(srcLyr.startTimeCode) end = int(srcLyr.endTimeCode) stage.SetStartTimeCode(start) stage.SetEndTimeCode(end) # Find all the skinned meshes and copy over the animation source to them # The the skel, anim, and mesh prims. skelPrims = [ prim for prim in Usd.PrimRange(stage.GetPseudoRoot()) if prim.IsA(UsdSkel.Skeleton) ] meshPrims = [ prim for prim in Usd.PrimRange(stage.GetPseudoRoot()) if prim.IsA(UsdGeom.Mesh) ] for skelPrim in skelPrims: skelCache = UsdSkel.Cache() skel = UsdSkel.Skeleton(skelPrim) skelQuery = skelCache.GetSkelQuery(skel) skelAnimQuery = skelQuery.GetAnimQuery() skelAnim = UsdSkel.Animation(skelAnimQuery.GetPrim()) for mesh in meshPrims: rel = FindSkelBindingRel(stage, mesh) if rel: for target in rel.GetTargets(): if target == skelPrim.GetPath(): print("Copying the animationSource relationship to " + mesh.GetName()) # wire up the skeleton and animation source rels for temporary compatbility with Apple's expectations mesh.CreateRelationship( UsdSkel.Tokens.skelAnimationSource).AddTarget( skelAnim.GetPrim().GetPath()) mesh.CreateRelationship( UsdSkel.Tokens.skelSkeleton).AddTarget( skelPrim.GetPath()) dstLyr.Save()
def test_AnimQuery(self): """Tests anim query retrieval.""" cache = UsdSkel.Cache() stage = Usd.Stage.CreateInMemory() anim = UsdSkel.Animation.Define(stage, "/Anim") self.assertTrue(cache.GetAnimQuery(anim)) # Backwards-compatibility. self.assertTrue(cache.GetAnimQuery(prim=anim.GetPrim())) self.assertFalse(cache.GetAnimQuery(UsdSkel.Animation()))