Skip to content

OpenMaskedで一部だけロード

ipynbFile UsdStage_02__OpenMaskedで一部だけロード.ipynb
Stage.OpenMaskedは、その名の通り PopulationMaskで指定したSdfPathに含まれるPrimのみ
ロードすることができる機能。
巨大なシーンのうち、一部だけ(レンダーセッティングだけ、ある区画のモデルだけ)を編集したい場合
すべてをロードするのではなく、Maskを使用して部分的にロードすることで
より効率的に作業することができる。

In [7]:

1
2
3
import os
os.makedirs('usd')
ROOT_DIR = os.getcwd() + "/usd"

In [4]:

1
from pxr import Usd,Sdf

In [9]:

1
2
3
4
5
stage = Usd.Stage.CreateInMemory()
stage.DefinePrim("/a")
stage.DefinePrim("/b")
stage.DefinePrim("/c")
stage.GetRootLayer().Export(f"{ROOT_DIR}/loadLayer.usd")

Success

1
True

In [18]:

1
2
3
# SdfPathで指定した部分だけロードするのがOpenMasked
# SdfPathのリストを作るのがStagePopulationMask
mask = Usd.StagePopulationMask().Add('/a')

In [15]:

1
stageB = Usd.Stage.OpenMasked(f"{ROOT_DIR}/loadLayer.usd",mask)

In [17]:

1
2
# /a のみロードするようにMaskした例。
print(stageB.ExportToString())

Success

1
2
3
4
5
6
7
8
9
#usda 1.0
(
    doc = """Generated from Composed Stage of root layer /work_dir/usd/loadLayer.usd
"""
)

def "a"
{
}

In [20]:

1
2
3
4
# 2つのPopulationMaskを結合
maskB = Usd.StagePopulationMask().Add('/b')
union = Usd.StagePopulationMask().Union(mask,maskB)
print(union)

Success

1
UsdStagePopulationMask([ /a /b ])

In [32]:

1
2
3
4
5
# 2つのPopulationMaskの重複部分を取得する場合
intersection = Usd.StagePopulationMask().Intersection(mask,maskB)
print(intersection)
# PopulationMaskにPathが含まれてるか?
print(intersection.IsEmpty())

Success

1
2
UsdStagePopulationMask([ ])
True

In [25]:

1
2
stageC = Usd.Stage.OpenMasked(f"{ROOT_DIR}/loadLayer.usd", mask.GetUnion(maskB))
print(stageC.ExportToString())

Success

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#usda 1.0
(
    doc = """Generated from Composed Stage of root layer /work_dir/usd/loadLayer.usd
"""
)

def "a"
{
}

def "b"
{
}

In [26]:

1
mask.Includes(maskB)

Success

1
False

In [29]:

1
maskC = Usd.StagePopulationMask().Add('/a')

In [31]:

1
2
# maskに maskC の要素が含まれるかどうか
mask.Includes(maskC)

Success

1
True

In [33]:

1
2
# Get~だと、今のMaskと引数のMaskの結果を取得できる
print(mask.GetUnion(maskB))

Success

1
UsdStagePopulationMask([ /a /b ])