예제 #1
0
    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)]))
예제 #2
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()
예제 #3
0
    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()))