🐍 PythonでUSDファイルを操作してみよう!OpenUSD × Python入門

🎬 はじめに

前回の記事では、OpenUSD(Universal Scene Description) の概要について解説しました。今回は、より実践的に「Pythonを使ってUSDファイルを操作する方法」を紹介します。

Pixarが提供するUSD Python APIを使えば、PythonだけでUSDシーンの生成・編集・保存ができちゃいます!


🧰 必要な環境

まずは環境構築から。

✅ USD Python APIのインストール方法(簡易版)

USD公式のビルドは少し重たいですが、NVIDIAUSDリポジトリやCondaを使うと便利です。

# Conda環境でのインストール(推奨) conda create -n usd_env python=3.10 conda activate usd_env conda install -c conda-forge usd-core

インストール後、次のように動作確認できます:

python -c "from pxr import Usd; print('USDモジュールが使えます!')"

📄 USDファイルを新規作成する("Hello Cube")

まずは最小構成のUSDファイルを作ってみましょう。

from pxr import Usd, UsdGeom
 
# 新しいUSDファイルを作成
stage = Usd.Stage.CreateNew("hello_cube.usda")
 
# シーンの原点に立方体を作成
UsdGeom.Cube.Define(stage, "/HelloCube")
 
# 保存
stage.GetRootLayer().Save() print("USDファイル hello_cube.usda を作成しました。")

このコードを実行すると、以下のようなUSDファイルが出力されます:

usda
#usda 1.0
(
  defaultPrim = "HelloCube"
)
 
def Cube "HelloCube"
{
}

✏️ オブジェクトに変換・スケール・色を設定する

次に、立方体を動かしたり、スケールを変更してみましょう。

from pxr import Usd, UsdGeom, Gf
 
stage = Usd.Stage.CreateNew("custom_cube.usda")
 
cube = UsdGeom.Cube.Define(stage, "/MyCube")
 
# 位置、スケール、回転を設定 xform = UsdGeom.Xformable(cube)
xform.AddTranslateOp().Set(Gf.Vec3f(1, 2, 3))
xform.AddScaleOp().Set(Gf.Vec3f(0.5, 0.5, 0.5))
xform.AddRotateZOp().Set(45)
 
stage.GetRootLayer().Save()
print("変換・スケール済みのキューブを作成しました。")

これにより、シーン内のCubeが指定された位置に配置されます。


🎨 マテリアルやカラーの設定(基本)

USD単体ではマテリアルの設定は複雑ですが、簡易的に「DisplayColor」属性を使えば、見た目に色を付けられます。

from pxr import Usd, UsdGeom, Gf
 
stage = Usd.Stage.CreateNew("colored_cube.usda")
cube = UsdGeom.Cube.Define(stage, "/ColorCube")
 
# DisplayColor(RGB)を設定
geom = UsdGeom.Gprim(cube.GetPrim())
geom.CreateDisplayColorAttr().Set([(1.0, 0.0, 0.0)]) # 赤色
stage.GetRootLayer().Save()
print("赤色のCubeを作成しました。")

🔍 USDファイルの読み込みと属性の取得

既存のUSDファイルから情報を読み出すことも可能です。

from pxr import Usd, UsdGeom
 
stage = Usd.Stage.Open("colored_cube.usda")
prim = stage.GetPrimAtPath("/ColorCube")
cube = UsdGeom.Cube(prim)
 
print("プリム名:", prim.GetName())
 
# DisplayColorの取得
display_color = cube.GetDisplayColorAttr().Get()
print("DisplayColor:", display_color)

📦 usdz形式での保存

ARやモバイルアプリで使われる .usdz 形式で保存することも可能です。

# usdzconvert を使う(別途インストールが必要)
usdzconvert hello_cube.usda hello_cube.usdz

usdzconvertApplePixar が提供しているツールで、OpenUSDのユーティリティ群に含まれます。


🧠 おわりに

Pythonを使えば、OpenUSDファイルの生成や編集をコードベースで直感的に扱えることがわかりました。GUIベースのツールとは違い、スクリプトで大量の3Dオブジェクトを自動生成するなど、自動化やパイプライン統合にも非常に有効です。

今後はマテリアルシェーダーやアニメーション、複数レイヤーの統合といったより高度な活用方法についても紹介していきます!