コンテンツにスキップ

ClipsAPIの基本構造をつくる

ipynbFile UsdClipsAPI_01__ClipsAPIの基本構造をつくる.ipynb

In [13]:

1
from pxr import Usd,Sdf

In [14]:

1
ROOT_PATH = "d:/work/py37/USD/clip/"

In [18]:

1
2
3
4
5
# Clipを作る
a = Sdf.Layer.FindOrOpen(ROOT_PATH + 'clip1.usda')
b = Sdf.Layer.FindOrOpen(ROOT_PATH + 'clip2.usda')
print(a.ExportToString())
print(b.ExportToString())

Success

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#usda 1.0

def "Model"
{
    double a.timeSamples = {
        1: 1,
    }
    double b = 10
}


#usda 1.0

def "Model"
{
    double a.timeSamples = {
        1: 1234,
    }
    double b.timeSamples = {
        1: 10,
    }
}

In [16]:

1
2
3
4
5
# ClipのレイヤーからManifestを作る。
# Manifestは、ClipsAPIを使用するときに、クリップでアクセスアトリビュートの
# インデックスを作るためのファイル。
# ClipのうちTimeSampleを持つアトリビュートの定義を作る。
manifest = Usd.ClipsAPI.GenerateClipManifestFromLayers([a,b],'/Model')

In [17]:

1
2
3
4
# 結果は、アノニマスレイヤーとして取得できるので
# このアノニマスレイヤーを保存して使用する。
print(manifest.ExportToString())
manifest.Export(ROOT_PATH + "/manifest_sample.usda")

Success

1
2
3
4
5
6
7
#usda 1.0

over "Model"
{
    double a
    double b
}

Success

1
True

In [7]:

1
2
3
4
5
6
7
# Clipを作るためのレイヤーを用意。
stage = Usd.Stage.Open(ROOT_PATH + "stage.usda")
stage.Reload()
print(stage.GetRootLayer().ExportToString())
prim = stage.GetPrimAtPath('/TestModel')
# ClipsAPIの引数で、Clipを追加したいSdfPathを指定する
clipAPI = Usd.ClipsAPI(prim)

Success

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#usda 1.0
(
    endTimeCode = 4
    startTimeCode = 1
)

def "TestModel"
{
    double a
    double b
}

In [8]:

1
2
3
4
# Clipのレイヤーをセット
clipAPI.SetClipAssetPaths([Sdf.AssetPath(ROOT_PATH + 'clip1.usda'),
                           Sdf.AssetPath(ROOT_PATH + 'clip2.usda')])
clipAPI.SetClipManifestAssetPath(Sdf.AssetPath(ROOT_PATH + 'manifest_sample.usda'),'default')

Success

1
True

In [9]:

1
print(stage.GetRootLayer().ExportToString())

Success

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#usda 1.0
(
    endTimeCode = 4
    startTimeCode = 1
)

def "TestModel" (
    clips = {
        dictionary default = {
            asset[] assetPaths = [@d:/work/py37/USD/clip/clip1.usda@, @d:/work/py37/USD/clip/clip2.usda@]
            asset manifestAssetPath = @d:/work/py37/USD/clip/manifest_sample.usda@
        }
    }
)
{
    double a
    double b
}

In [10]:

1
2
# Clip側にある読み先のPrimを指定する
clipAPI.SetClipPrimPath('/Model')

Success

1
True

In [11]:

1
2
3
4
5
# CurrentTime時にどのClipを使用するかIndexを指定する
for num,c in enumerate([a,b]):
    currentActive  = list(clipAPI.GetClipActive())
    currentActive.append([num+1,num])
    clipAPI.SetClipActive(currentActive)

In [12]:

1
2
print(stage.GetRootLayer().ExportToString())
stage.GetRootLayer().Export(ROOT_PATH + 'result.usda')

Success

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#usda 1.0
(
    endTimeCode = 4
    startTimeCode = 1
)

def "TestModel" (
    clips = {
        dictionary default = {
            double2[] active = [(1, 0), (2, 1)]
            asset[] assetPaths = [@d:/work/py37/USD/clip/clip1.usda@, @d:/work/py37/USD/clip/clip2.usda@]
            asset manifestAssetPath = @d:/work/py37/USD/clip/manifest_sample.usda@
            string primPath = "/Model"
        }
    }
)
{
    double a
    double b
}

Success

1
True