コンテンツにスキップ

USD の基本構造(Stage/Layer/Prim)

前回 USD とは で USD とはなにかという概要を説明しましたが
今回はより具体的なデータの構造の開設になります。

説明するのは、「ステージ・レイヤー・プリム」についてです。
USD のシーン構造は、この3つが基本的な枠組みになります。

このあたりを、usdview とサンプルを使用して説明していこうと思います。

ステージ

まずはステージから。
ステージとは、Maya でいうところの「シーン(ファイル)」にあたります。
概要で説明した通り、USD は1つのファイルではなく
複数の USD ファイルを合成(コンポジション)することによって
シーングラフを構成します。

まず、公式サンプルの「KITCHEN SET」を usd view を使用して開いてみます。
この赤枠部分は、今開いている SceneGraph になります。

このステージがどのように構成されているかというと、  KITCHEN SET フォルダ下の assets
フォルダを見るとわかる通り、ものすごい大量の USD ファイルのアセットがあるのがわかります。

こんな感じで、これらの USD ファイルが、合成され、その結果作られるのが「ステージ」というわけです。

レイヤー

では、そのステージ内では、読み込まれている USD はどういう扱いでどのようになっているのか。
USD ファイルは、「レイヤー」と呼ばれて扱われます。
これは、Photoshop などの「レイヤー」の概念を 3D にしたようなものです。

たとえば、こんな感じの PhotoShop のレイヤーがあって

こんな絵が表示されたとします。

このレイヤーに表示された絵は、レイヤーそれぞれでも「絵」として成立していますが、

合成方法によってはこんな感じに重ねられて、元の絵から変わるかもしれませんし

途中でエフェクトが乗って、こんなことになるかもしれません。
つまり、これ1枚だけでは最終的にはどのように合成されるかわかりません。

この考え方と同じく、 「ステージを構成する元となっている usd ファイル」
「レイヤー」 と呼び、レイヤーを重ねることで1つのステージ(シーン)を構成
するのが USD の基本構造になります。

作業単位としてのレイヤー

構造とステージに関しての関係は上の通りですが、作業者視点で見た場合はどうなるでしょうか。
USD のレイヤーとは= 1 つの USD ファイルです。
1 つのステージは複数のレイヤーで構成されていますが、
すべてが USD なのでどこのファイルも開くことができます。
つまりは、レイヤーとは「最終的に合成されてステージになる材料」であり
作業者視点から見ると「作業するファイル・エントリー部分」になります。

レイヤー ファイル 担当者の編集・バージョン管理する単位
レイヤーの合成 ステージ シーングラフ

合成されて1つのシーングラフとして構築されていくものですが、
それぞれのレイヤー単位でも成立し、作業者の作業ファイルであり管理されるデータになっている...
というのが、USDにおけるレイヤーとステージの関係性で重要になってくる所かとおもいます。

担当者ごとにファイルを分割し、レイヤーごとに決まったルールで合成することができれば
同時に作業することができる!!というのが考え方の基本というわけです。
(とはいえ、そんな単純な話でもないが...)

レイヤーとプリム

各レイヤーには、Photoshop における「レイヤーに書かれた絵」にあたる
「プリム」と呼ばれる定義が書かれています。

#usda 1.0

def "Model"
{
    def Sphere "Sphere"
    {

    }
}

例えばこんな感じ。

この USD ファイルを開いてみると、Sphere が1つ表示されます。

シーングラフを確認すると、このようになっています。

これがどういう状況かというと、
sphere.usda という「Sphere がある」と記述されたレイヤーをもつステージになります。

上の例は1レイヤーのみでしたが、
複数のレイヤーになった場合も、考え方は PhotoShop と同じです。
複数の場合は、PhotoShop のレイヤーが合成されて、最終的な絵が出力されるのと同じように、
USD の各レイヤーごとの要素が合成されて、最終的な絵が表示されます。

プリムとアトリビュート

プリムとは、レイヤーに記述された定義と上で説明しましたが、もう少し詳しく説明
していきたいと思います。

プリムとは、 ステージ上の USD 内のデータ(アトリビュートなど)を格納するためのコンテナ のことで

XML でいうところのタグ(↑ でいうところの COLLADA であったり asset と書かれている部分)のようなものです。

usdview でシーンを見た時のシーングラフの1要素が「プリム」です。

各プリムは、プロパティ(アトリビュート)を保持します。
このあたりの構造は、Maya におけるノードとアトリビュートと同じで、
各ノードタイプごとに特定のアトリビュートを持つように
USD でも、各プリムのタイプ(スキーマ)ごとに特定のプロパティ(アトリビュート)を持ちます。

USD は、このプリムとアトリビュートの構造によって構成されています。

プリムスペック

ここで重要なのは、プリムとは 「ステージ上であらわされるコンテナ」 であり、
「レイヤーではない」 ということです。

これだけ書くとなんだそりゃ???ですね。

USD は、複数のレイヤーを合成することでステージを作ると説明しました。
各情報はレイヤー(usd ファイル)に記述されているのですが
そのレイヤー段階では、「最終的な結果」がわからない状態です。
レイヤーの項目での PhotoShop のたとえのとおり、それぞれのレイヤーは独立した絵になっているが
最終的な見た目と異なるのと同じように...です。

USD 的にはどういう風になっているかというと、
ざっくりと書くとこんな感じになっています。

各レイヤーごとに定義が書かれていて(緑の Sphere 作った、赤くした、形は Cube だった...など)
それらが合成された結果、ステージができあがり、プリムができあがります。

この、最終的なプリムになる前段階の「定義(各レイヤーごとの意見)」のことを「プリムスペック」
と呼び、その合成された結果が「プリム」となります。

そんなかんじで、、、

ここまでが、USD の基本的な構成要素に関係する用語説明になります。

USD ファイルを合成した結果がステージ、ステージの元になった USD ファイルがレイヤー。
レイヤーに記述された定義(主張)をプリムスペックとよび
そのレイヤーが合成されて出来上がったステージになったときの定義をプリムと呼びます。

ここまでさんざん「合成」というワードが出てきている通り
USD とは合成によって構成されるファイルフォーマットです。
合成によってシーンが構築され、各プリム(ノード)が生成されてシーンファイルが構築されます。

この合成こそが USD の真骨頂であり、
どのように合成するか どのように usd ファイルを構成するか
それが、あらゆるパイプラインの設計次第であり
設計次第であらゆるパイプラインに対応できることが USD のすごいことになります。

というわけで、なんとなく構造を説明したところで
次回からは、その USD の合成処理

コンポジションアーク

について説明していきたいと思います。


最終更新日: 2019-11-24 03:29:28