ゲーム開発
Unity
UnrealEngine
C++
ゲーム数学
ゲームAI
サウンド
アニメーション
GBDK
制作日記
3DCG
Houdini
Blender
USD
グラフィックス
テクノロジ
ツール開発
フロントエンド関連
サーバサイド関連
ソフトウェア設計
ハードウェア関連
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
その他
都会のエレキベア
ラーメン日記
四コマ漫画
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • ゲーム数学
    • ゲームAI
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • 3DCG
    • Houdini
    • Blender
    • USD
    • グラフィックス
  • テクノロジ
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • ソフトウェア設計
    • ハードウェア関連
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • その他
    • 都会のエレキベア
    • ラーメン日記
    • 四コマ漫画
    • おすすめアイテム
    • おもしろコラム
  1. ホーム
  2. 20251229_01_open_usd_python

【OpenUSD】USD入門 その2:PythonでUSDを生成・操作してみる

USDPythonPixar
2025-12-29

ぷらずも
ぷらずも
みなさんこんにちは! ぷらずもです!
エレキベア
エレキベア
こんにちクマ~~~
ぷらずも
ぷらずも
今日は引き続きUSDを触っていきます! 前回概要までまとめたので、今回は実際に Pythonによる実行環境を作って操作 してみようと思います。
【OpenUSD】USD入門 その1:概要とデータ構造についてまとめる
2025-12-25

▲前回はUSDの概要についてまとめた

エレキベア
エレキベア
ついにUSDを触るクマね 楽しみクマ~~~

Python実行環境を構築する

ぷらずも
ぷらずも
それでは座学はこのあたりまでにして、実際にUSDを触れる環境を用意していこうと思います。 USDは前述した通りOSSになっていて、以下のGitHubリポジトリとして公開されています。
エレキベア
エレキベア
環境構築手順周りもGitHubの方に記載されているクマね
ぷらずも
ぷらずも
なお今回は v25.11 のバージョンを使用して、Python環境で触れる環境を構築 します。 なお、自分の環境で試したスクリプトのサンプルは以下に格納してありますので、こちらもよければご参照ください。

環境構築手順

ぷらずも
ぷらずも
環境構築手順については 公式リポジトリのREADMEに記載されている ので基本的にはそちらの手順に従いましょう。 以下は Windowsでビルドする場合に必要な情報 をかいつまんだものになります。
  1. (ローカルにない場合) Visual Studio、Pythonをインストールします。

    • バージョンについては VERSIONS.md を参照
    • 今回はVisual Studio 2022、Python 3.9.13 を導入
    • C++コンパイル環境も必要になるので、「C++によるデスクトップ開発」にチェックを入れてインストールする
    20251225_01_14
    ▲VisualStudioインストール時にC++コンパイル環境も導入しておく

  2. 該当バージョンのPythonのpipで必要なライブラリをインストールします。

    pip install PyOpenGL PySide2
    
  3. OpenUSDリポジトリをローカルにクローンします。

    git clone https://github.com/PixarAnimationStudios.git
    
  4. VisualStudio同梱の「Developer Command Prompt for VS 2022」を開いて、下記コマンドでビルドを実行します。

    cd [OpenUSDインストールフォルダ]
    python OpenUSD\build_scripts\build_usd.py "[実行環境作成先のパス]"
    
    • ※結構時間かかります。(自分の場合は30分ほどでした)
  5. Successメッセージが表示されれば完了です。

    Success! To use USD, please ensure that you have:
    
        The following in your PYTHONPATH environment variable:
        [実行環境作成先のパス]\lib\python
    
        The following in your PATH environment variable:
        [実行環境作成先のパス]\bin
        [実行環境作成先のパス]\lib
    
ぷらずも
ぷらずも
ここまでで以下のように指定したフォルダに環境が用意されていれば完了です!
20251225_01_15
▲処理が完了して環境が用意された状態

エレキベア
エレキベア
シンプルクマが、自分でビルドしないといけないのは面倒クマね・・・

Pythonスクリプトの実行方法

ぷらずも
ぷらずも
次に実行方法についてですが、作成した 実行環境内のフォルダをパスとして通す必要 があります。 以下を通しておくと、USD関連モジュールや各種ツールが使えるようになります。
  • PYTHONPATH
    • [実行環境作成先のパス]\lib\python
  • PATH
    • [実行環境作成先のパス]\bin
    • [実行環境作成先のパス]\lib
set PYTHONPATH=[実行環境作成先のパス]\lib\python
set PATH=[実行環境作成先のパス]\lib

python [実行するPythonスクリプトパス].py
▲コマンドプロンプトから環境変数を通して実行する場合
エレキベア
エレキベア
ビルドして実行環境は用意されているクマから、そこにパスを通せばいいクマね
ぷらずも
ぷらずも
USD関連の処理は、pxrモジュールからインポートして使用することが出来ます。 チュートリアル例に習って、「青色のSphereを同梱しただけのUSD」を作成する処理 と実行結果は以下のようになります。
from pxr import Usd, UsdGeom

stage = Usd.Stage.CreateNew("usd/HelloWorld.usda")
UsdGeom.Xform.Define(stage, "/hello")
UsdGeom.Sphere.Define(stage, "/hello/world")
stage.GetRootLayer().Save()
▲Sphereを含んだUSDを作成するスクリプト
#usda 1.0

def Xform "hello"
{
    def Sphere "world"
    {
        float3[] extent = [(-2, -2, -2), (2, 2, 2)]
        color3f[] primvars:displayColor = [(0, 0, 1)]
        double radius = 2
    }
}

▲実行して作成されたUSD
エレキベア
エレキベア
おお~~簡単にUSDファイルが作成されたクマね
ぷらずも
ぷらずも
usdviewというUSDファイル専用Viewer も用意されているので、こちらも同様にパスを通して実行することで確認することが出来ます。
set PYTHONPATH=[実行環境作成先のパス]\lib\python
set PATH=[実行環境作成先のパス]\lib

usdview [USDファイルパス]
usdviewにUSDファイルパスを渡すことで起動する
20251225_01_09
▲起動した状態、青色のSphereが表示された

エレキベア
エレキベア
専用ViewerがあるとDCCツールをいちいち開かなくて済むしいいクマね
ぷらずも
ぷらずも
なおデフォルト状態でかなりカクカクな見た目になっていると思いますが、こちらは Complexity(複雑度)から変更 することが出来ます。
20251225_01_16
▲複雑度を変更できる(Ctrl + +、Ctrl + -)

Pythonによる操作例

ぷらずも
ぷらずも
それではいくつか USD操作処理のサンプル を置いておきます。 基本的に公式チュートリアルの内容からピックアップしたものなので、詳しい内容が知りたい方はそちらをご参照ください。
エレキベア
エレキベア
しっかりチュートリアルも用意していただいていてありがたいクマね
ぷらずも
ぷらずも
チュートリアルで慣れたら、APIドキュメントを見つつより本格的な実装に挑戦してみるとよさそうですね。
Reference設定例
from pxr import Usd, UsdGeom

# Set Default Prim
stage = Usd.Stage.Open("usd/HelloWorld.usda")
hello_prim = stage.GetPrimAtPath("/hello")
stage.SetDefaultPrim(hello_prim)
# Save Root Layer
stage.GetRootLayer().Save()
__print_root_layer(stage)

# Create Ref USD
ref_stage = Usd.Stage.CreateNew("usd/HelloWorld_Ref.usda")

# Ref Hello 1: Default Settings
ref_hello_1 = ref_stage.OverridePrim("/refHello1")
ref_hello_1.GetReferences().AddReference("./HelloWorld.usda")

# Ref Hello 2: Change Translate And Color Attr
ref_hello_2 = ref_stage.OverridePrim("/refHello2")
ref_hello_2.GetReferences().AddReference("./HelloWorld.usda")
ref_hello_2_xform = UsdGeom.Xformable(ref_hello_2)
UsdGeom.XformCommonAPI(ref_hello_2_xform).SetTranslate((4, 4, -4))
ref_hello_2_sphere = UsdGeom.Sphere.Get(ref_stage, "/refHello2/world")
ref_hello_2_sphere.GetDisplayColorAttr().Set([(1, 0, 0)])

# Save Root Layer
ref_stage.GetRootLayer().Save()
▲SphereをReferenceして新たなSphereを2つ配置する
#usda 1.0
(
    defaultPrim = "hello"
)

def Xform "hello"
{
    def Sphere "world"
    {
        float3[] extent = [(-2, -2, -2), (2, 2, 2)]
        color3f[] primvars:displayColor = [(0, 0, 1)]
        double radius = 2
    }
}

▲Reference先はdefaultPrim定義が必要
#usda 1.0

over "refHello1" (
    prepend references = @./HelloWorld.usda@
)
{
}

over "refHello2" (
    prepend references = @./HelloWorld.usda@
)
{
    double3 xformOp:translate = (4, 4, -4)
    uniform token[] xformOpOrder = ["xformOp:translate"]

    over "world"
    {
        color3f[] primvars:displayColor = [(1, 0, 0)]
    }
}


▲Reference設定とプロパティの上書きが確認できる
20251225_01_08
▲HelloWorld_Ref.usda を開くと2つのSphereが並ぶのが確認できる

VariantSets設定例
from pxr import Usd, UsdGeom

# Create Base USD
stage = Usd.Stage.CreateNew("usd/HelloWorld_VariantSets.usda")
xform = UsdGeom.Xform.Define(stage, "/hello")
sphere = UsdGeom.Sphere.Define(stage, "/hello/world")
stage.GetRootLayer().Save()

# Create VariantSets
hello_prim = stage.GetPrimAtPath("/hello")
shading_variant = hello_prim.GetVariantSets().AddVariantSet("shadingVariant")
shading_variant.AddVariant("red")
shading_variant.AddVariant("green")
shading_variant.AddVariant("blue")

# Set VariantSets Values
sphere_schema = UsdGeom.Sphere(sphere)
color_attr = sphere_schema.GetDisplayColorAttr()
shading_variant.SetVariantSelection("red")
with shading_variant.GetVariantEditContext():
    color_attr.Set([(1, 0, 0)])
shading_variant.SetVariantSelection("green")
with shading_variant.GetVariantEditContext():
    color_attr.Set([(0, 1, 0)])
shading_variant.SetVariantSelection("blue")
with shading_variant.GetVariantEditContext():
    color_attr.Set([(0, 0, 1)])
shading_variant.ClearVariantSelection()

# Save Root Layer
stage.GetRootLayer().Save()
▲VariantSetsの設定例(色違いのバリエーション)
#usda 1.0

def Xform "hello" (
    prepend variantSets = "shadingVariant"
)
{
    def Sphere "world"
    {
    }
    variantSet "shadingVariant" = {
        "blue" {
            over "world"
            {
                color3f[] primvars:displayColor = [(0, 0, 1)]
            }

        }
        "green" {
            over "world"
            {
                color3f[] primvars:displayColor = [(0, 1, 0)]
            }

        }
        "red" {
            over "world"
            {
                color3f[] primvars:displayColor = [(1, 0, 0)]
            }

        }
    }
}

▲作成されたUSD
20251225_01_06
▲usdviewで確認した状態

20251225_01_07
▲MetaDataタブから定義したバリエーションを変更が可能なことが確認できる

マテリアル・テクスチャ設定例
from pxr import Kind, Sdf, Usd, UsdGeom, UsdShade

stage = Usd.Stage.CreateNew("usd/SimpleShading.usda")
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y)

# Create Context
model_root = UsdGeom.Xform.Define(stage, "/TexModel")
Usd.ModelAPI(model_root).SetKind(Kind.Tokens.component)

# Create Billboard Mesh
half_width = 430
half_height = 150
billboard = UsdGeom.Mesh.Define(stage, "/TexModel/card")
billboard.CreatePointsAttr(
    [
        (-half_width, -half_height, 0),
        (half_width, -half_height, 0),
        (half_width, half_height, 0),
        (-half_width, half_height, 0),
    ]
)
billboard.CreateFaceVertexCountsAttr([4])
billboard.CreateFaceVertexIndicesAttr([0, 1, 2, 3])
billboard.CreateExtentAttr(
    [(-half_width, -half_height, 0), (half_width, half_height, 0)]
)
texcoords = UsdGeom.PrimvarsAPI(billboard).CreatePrimvar(
    "st", Sdf.ValueTypeNames.TexCoord2fArray, UsdGeom.Tokens.varying
)
texcoords.Set([(0, 0), (1, 0), (1, 1), (0, 1)])

# Create Shader
shader = UsdShade.Shader.Define(stage, "/TexModel/boardMat/PBRShader")
shader.CreateIdAttr("UsdPreviewSurface")
shader.CreateInput("roughness", Sdf.ValueTypeNames.Float).Set(0.6)
shader.CreateInput("metallic", Sdf.ValueTypeNames.Float).Set(0.0)

# Create Material
material = UsdShade.Material.Define(stage, "/TexModel/boardMat")
material.CreateSurfaceOutput().ConnectToSource(shader.ConnectableAPI(), "surface")

# Add Texture
st_reader = UsdShade.Shader.Define(stage, "/TexModel/boardMat/stReader")
st_reader.CreateIdAttr("UsdPrimvarReader_float2")
st_input = material.CreateInput("frame:stPrimvarName", Sdf.ValueTypeNames.Token)
st_input.Set("st")
st_reader.CreateInput("varname", Sdf.ValueTypeNames.Token).ConnectToSource(st_input)

texture_sampler = UsdShade.Shader.Define(stage, "/TexModel/boardMat/diffuseTexture")
texture_sampler.CreateIdAttr("UsdUVTexture")
texture_sampler.CreateInput("file", Sdf.ValueTypeNames.Asset).Set(
    "./tex/usd_test.png"
)
texture_sampler.CreateInput("st", Sdf.ValueTypeNames.Float2).ConnectToSource(
    st_reader.ConnectableAPI(), "result"
)
texture_sampler.CreateOutput("rgb", Sdf.ValueTypeNames.Float3)

shader.CreateInput("diffuseColor", Sdf.ValueTypeNames.Color3f).ConnectToSource(
    texture_sampler.ConnectableAPI(), "rgb"
)

# Assign Material
billboard.GetPrim().ApplyAPI(UsdShade.MaterialBindingAPI)
UsdShade.MaterialBindingAPI(billboard).Bind(material)

# Save Stage
stage.Save()
▲ビルボード、マテリアルを作成し、テクスチャを設定する例
20251225_01_17
▲事前に用意したテクスチャ

#usda 1.0
(
    upAxis = "Y"
)

def Xform "TexModel" (
    kind = "component"
)
{
    def Mesh "card" (
        prepend apiSchemas = ["MaterialBindingAPI"]
    )
    {
        float3[] extent = [(-430, -150, 0), (430, 150, 0)]
        int[] faceVertexCounts = [4]
        int[] faceVertexIndices = [0, 1, 2, 3]
        rel material:binding = </TexModel/boardMat>
        point3f[] points = [(-430, -150, 0), (430, -150, 0), (430, 150, 0), (-430, 150, 0)]
        texCoord2f[] primvars:st = [(0, 0), (1, 0), (1, 1), (0, 1)] (
            interpolation = "varying"
        )
    }

    def Material "boardMat"
    {
        token inputs:frame:stPrimvarName = "st"
        token outputs:surface.connect = </TexModel/boardMat/PBRShader.outputs:surface>

        def Shader "PBRShader"
        {
            uniform token info:id = "UsdPreviewSurface"
            color3f inputs:diffuseColor.connect = </TexModel/boardMat/diffuseTexture.outputs:rgb>
            float inputs:metallic = 0
            float inputs:roughness = 0.6
            token outputs:surface
        }

        def Shader "stReader"
        {
            uniform token info:id = "UsdPrimvarReader_float2"
            token inputs:varname.connect = </TexModel/boardMat.inputs:frame:stPrimvarName>
            float2 outputs:result
        }

        def Shader "diffuseTexture"
        {
            uniform token info:id = "UsdUVTexture"
            asset inputs:file = @./tex/usd_test.png@
            float2 inputs:st.connect = </TexModel/boardMat/stReader.outputs:result>
            float3 outputs:rgb
        }
    }
}

▲作成されたUSD
20251225_01_11
▲用意したテクスチャがメッシュに貼られて表示されているのが確認できる

ぷらずも
ぷらずも
ざっといくつか例を紹介してみました! このあたりは実際に手を動かして試してみるのが一番いいと思います。
ぷらずも
ぷらずも
なお最後に紹介したマテリアル設定については、デフォルトで用意されているUsdPreviewSurfaceというプレビュー用のマテリアルを使用しています。 マテリアルに関しては、ILMが開発している MaterialXという汎用的なマテリアルフォーマット もあり、USDとの連携も可能のようです。 こちらもかなり有用な技術なので、別記事で触れてみようと思います!
エレキベア
エレキベア
マテリアル周りも汎用化が進んでいるクマね 夢が広がるクマ・・・!

USDサンプルから構成例を見る

ぷらずも
ぷらずも
最後におまけとして、USDが実際のアセットでどのような構成で使われるのか? についていくつかサンプルを紹介します。
エレキベア
エレキベア
まあ操作方法が分かってもどのように使えばいいか分からないとどうしようもないクマからね・・・

KitchenSet

ぷらずも
ぷらずも
はじめに、USD確認用アセットとして定番のKitchenSetです。 こちらはUSD公式ドキュメント内で配布されています。
20251225_01_03
▲KitchenSetはUSDを活用したアセット構成のサンプルとしても優れている

20251225_01_10
▲KitchenSetをusdviewで開いた状態

ぷらずも
ぷらずも
背景を作る際にどのような単位でUSDを分けて管理するかの一例が見れると思います。 KitchenSet以外に公開されているCitySet、UsdSkel Examplesもサンプルとして有用そうですね!
エレキベア
エレキベア
このシーンはめちゃくちゃ見かけることが多いクマね

Moana Island Scene

ぷらずも
ぷらずも
そして大規模シーンの例として紹介したいのが、Disneyが公開しているモアナの島のアセット です。
20251225_01_05
▲ディズニーが公開しているモアナの島のサンプル、USDも公開されている

エレキベア
エレキベア
おぉ・・・!こんな本格的なアセットが公開されていたクマか
ぷらずも
ぷらずも
USDファイルでも配布されている他、アセット構成についてのドキュメントも同梱されています。 大規模シーンをUSDでどのように構成するのかが見れて、とてもよいサンプルだと思います。
20251225_01_12
▲付属PDFより引用、USDの構成についても記載されている

USD・Solaris関連の動画・記事

ぷらずも
ぷらずも
最後に触れておきたいのが、USD・Solaris関連の情報 です。 HoudiniのSolarisという環境がUSDベースで作られており、パイプラインを構築する際に合わせて使用されることが多いです。 これらの講演動画や記事などをあさってみると、有用な情報がたくさん見つかると思います。
  • Netflexによるパイプライン構築事例
20251225_01_18
▲Fragment、Entityといった分け方について解説されている

エレキベア
エレキベア
より実践的なパイプライン例については、講演資料などを見るのがよさそうクマね

おわりに

ぷらずも
ぷらずも
というわけで今回はPythonによるUSD操作でした! どうだったかな?
エレキベア
エレキベア
APIやツールも用意されてて、一度環境構築してしまえば扱いやすそうクマね
ぷらずも
ぷらずも
あとはPython以外でもC++や HoudiniのSolarisを使ってUSDを編集する方法 もあるね。 今後はSolarisやMaterialXなんかも触ってまとめたいと思います!
ぷらずも
ぷらずも
それでは今日はこの辺で! アデューー!!
エレキベア
エレキベア
クマ~~~~

【OpenUSD】USD入門 その2:PythonでUSDを生成・操作してみる ~完~


USDPythonPixar
2025-12-29

関連記事
【OpenUSD】USD入門 その1:概要とデータ構造についてまとめる
2025-12-25
【プロシージャル】Pythonで学ぶ波動関数崩壊アルゴリズム(Wave Function Collapse)
2025-06-22
【Python】Pythonスクリプトをexe、app化する【cx_Breeze】
2021-08-29
【Python】Pillowを使ってピクセル操作!画像フィルタをかけてみる
2021-02-17
【Python】ぷよぷよ風の文字連結パズルゲームを作る【あけおめパズル】
2021-01-03
【Python】スクショ画像を文字認識して翻訳するツールを作ってみた!【Tesseract ×Googletrans】
2020-10-13
【Python】OpenCVを使って画像編集を自動化する
2020-08-31
【Python】pyautoguiを使ってKindle書籍を自動でスクショするツールを作ってみた!
2020-02-26