📗

UnrealEngine公式PluginでUSD

2021/02/06に公開

前回の記事でUE4のOmniverseについて検証しましたが、
せっかくなのでUE4公式のUSDプラグインがどんな感じか検証してみようとおもいます。

Pluginをロードする

まずはUE4のプロジェクトを作成して、Pluginをロードします。

注意点として、OmniverseConnectorをインストールしている場合は
かならずOffにしておきます。
USDのバージョンが違うせいか、両方ONにするとエラーで起動できなくなります。

プラグインをロードすると、ウィンドウに「USDステージ」追加されます。

追加されたウィンドウを開くと、USDのシーングラフを表示するための
ウィンドウが追加されます。

USDを開く

次に実際にUSDを開いてみます。

USDを開く時は、アクタを配置から「UsdStageActor」を選択します。

アクターとはレベル内に配置可能な任意のオブジェクトのこと。
USDはFBXとは違いコンテンツブラウザに追加するのではなく、
この専用のアクタを使用して読み込みます。

レベル内にUsdStageActorをロードし、

USDステージウィンドウのファイル→開く からUSDファイルを選択します。

ロードすると、USDステージにはUSDのシーングラフと各種プロパティの表示画面が
表示されます。

UE4のアウトライナには、UsdStageActor以下に対してActorオブジェクトして読み込まれます。

無事読込できました。

試しにUSDZのテクスチャありのファイルをロードしてみた例。

コンポーネントを見てみると、コンテンツブラウザにはありませんが
内部的にStaticMeshとマテリアルが作られているのがわかります。

USDオブジェクトを使用する場合は、専用のアクタを使えば
USDのステージ単位でUE4上で扱えることがわかりました。
これはMayaPluginのProxyに近い構造ですね。

読み込んだUSDはUSDステージウィンドウからリロードすることができます。
なので、レイアウトをするときにUE4を使うのではなくSOLARISでレイアウトをして
それをUE4側でロードしてチェックする...みたいなことができそうです。

UE4でコンポジション

ロードはできたので、USD的な挙動を確認してみます。

ファイルから新規をクリックすると、USDファイルを新規で作成できます。
これはサブレイヤーでレイヤーを追加するわけではなく、
USDファイルを作り、そのファイルをロードする...といった挙動になります。

今の所UE4上でサブレイヤー合成はなさそう?です。

リファレンス

UE4でUSDオーサリングをしたい場合、Primの作成とリファレンスをすることができます。

プリミティブの追加したい場所で右クリックすると、プライムを追加(Primsを追加?)
があるので、Primを新規で作ります。

Primが追加できました。

そして、コンポジションでリファレンスを追加すると、指定Primに対して
USDをリファレンスすることができます。

結果。

ペイロード

UE4側ではペイロードを利用してUSDファイルを読み込むことはできないようですが

ペイロードのPrimをロード・アンロードすることができます。

デフォルトでロードするかはアクタ側で設定することができて、
ペイロードをアンロードした状態にすることもできます。

バリアントセット

バリアントセットも対応されていて、Primを選択すると
バリアントのプロパティが追加されていて、切り替えをすることができます。

まとめ

ここまで見たとおり、UE4上ではUSDでのレイアウトをする機能が一通り
揃っています。
ここで使うアセットは、別途セットアップしておいたほうが良さそうです。

UEでの編集

ロードすることは確認できましたが、ロードしたメッシュに対して
マテリアルのアサインなどをした場合どうなるかみてみます。

ためしにマテリアルをアサインしてみます。

アサインはできるのですが、この状態でStageをリロードすると
もとに戻ってしまいました。
戻らないときもあるっぽいので、このあたりの法則が若干謎です。
ただし、リロードで吹き飛んでしまうとなると
UE側でマテリアルの設定などがしにくいので微妙です。
このあたりはサブレイヤーでUE4側のマテリアルアサインなどができると
かなり便利になりそうだと思いました。

StaticMeshとしてロードする

ここまではUSDステージとして扱っていましたが、
これとは別にStaticMeshとしてもロードできます。

コンテンツブラウザに対してUSDファイルをドラッグ&ドロップすると、
Fbxなどと同様にStaticMeshとしてロードできます。

ただこの場合、すべてのPrimが別のMeshとしてロードされてしまうようでした。

あるいは、ステージウィンドウのアクションからインポートすることもできますが
この場合も同様の挙動で、
UsdStageActorからオブジェクトが消えてしまうので、使いどころが謎いです。

そのほか

UE4のC++実装は詳しくないですが、
ヘッダを見る限りUsdStageオブジェクトを持っていそうなので、
UsdStageActorを使用する場合C++側からUsdStageにアクセスすることもできるのかもしれません。
そうなると、けっこう夢が広がりそう。

まとめ

UE4側のデータ構造や、どのように作るかが理解しきれていないため
現状だとあくまでもロードして遊ぶ程度になってしまいましたが
思っていたよりもずっとUSDの対応がされていて驚きました。

レイアウトに関しては、USDステージで実行することで
USDのワークフローに載せられそうですし
レイアウトに関してはHoudiniでやったほうがやりやすそうなので
SOLARISでレイアウト→UsdStageActorでロードしてチェック
みたいなフローもできそう?な気がしました。

ただ、Primに対しての編集がリロードできえたりするのと
Meshロードして使う場合もまだ若干怖い印象があるので
ゲームとして使うのはやや怖いです。
ただし、映像用途の場合は一部導入するとかはいけるんじゃないかな?と思いました。

ただ、ここから先は
UE4上で実際に設定などをしていった場合はUE側の知識が圧倒的に足りないので
UE側の学習もしないと厳しそうなので、もうちょっとUEの基本を勉強したら
続きの記事を書いてみようと思います。
UE詳しい人に試してほしい...

GitHubで編集を提案

Discussion