📓

USDでシーン構築(1) - KindとModel

2020/12/27に公開

今回は、Houdiniアドカレで書いた USDアセットを作ろうの続き+最近のOmniverseと合わせて
USDを使用したレイアウトについてを書いていこうと思います。

USDアセットとコンポーネント

USDアセットを作ろうの回で、USDのコンポジションを使用したアセットを作ることができました。
次は、このアセットを実際に配置(レイアウト)していきます。

このレイアウト作業をしていく場合、巨大なシーンであればロードするアセットは膨大になり
それをどうコントロールするかを考慮しなければすぐに破綻してしまいます。
そのシーンを構築する上でのルールがKindとModelHierarchyです。
別途USDの記事としてかきましたが、これをSOLARIS・Omniverseを使用しつつ見ていきます。

アセットの準備・レイアウトしていく

まずはOmniverseでレイアウトをしていってみます。

Omniverseのサンプルに、いい感じのアセットがありましたので
こちらを使用していきます。

アセット準備

配置の前にまずはアセットの準備について。
フォルダは、キッチンセット・Omniverseサンプルをベースにこうなります。

assets以下に、USDアセット(リファレンスで読み込むためのもの)のフォルダがあり
その直下に usdファイル、あとはそれで使用するテクスチャをまとめるフォルダがある状態です。

このあたりを作るのがSOLARISでのUSDアセットセットアップ方法によって変わりますので
最初に設計する段階でルールを決めると良いです。

レイアウト

次にOmniverseでレイアウトをしていきます。

まずはこんな構造をつくります。

OmniverseのContentからStageのLayoutPrim以下にアセットをドラッグドロップすると、

リファレンスでロードすることができます。

もちろん複数ロードもできて、リファレンスでロードしたPrimを移動することで

シーン内に配置していくことができます。

配置しつつ、CameraPrimを作成します。

fstopとfocalLengthでボケコントロールできるのが面白い。

レイアウト以下はこのように、増えてきたらGroupでまとめます。

ライトも、Light以下に配置していきます。

レイアウト用のKind設定

Referenceの場合

リファレンスでロードしたモデルは、RootPrim以下はロックされて操作できません。

Viewport上でアセットを選択した場合は、
このように操作可能なRootPrimが選択されます。
レイアウトする場合、どれを動かすかなどがカプセル化されているので、わかりやすいです。

それ以外の場合

Omniverseのリファレンスを使用した配置の場合は、このあたりをいい感じにカバーしてくれていますが
そうでない場合、どのPrimがリファレンスでロードした操作対象(アセット)なのか
どれがグループとしてまとめられたPrimなのかは見分けられません。

このあたりを整理するための機能がKindの指定です。

Omniverseのこちらの選択肢をみると、「Prim」と「Model」という選択肢があります。

特に何もしていない場合は、これはどちらをしていても挙動は変わりません。

ですが、動かすためのXform以下に複数のPrimがあるものを
(多くの場合は動かすためのPrim以下には複数のMeshがあるはず)動かす時は、
ビューポートで選択する場合はMeshよりも、ここのXformを選択したほうが便利です。

このXformは、作成するアセットのRootPrimです。

以前の記事でいうところの、この部分(アセットのRootPrim)になります。

なので、この部分のKind(種類)を指定することで「ここから下はアセットですよ」
ということを指定します。

指定するには、動かすためのAsset(リファレンスするためのアセットのRootPrim)に
対して、KindをComponentの指定をします。

結果。
ビューポートでオブジェクトを選択すると、操作対象のXformを選べるようになりました。

GroupとModelHierarchy

このKindは、Layoutのシーンを構成するときに配置するルール(定義)となります。

レイアウト以下はたくさんのオブジェクトが配置されるので、ある程度グループでまとめたいです。
その時は、Groupに対して group のKindを指定します。

最初にOmniverseでリファレンスで配置したシーンに戻ります。

このように、Layout以下にあるアセットをまとめるためのグループには、
「gorup」Kindを指定します。

そうすると、Layout以下のKindはこうなります。

このModelHierarchyでの構築ルールとして、

USDDocsのGlossaryを見てみると、

a "leaf model" that can contain no other models

とあります。
つまり、ComponentのKind以下には他のComponentであったりGroupは含まれない(含んではいけない)
というお約束事になります。

先程のシーンに、いくつかアセットを追加してみました。
この場合も、まだ Group - Component の構成になっています。
この SM_phiralアセットを、Component以下に移動してみます。

すると、こうなります。
一度移動すると、移動したアセットはロック状態になり表示から消えた上に
戻ることすらできなくなります。
(戻れなくなるのはこれはこれでまずい仕様のようなきがする)

SOLARISなどでは、こういう操作もできてしまいますが
これはあまり推奨されない(意図されていない)状態ということになります。

なので、

レイアウトしていく場合は、このように
Group以下にComponentが並ぶ、、、というふうな構造で構築していくようにします。

アセット側の設定

という理由もあり、アセットを作っておく場合

Houdiniなどでアセットのセットアップをする場合は、RootPrimに対して

Configure Primitive を使用して、RootPrimのKindを「Component」(ここ以下がアセットである)
という指定を入れておくと良いよ。
という話でした。

まとめ

OmniverseとSOLARISとでこのあたりの取扱は若干異なりますが、
(OmniverseのサンプルはKind指定しているわけではない)

アセットを作り、それを配置する場合の考え方はどちらも共通になっているので
これをベースにして、シーンのレイアウトをしていくと良さそうです。

GitHubで編集を提案

Discussion