WWDC Quick Look 💓 By SwiftGGTeam
Understand USD fundamentals

Understand USD fundamentals

元の動画を見る

ハイライト

このセッションは、USD に詳しくない Apple プラットフォーム開発者を対象とした、USD 形式の入門です。 USD は、Pixar によって開発されたユニバーサル 3D シーン記述形式であり、Apple によって ARKit および RealityKit で頻繁に使用されています。


主要内容

多くのチームが USD (Universal Scene description) に初めて触れたとき、それを 3D ファイル形式として扱います。この理解は狭すぎます。セッションの冒頭で与えられた定義はより正確です。USD には、シーン記述仕様、API、レンダリング システムの 3 つの部分があります (01:22)。この講義では、最初の部分、つまりシーン データをどのように記述し、整理し、ファイルに配置するかについてのみ説明します。

問題は 3D アセットのコラボレーションに起因します。 AR 製品モデルには、ジオメトリ、マテリアル、照明、アニメーション、および物理的プロパティが含まれる場合があります。モデラー、マテリアリスト、ツールチェーン、アプリはすべて、同じアセットを変更する必要があります。すべてのコンテンツを 1 つのファイルにベイクすると、変更は完全に置き換えられます。 USD の答えは、シーンをステージ、レイヤー、プリム、アトリビュートに分割し、コンポジションを使用してそれらを結合することです。

Apple はこのモデルを 2 つの例で説明しています。最初はパンケーキのシーンです。Pancakes変換下に置きますBlueberry_01次に、Blueberry にメッシュとマテリアル バインディングを配置します (06:55)。 2 つ目はチェス盤のシーンです。チェスの駒のアセットはカタログ レイヤーから取得され、位置はレイアウト レイヤーから取得され、色はvariantSet を通じて切り替えられ、繰り返されるチェスの駒はインスタンス化可能なメタデータを通じて再利用されます (08:05)。

これが米ドルのコアバリューです。アセット ファイルは基本データを保存し、レイアウト ファイルは配置を保存し、バリアント ファイルは切り替え可能なスキームを保存します。最終ステージはこれらのレイヤーで構成されます。他のレイヤーを破壊せずにレイヤーを置き換えることができます。

詳細

ステージ、レイヤー、プリム: まずシーンをレベルに分割します

(02:43) USD のステージはシーン グラフです。すべてのシーン要素を階層的に編成します。ステージは 1 つ以上のレイヤーで構成されます。レイヤーは通常、シーン情報を含むファイルです。 Stage の基本コンテナは Prim です。 Prim には引き続き Prim を含めることができ、ツリー構造を形成します。

以下は、講演の「球体と立方体」の例に基づいた概念的な USDA の抜粋です。

#usda 1.0

def Sphere "Sphere"
{
}

def Cube "Cube"
{
}

キーポイント:

  • #usda 1.0これが USD の ASCII テキスト表現であることを示し、ファイルの内容を説明するために音声で使用されます。 -def Sphere "Sphere"という名前のファイルを定義しますSphereプリムのタイプもSphere
  • def Cube "Cube"という名前のファイルを定義しますCubeプリムのタイプは、Cube
  • プリムタイプはスキーマから取得されます。講演では、スキーマはジオメトリやマテリアルなどの一般的な概念に構造化された意味を提供すると述べています (04:10)。

スキーマは属性も宣言します。スピーチ用Sphereスキーマの例: 球体にはradiusそしてextent、デフォルト値 (04:23) を設定できます。 Sphere Prim が明示的に半径を設定しない場合、スキーマのデフォルトの半径が使用されます。1

属性とメタデータ: データは正しいレベルに配置されます

(05:12) プリムの属性はアトリビュートと呼ばれます。各属性にはタイプと値があります。プリム、アトリビュート、ステージもメタデータを運ぶことができます。メタデータはキーと値の情報であり、シーンの補助データを記述するために使用されます。

スピーチでは、次の 3 つの一般的なステージ メタデータがリストされています。metersPerUnitupAxisdoc(06:26)。概念的な書き方は次のとおりです。

#usda 1.0
(
    metersPerUnit = 1
    upAxis = "Y"
    doc = "Pancakes scene for workflow tracking"
)

キーポイント:

  • metersPerUnitシーンのスケール単位を定義します。ステージ全体に影響するため、ステージのメタデータに配置されます。 -upAxisカメラの上方向がどの軸であるかを定義します。スピーチでは、X、Y、Z のいずれかであることが明示的に述べられています。 -docワークフロー追跡用の説明テキストを保存します。
  • メタデータは、影響を与えるレベルで書き込まれる必要があります。全世界に影響を与える場合は、Stage に書き込んでください。単一の Prim にのみ影響する場合は、Prim に書き込みます。

このルールは非常に実用的です。 AR アセットがアプリに入力された後、スケールと座標の方向が間違っており、これはモデルの間違ったサイズと間違った方向に直接つながります。グローバル メタデータを明確に記述することは、アプリで一時的な修正を行うよりも信頼性が高くなります。

参照とdefaultPrim: アセットを再利用し、データをコピーしない

(08:40) ボードの例はリファレンスから始まります。 Reference の機能は、データをコピーせずに、1 つのステージ内のプリムが別のレイヤーまたは同じステージ内のプリムを参照できるようにすることです。これにより重複が削減され、さまざまなユーザーやアプリケーションがデータを個別に更新できるようになります。

スピーチの提案 USD アセットは常に作成者のものですdefaultPrim(09:28)。外部レイヤーがこのアセットを参照すると、USD はデフォルトでどの Prim を取り込む必要があるかを認識します。

概念的な例:

# Pawn.usda
(
    defaultPrim = "Pawn"
)

def Xform "Pawn"
{
}

キーポイント:

  • defaultPrim = "Pawn"Stage メタデータに記述され、デフォルトでこのファイルによってエクスポートされる Prim を指定します。 -def Xform "Pawn"アセットのルート Prim を定義します。
  • その他のレイヤー参照Pawn.usda、直接手に入れることができますPawn追加のパスを記述する必要はありません。

そうでない場合defaultPrim、またはデフォルトの Prim 以外のものを参照したい場合。このスピーチでは別の方法が提供されます。つまり、Prim パスを明示的に指定します (09:53)。プリム パスは、ステージ内のプリムの一意の識別子です。たとえば、/World/Pawn/World/Knight

ペイロード: 大きなデータの遅延読み込み

(10:44) リファレンスはアセットをシーンに取り込みます。大規模なシーンの場合、これは重すぎる可能性があります。 USD は、遅延ロードできる参照の一種であるペイロードを提供します。この講演では、複雑なジオメトリ、大規模なシーン グラフ、プロップ、またはキャラクターを参照するときにペイロードを使用することを推奨しています。

概念的な例:

# Catalog.usda

def Xform "Pawn"
(
    payload = @Pawn.usda@
)
{
}

キーポイント:

  • Pawnカタログレイヤーのプリムです。 -payload = @Pawn.usda@このプリムの実際のシーン記述を外部アセットから取得したものとして表します。
  • ステージを開くときに、最初にペイロードをロードすることができず、シーンが空として表示されます。
  • チェスの駒は、ペイロードの読み込みが有効になるまでシーンに入りません。

これは、アセット ブラウザ、レベル エディタ、および大規模な AR シーンに適しています。ユーザーは最初に構造とプレースホルダーを確認し、詳細が必要なときにジオメトリをロードします。メモリ負荷は大幅に小さくなります。

レイヤー化: 新しいレイヤーの位置を変更します。

(11:28) チェスの駒が持ち込まれたら、チェス盤の上に置く必要があります。この講義ではカタログ レイヤーを変更するのではなく、ChessSetステージとパスsublayersカタログ レイヤーとレイアウト レイヤーの紹介 (12:06)。

レイヤーの順序には強いまたは弱い関係があります。上位層はより強力であり、下位層のデータを追加または上書きできます (11:30)。これにより、移動部分が非破壊的に変更されます。

概念的な例:

# ChessSet.usda
(
    subLayers = [
        @Catalog.usda@,
        @Layout.usda@
    ]
)

キーポイント:

  • ChessSet.usda最終的に開かれるステージファイルです。 -Catalog.usdaチェスの駒アセットを提供します。 -Layout.usdaチェスの駒の位置オーバーレイを保存します。
  • 動くPawn_01このとき、レイアウトレイヤーのtranslation属性のみが変更され、ポーンアセット自体を変更する必要はありません。

このワークフローは、複数人でのコラボレーションに最適です。アセットチームのメンテナンスCatalog.usda、レベルまたはスペース レイアウト チームのメンテナンスLayout.usda。最終的なアプリは、結合されたステージを読み込みます。

VariantSets: 同じアセットの異なるソリューションに切り替える

(13:39) ボードの相手側には暗い駒が必要です。ダークモデルの別のセットを作成する代わりに、スピーチではアセットにvariantSetを追加しました。 VariantSet は、ステージ上の個別のオプションを動的に切り替えます。オプションには、マテリアル、ジオメトリ、または USD で表現できる任意のデータを指定できます。

概念的な例:

# Pawn.usda

def Xform "Pawn" (
    variants = {
        string color = "Light"
    }
    prepend variantSets = "color"
)
{
    variantSet "color" = {
        "Light" {
            # use light material
        }
        "Dark" {
            # use dark material
        }
    }
}

キーポイント:

  • variantSets = "color"このプリムに名前付きのcolorバリエーションのセット。 -string color = "Light"デフォルトのバリアントを設定します。スピーチ内のデフォルトのチェスの駒には軽い素材が使用されています。 -"Light"そして"Dark"切り替え可能な 2 つのバリエーションがあります。
  • カタログ レイヤー内の特定のポーンのバリアントを次のように変更します。Dark、チェスの駒は暗いマテリアルを使用します (14:49)。

この概念は、製品コンフィギュレーターに直接転送できます。家具の木目や車の色、キャラクターの装備などもvariantSetで表現できます。アセットのコピーは 1 つだけあり、構成は選択結果として保存されます。

インスタンス化: シーン グラフ共有データの複製

(15:09) チェス盤には重複した駒がたくさんあります。 USD のシーン グラフ インスタンス化により、ステージ上の複数のプリムが同じシーン グラフを共有できます。プレゼンテーションでは、メモリとパフォーマンスの向上がもたらされると述べました。

概念的な例:

def Xform "Pawn_01" (
    instanceable = true
    payload = @Pawn.usda@
)
{
}

def Xform "Pawn_02" (
    instanceable = true
    payload = @Pawn.usda@
)
{
}

キーポイント:

  • instanceable = truePrim上に書かれたメタデータです。
  • 両方のポーンは同じものを参照しますPawn.usda
  • USD はこれらのプリムを候補インスタンスとして扱い、同じシーン グラフを再利用できます。 ・絵柄はそのままですが、重複データが削減されます。

チェスの駒はほんの一例です。スピーチでは、葉や家具などの繰り返しオブジェクトが多数あるシーンについても言及されました (15:20)。モバイル AR シナリオでは、特にこのタイプの最適化が必要です。

ファイル形式: usda、usdc、usd、usdz

(16:48) 最後に、スピーチでは USD ファイル形式を 4 つのカテゴリに要約しました。

  • .usda: ASCII テキスト、読み取り可能、セッション内の例はそれを使用して説明されます。 -.usdc: クレートバイナリ形式、よりコンパクトでより効率的なロード。 -.usd: ASCII またはバイナリ クレートを使用できます。 -.usdz: USD ファイルとテクスチャなどの補助ファイルを含む非圧縮 zip パッケージ。

開発中に使用可能.usda構造がはっきりとわかります。 Apple プラットフォームに公開する場合、一般的に次のような問題が発生します。.usdzモデル、テクスチャ、マテリアルなどのリソースを 1 つのファイルにパッケージ化しており、送信やプレビューに適しているためです。

重要ポイント

1. AR アセット構造チェッカーを作成する

  • 内容: USD または USDZ アセットを読み取り、ステージのメタデータ、defaultPrim、Prim 層、ペイロードの使用状況をリストします。
  • 実行する価値がある理由: スピーキングのアドバイスは常に著者によって行われますdefaultPrim、メタデータが正しいレベルに配置されていることを強調します。検査官は、アセットがアプリに入る前に構造的な問題を検出できます。
  • 開始方法: Pixar USD ドキュメントから Stage、Prim、Layer の概念を学び、最初に出力します。defaultPrimmetersPerUnitupAxis, プリムパスリスト。

2. 製品材料コンフィギュレーターを作成する

  • 対処方法: 同じ 3D 製品が複数の色または素材で利用可能であり、ユーザーはアプリで構成を切り替えることができます。
  • 実行する価値がある理由:variantSet は正確に離散的な代替を表現します。このプレゼンテーションでは、チェスの駒がライトからダークに切り替わるワークフローを示しています。
  • 開始方法: アセット作成段階でマテリアルの選択を完了します。colorバリアントセットでは、アプリ側がユーザーが選択したバリアント名を保存します。

3. 大規模なシーン用の遅延読み込みブラウザを作成する

  • 何をすべきか: 最初にシーン構造とプレースホルダーを表示し、ユーザーが特定の領域に近づいたときに複雑なモデルをロードします。
  • 実行する価値がある理由: ペイロードは、複雑なジオメトリと大規模なシーン グラフの遅延読み込みに使用されます。ステージを開設するための初期コストを削減します。
  • 開始方法: 大きなプロップまたはキャラクターをペイロード参照にします。ブラウザーは最初に Stage レベルを読み取り、次にインタラクションを押してペイロードの読み込みをトリガーします。

4. 非破壊 AR レイアウト エディターを作成する

  • 内容: ユーザーは元のアセット ファイルを変更せずに 3D オブジェクトを移動、回転、配置できます。
  • 実行する価値がある理由: レイヤ化により、アセットとレイアウトを分離できます。スピーチでCatalog.usdaそしてLayout.usdaそれがそのパターンです。
  • 開始方法: アセット参照をカタログ レイヤーに配置し、変換オーバーレイをレイアウト レイヤーに書き込み、最後にステージを使用して 2 つのレイヤーを結合します。

関連セッション

コメント

GitHub Issues · utterances