🏗️

UE5.3でUSDを使う

2023/09/25に公開

UnrealEngineでの USD(Universal Scene Description) 利用については、
現在はBetaの状態で使うことができます。

5.3ではマテリアル、テクスチャ、アニメーション周りが扱えるようになったようです。
https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/c/1168-usd-materials-and-textures

承前

USDは、Pixar が開発していた3DCGシーンを構成するためのフォーマットをオープンにしたものです。
イントロダクションはこちらです。
https://openusd.org/release/intro.html

USDといえばこの方、あんどうめぐみ@れみりあさんがUEでのUSDについて少し記事を書いておられます。

https://zenn.dev/remiria/articles/aeed8d1632a56d6eb2e7

まずはご一読いただくのがいいと思いますが、
しかしUE4での記事ですので、ここでは改めてUE5世代でのUSD周りを確認したい、というのがこの記事の趣旨です。

準備

プラグインエディタで「USD」と検索し、プラグインを有効化します。

今回は二つとも有効にしていますが、下は名前の通りマルチユーザーで編集するためのものなので、上のだけ有効になっていれば大丈夫です。

追加される機能

アクターとして「Usd Stage Actor」が使えるようになり、また「USDステージ」ウィンドウも追加されます。

↑USDステージウィンドウを呼び出すメニュー。
ただこちらのウィンドウは、アクターの詳細パネルから直接呼び出せるため、メニューからアスセスすることはそんなに無いんじゃないかと思います。

USDのサンプル

公式サイトからサンプルをダウンロードしてきましょう。
実際のデータを見ると「USDではこういう階層にするのか」といった作法が確認できます。沿った方が各種ツールが機能を活用できたり利点があるので、踏襲しましょう。

https://openusd.org/release/dl_downloads.html#assets
特に 「Kitchen Set」 が有名です。
この記事でもあとから使います。

ほかにディズニーが公開しているモアナのデータや、Nvidiaのがあります。
https://www.disneyanimation.com/resources/moana-island-scene/

モアナは解凍すると300GBくらいになるので気をつけてください。。。

クイックスタート

公式ドキュメントのクイックスタートはこちらです。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/usd-stage-editor-quick-start-in-unreal-engine

USDをレベルに読み込む

二つの方法があります。

USDステージエディタから

USDステージエディタから「開く」でUSDファイルを指定すると、
USDアクターが自動で設置され、USDステージでもUSDが開かれます。

USDアクター設置から

まず、「アクタを配置」パネルで usd と検索してレベルへアクターを配置します。

そしてそのUSDアクターの詳細パネルから「USDステージエディタを開く」でエディタを開き、
USDステージエディタのメニューからUSDファイルを開きます。

なにがちがうの

アクターが自動で設置されるかどうかが違います。

USDステージエディタから直接開いた方がアクターが自動で作られるので、手数が減って楽ではあります。
ただし、
ステージエディタの右上にUSDアクター切り替えメニューがありまして

そこで切り替えるのに名前を整理しておいた方がいいので、
自動で作られるよりも自分で作ってパッと名前を変えちゃうのがアウトライナを綺麗に保つ意味でも好ましいです

といいつつ、 「エディタを同期」をON にしておけばアウトライナでの選択に同期してエディタが切り替わるので、上記メニューの出番も減ります。なのでアクターの命名もそんなに気にしなくてもいいかもしれません。。。

(↑ONがおすすめです)

USD Asset Cache アセット

USDファイルを初めて読み込む時には、Asset Cacheアセットを作るダイアログが表示されます。
置き場を作って保存します。

ここでは「UsdAssetCache_kitchen」と、読み込むUSDファイルに合わせたキャッシュ名にしたものの、
さらに別のUSDファイルを読み込んでも同じAsset Cacheへキャッシュされます。
(詳細パネルでキャッシュを切り替えることはできるので、USDファイルごとにAsset Cacheを分ける運用もできそう↓)

……じっくり確認したわけではありませんが、USD関連の操作は随時キャッシュされるようです。
明示的に「保存」しなくても状況が保存されていく状態なので、
キャッシュを捨てない限りちょっと前の状態に戻せない、みたいな瞬間もあるかもしれません。

読み込んだあと

読み込めました。
USDステージエディタは、コンテンツブラウザと同じ扱いで ウィンドウ下部にドッキング しておくのがおすすめです。
USD主体の作業中は コンテンツブラウザの出番はそんなにないので (モデルもテクスチャも基本USDから直読みになるため)

図のように、USDステージでの階層(左下)が、レベルアウトライナのアクター階層として表現されます。
「HumanFemale.walk.usd」のように、USDステージ上は階層の中身が見えるけどアウトライナではみえない場合もあります。スケルタルメッシュアセット扱いになるからですかね(詳細未確認)

USDを操作する

USDステージエディタでのUSDの操作については、公式ではこちら↓
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/working-with-usd-stage-prims-in-unreal-engine

複製、コピペ、参照追加、ペイロード追加、レイヤー分離、について書かれています。

以下は5.3時点の内容です。以降のバージョンではより対応が進むものと思われます。

バリアント切り替え

「バリアント」が用意されているプリミティブは、ステージエディタ上から切り替えられます。

これは無いプリミティブ。切り替え欄ありません。

バリアントがあるプリミティブ。
Kitchen Setの椅子は形状が二種あって、A/B切り替えられます。

Visibility

アウトライナでの可視性に加えて、USDステージエディタにも「プリミティブの可視性」があります。

アウトライナ側で不可視にすると、

普通に不可視になります。

USDステージエディタで不可視にすると、

レベル上では見えた状態のまま、Lumen界には入らなくなります。
不思議ですね。
この挙動は、そのうち一致されるようになるんじゃないかなという気がします。

アニメーション

USD内にアニメーションが含まれている場合は、LevelSequence欄のシーケンスを開いて確認できます。

しかしこのシーケンス、実体はエンジン直下にあるという感じで
ショットとして他のシーケンスに読み込んで利用するみたいなことは出来なさそうです。
また、UE上でトラックを追加したりライトとかをスポーンさせたりしても、USDを読み直したら消えるようなので実質編集不可なように見えました。(ロードマップだとできると書いてあるのでもっと調べたらあるかも。。。?)


なお、再生してもTポーズのままという場合は、ロードの目的をぽちぽち切り替えたりファイルメニューからリロードしたりすると、読み込まれる場合があります。

アニメーションの編集

キャラクターの場合は、コントロールリグをセットアップして編集可能とのことです。
SkelRootを右クリックして実行できます。

ただし、Pixarの公開しているサンプルは骨構造が違うため、コントロールリグを割り当てても申し訳ない状態になってしまいます。

このキャラクター用に改めてコントロールリグアセットを用意するか、
または、ドキュメントではMannequinを一度USD出力、それを読み込んでサンプルデータとするというテクニックでカバーしてました。

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/using-control-rig-with-usd-files-in-unreal-engine

マテリアル

プリミティブを選択して、スタティックメッシュコンポーネントからマテリアルを差し替えられます。

ヤカンの例。これは元の状態

マテリアルを差し替えてみました。

ただ、一度差し替えてしまうと、キャッシュ内でのマッピングが切れてしまい、
戻す方法がよくわかりませんでした。
↓マッピングIDが切れて「!DisplayColor〜」になっているところ。

安定性

USDに関する操作をしつつこの記事を書き終えるまでに、5回程度UEがクラッシュしました。
さほど込み入った操作はしていないので、これがより実践的な作業だった場合はもっと激しく落ちたのではないかと想像してしまうところです。
macOSで使っているからという不安定さも混ざっているかもしれませんが。

PythonでのUSD

UEのPython環境でUSDするためのモジュール usd_unreal が下記に置かれています。

/Engine/Plugins/Importers/USDImporter/Content/Python/usd_unreal

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/universal-scene-description-in-unreal-engine#pythonスクリプティング

使ってみてはいませんが、UE内のデータをUSDとして書き出すためのスクリプトが置かれているようです。
なにかしらオートメーションする時に役に立つかもしれません。

まとめ

5.3時点では、実作業するうえではUSDとして使うというよりは
インポートしてしまってただのUEのアセットとして使うのが現実的なのかも、という印象です。
それだとFBXでの運用とあまり変わらないのですが。。。

ドキュメントでも「interchange format(交換フォーマット)」と書かれており、
インフラとしてUSDがあるという状態とはちょっと違う感じかなと思います。
どこかに業務的な知見がたまっているのではとも思いますが、そういうのはオモテに出てこないので、素のUEとしては5.3時点ではまだまだこれからという印象です。

「USD Multi-User synchronization」については確認していないので、マルチユーザー編集を体験してみたらまた印象が違うのかもしれません。

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/universal-scene-description-in-unreal-engine#マルチユーザー編集のサポート

Discussion