WWDC Quick Look 💓 By SwiftGGTeam
Explore USD tools and rendering

Explore USD tools and rendering

元の動画を見る

ハイライト

このセッションは、「USD の基礎を理解する」(10129) の姉妹編であり、USD ツールの実際の使用と Apple プラットフォームでのレンダリング パイプラインに焦点を当てています。 USD の基本概念 (プリム、レイヤー、コンポジション) をすでに理解している場合、このセッションでは、USD コンテンツの作成、編集、レンダリングに使用するツールについて説明します。


主要内容

10129 では、USD とは何か、つまりステージ、レイヤー、プリム、コンポジションの概念について説明します。この 10141 では、モデルを USDZ に変換するために使用するツール、アセットのコンプライアンスを確認する方法、Hydra レンダリング エンジンを独自のアプリに統合する方法など、その方法について説明します。

セッションは 2 行に分かれています。 1 つ目はコマンド ライン ツールです。usdzconvertフォーマット変換を担当し、usdzcheck資産の検証を担当します。 2 つ目はレンダリングです。Hydra は USD のレンダリング抽象化レイヤーであり、Storm は Hydra のラスタライズ実装です。 Apple は、Metal を使用して Storm を駆動し、独自のアプリで USD シーンをレンダリングする方法をデモしました。


詳細

usdzconvert: 3D モデルを USDZ に変換します

(03:00) ほとんどの 3D アセットは、最初は USD 形式ではありません。モデリング ツールは、OBJ、FBX、GLTF、およびその他の形式にエクスポートします。usdzconvertこのコマンド ライン ツールは、それらを USDZ に変換する役割を果たします。

% python usdzconvert --help
usdzconvert 0.66
usage: usdzconvert inputFile [outputFile]
                   [-h] [-version] [-f file] [-v]
                   [-path path[+path2[...]]]
                   [-url url]
                   [-copyright copyright]
                   [-copytextures]
                   [-metersPerUnit value]
                   // ...
                   [-diffuseColor           r,g,b]
                   [-diffuseColor           <file> fr,fg,fb]
                   [-normal                 x,y,z]
                   [-normal                 <file> fx,fy,fz]
                   // ...

主要なパラメータ:

  • -metersPerUnit:シーンのスケール単位を設定します。これは、10129 で説明されているステージ メタデータに直接対応します。ソース モデルがセンチメートル単位で、ターゲット シーンがメートル単位である場合、ここでの設定が間違っていると、モデル サイズが完全に間違ったものになります。
  • -diffuseColor-normal: マテリアルのプロパティは変換中に上書きできます。たとえば、モデルのバッチに対して基本カラーを均一に設定したり、法線マップを指定したりできます。
  • -copytextures: テクスチャ ファイルを USDZ にまとめます。 USDZ は基本的に非圧縮 zip であり、テクスチャはパッケージ内に配置され、ロード時に追加のパスは必要ありません。

ツールは、Xcode コマンド ライン ツールキットとともにインストールされます。マテリアル、テクスチャ、アニメーションは変換中に可能な限り保持されますが、ソース形式のすべての機能をロスレスにマッピングできるわけではありません。

usdzcheck: USDZ 資産のコンプライアンスを確認する

セッションは検証プロセスを強調します。USDZ を変更するたびに、それを再度実行する必要があります。usdzcheck。このツールがチェックする内容は次のとおりです。

  • ファイル構造は正しいですか?
  • テクスチャ形式はサポートされていますか?
  • ポリ数は妥当な範囲内ですか?
  • 階層構造が Apple プラットフォームの要件を満たしているかどうか

USDZ ファイルがすべての Apple プラットフォーム (iOS、macOS、watchOS) で正しくロードおよびレンダリングされることを確認しました。セッションはこんな方におすすめですusdzcheckCI パイプラインに統合 - アセットの送信前に検証を自動的に実行し、非準拠のアセットがアプリに入るのを防ぎます。

照明メタデータ: USDA で照明設定を宣言する

(09:00) USD アセットはメタデータで照明設定を宣言できます。セッションは合格を示したcustomLayerDataIBL (イメージベース ライティング) バージョンを指定します。

// asset.usda
#usda 1.0
(
    customLayerData = {
        dictionary Apple = {
             int preferredIblVersion = 2
        }
    }
)

preferredIblVersion = 2IBL スキームのバージョン 2 を使用するようにレンダラーに指示します。このタイプのメタデータはステージ レベルで書き込まれ、シーン全体のデフォルトの照明に影響します。 AR シーンの場合、照明メタデータを正しく設定すると、実際の環境に配置した後にモデルが「浮く」ことを防ぐことができます。照明と周囲の環境の不一致は、3D モデルが露呈する可能性が最も高い問題の 1 つです。

マテリアル システム: UsdPreviewSurface

Apple の USD 実装では、UsdPreviewSurface標準素材として。これは USD 仕様で定義されている基本的な PBR マテリアルであり、次のコア プロパティをサポートしています。

  • diffuseColor: 拡散カラー
  • metallic: 金属性
  • roughness: 粗さ
  • normal:ノーマルマップ

RealityKit は自動的にレンダリングしますUsdPreviewSurface独自のマテリアル システムに変換します。これは、アセット作成者が RealityKit のマテリアル モデルを理解する必要がないことを意味します。モデルは米ドルで記述されています。UsdPreviewSurface, RealityKit は正しくレンダリングします。

USD + Hydra を構築する

(17:50) 独自のアプリで USD シーンをレンダリングするには、USD と Hydra をビルドする必要があります。セッションには構築手順が示されています。

// Apple Silicon Mac 上需要 Rosetta
% arch -x86_64 /bin/zsh

// 下载源代码
% git clone https://github.com/PixarAnimationStudios/USD.git

// 构建 USD + Hydra(使用 Xcode generator)
% python3 USD/build_scripts/build_usd.py --generator Xcode --no-python USDInstall

主要なパラメータ:

  • --generator Xcode: Makefile の代わりに Xcode プロジェクトを生成して、Xcode でのデバッグと統合を容易にします。
  • --no-python: Python バインディングをスキップし、ビルド アーティファクトを削減します。アプリに Python スクリプト機能が必要ない場合は、このパラメータを追加します。
  • USDInstall:インストールディレクトリを指定します。

Hydra は USD のレンダリング抽象化レイヤーです。これはレンダラーが実装する必要があるインターフェイスを定義しますが、特定のレンダリング テクノロジをバインドするものではありません。 Storm は Hydra のラスタライズ実装であり、Apple はバックエンドとして Metal を使用して Storm を駆動する方法をデモしています。

USD ロードステージ

(18:54) セッションでは、macOS アプリのファイル セレクターを使用して USD ファイルをロードする方法を示します。

// AAPLViewController.mm

- (void)viewDidAppear
{
    NSOpenPanel* panel = [NSOpenPanel openPanel];
    panel.allowedContentTypes = @[UTTypeUSD, UTTypeUSDZ];

    [panel beginWithCompletionHandler:^(NSModalResponse result) {
        if (result == NSModalResponseOK)
        {
            NSURL* url = panel.URLs[0];
            [self->_renderer setupScene:[url path]];
        }
    }];
}

// AAPLRenderer.mm

- (bool)loadStage:(NSString*)filePath
{
    _stage = UsdStage::Open([filePath UTF8String]);
    // ...
}

UsdStage::Open()USD ファイルを開き、Stage オブジェクトを返します。このステージは 10129 で言及されているステージであり、すべてのレイヤーの合成結果が含まれています。後続のレンダリング、クエリ、編集はすべてこのステージに基づいて行われます。

シーンカメラを設定する

(19:30) ステージをロードした後、観察カメラをセットアップする必要があります。

// AAPLRenderer.mm

- (void)setupCamera
{
    _viewCamera = [[AAPLCamera alloc] initWithRenderer:self];

    [self calculateWorldCenterAndSize];

    [_viewCamera setDistance:_worldSize];
    [_viewCamera setFocus:_worldCenter];
}

calculateWorldCenterAndSizeステージの境界ボックスをトラバースし、シーンの中心とサイズを計算します。この情報は、シーン全体が確実に表示されるようにカメラの距離と焦点を設定するために使用されます。この手順が完了すると、ユーザーは USD ファイルを開くときに適切なパースペクティブを自動的に表示できるようになります。

シーンの照明を設定する

(19:54) セッションでは、単純な照明戦略を示します。カメラの位置を光源の位置として扱います。

// AAPLRenderer.mm

GlfSimpleLight computeCameraLight(const GfMatrix4d& cameraTransform)
{
    GlfSimpleLight light;
    light.SetPosition(GfVec4f(cameraPosition[0], cameraPosition[1], cameraPosition[2], 1));

    return light;
}

これは単純化したもので、光は常に観察者の方向から来ています。シナリオのプレビューとデバッグには十分です。実稼働環境では、前述の IBL メタデータの操作など、より複雑な照明設定が必要になることがよくあります。

Hydra エンジンを初期化してレンダリングする

(20:17) コアのレンダリング プロセスは 2 つのステップに分かれています: 初期化UsdImagingGLEngine、そして各フレームでdrawを呼び出します:

// AAPLRenderer.mm

- (void)initializeEngine
{
    _engine.reset(new UsdImagingGLEngine(_stage->GetPseudoRoot().GetPath(),
                                         excludedPaths,
                                         SdfPathVector(),
                                         SdfPath::AbsoluteRootPath(),
                                         driver));
}

// AAPLRenderer.mm

- (HgiTextureHandle)drawWithHydraAt:(double)timeCode
                           viewSize:(CGSize)viewSize
{
      _engine->SetCameraState(modelViewMatrix, projMatrix);
      _engine->SetLightingState(lights, _material, _sceneAmbient);

      UsdImagingGLRenderParams params;
      params.clearColor = GfVec4f(0.0f, 0.0f, 0.0f, 0.0f);
      params.frame = timeCode;

      // ...
}

キーポイント:

  • UsdImagingGLEngineHydra と OpenGL/Metal の間の架け橋です。 USD シーン データを Hydra が使用できる形式に変換し、それをレンダリングのために Storm に渡します。
  • SetCameraStateそしてSetLightingStateカメラとライトはフレームごとに更新されます。これにより、ユーザーは視点を回転して光源を移動できるようになります。
  • UsdImagingGLRenderParamsレンダリングパラメータを制御します。clearColor背景色を設定し、frameタイムコードを設定します(アニメーション用)。
  • Apple の実装、HgiTextureHandle返されたテクスチャは、後続の合成のために Metal パイプラインに直接渡すことができます。たとえば、3D レンダリング結果を AR カメラ画面に重ね合わせることができます。

クイックルックと AR クイックルック

Safari、メール、メッセージなどのシステム アプリは、USDZ の Quick Look プレビューをサポートしています。ユーザーが USDZ リンクをクリックすると、システムは 3D プレビュー ウィンドウをポップアップ表示し、モデルを回転して表示したり、AR モードに切り替えて実際の環境にモデルを配置したりできます。

開発者が使用できるのは、QLPreviewController同じ機能を独自のアプリに統合します。アプリがカスタム レンダリングではなく USDZ モデルのみを表示する必要がある場合は、Hydra を統合するよりも Quick Look を直接使用する方がはるかに簡単です。


ベストプラクティス

1. usdzcheck を CI パイプラインに追加します。

USDZ アセットが変更されるたびに実行します。usdzcheck。フォーマット非準拠やパフォーマンスの問題を事前に検出できます。これらは開発マシンでは明らかではないかもしれませんが、ローエンド デバイスでは読み込みエラーやフレーム ドロップを引き起こす可能性があります。それを CI に統合し、送信前にアセットを自動的に検証します。

2. テクスチャは 2 のべき乗の解像度を使用します

テクスチャ サイズは 256、512、1024、2048 に設定されています。RealityKit のテクスチャ パイプラインは、特に POT 解像度向けに最適化されています。非 POT テクスチャは自動スケーリングをトリガーし、品質が低下したり、読み込み時間が増加したりする可能性があります。

3. モデルレベルのインタラクション要件のマッチング

ユーザーがモデルの特定の部分を個別に操作する必要がある場合(ホイールの回転など)、その部分が USD の独立したプリムであり、同じメッシュ内の他のジオメトリとマージされていないことを確認してください。 RealityKit のエンティティ レベルは USD の Prim レベルを直接反映しており、レベル デザインによってインタラクションの粒度が決まります。

4. アセット内でグローバル メタデータを宣言する

10129 と一致し、metersPerUnitupAxisStage メタデータに記述する必要があります。アセットを変換するときに使用されますusdzconvertアプリコードの一時的な修正ではなく、対応するパラメーター設定。メタデータはアセットに書き込まれるため、すべての消費者が一貫した情報を取得できます。


重要ポイント

1. USD 資産 CI 検証パイプラインを構築する

  • 内容: CI への統合usdzcheck、アセットの送信ごとにフォーマットのコンプライアンスとパフォーマンスのメトリクスを自動的に検証します。
  • 実行する価値がある理由: セッションは、資産検証は「スキップするのは簡単ですが、重大な結果をもたらす」ステップであることを強調しています。非準拠のアセットは開発マシンでは正常に動作しますが、ローエンド デバイスではフレームのロードまたはドロップに失敗します。自動検証により、手動チェックが不要になります。
  • 開始方法: 簡単なシェル スクリプト呼び出しを作成します。usdzcheck、Git コミット前フックまたは CI パイプラインで実行されます。検査レポートを出力します。異常があるとマージできません。

2. USD シーン プレビューアを作成する

  • やるべきこと: Hydra + Metal を使用して、視野角の回転と照明モードの切り替えをサポートする軽量の USD/USDZ ファイル プレビュー アプリを構築します。
  • 実行する価値がある理由: セッションは完全な統合コードを提供します: USD + Hydra のビルド、ステージのロード、カメラとライトのセットアップ、メタル テクスチャへのレンダリング。これらをつなぎ合わせると、使用可能なプレビューアになります。
  • 開始方法: Sessionの手順に従ってUSD + Hydraを構築し、実装しますUsdImagingGLEngineで初期化しますQLPreviewControllerまたは、メタル ビューをカスタマイズしてレンダリング結果を表示します。

3. バッチ形式変換ツールを作成する

  • 内容: に基づいていますusdzconvertバッチ変換スクリプトをカプセル化し、OBJ/FBX/GLTF から USDZ へのディレクトリレベルの変換をサポートし、自動的に設定しますmetersPerUnitそして材料パラメータ。
  • 実行する価値がある理由: セッションのデモンストレーションusdzconvert豊富なパラメータ。実際のプロジェクトでは、モデラーが大量のモデルをエクスポートした後に変換やパラメータの設定を統一する必要があり、それを一つ一つ手作業で行うのは非効率です。
  • 開始方法: ディレクトリを横断し、各モデル ファイルを呼び出す Python/Shell スクリプトを作成します。usdzconvert、構成ファイルから統合されて読み取りますmetersPerUnitdiffuseColorおよびその他のパラメータ。

4. ARシーンマテリアルエディターを作成する

  • やるべきこと: USDZ アセットをアプリにロードし、リアルタイムで編集しますUsdPreviewSurfacediffuseColormetallicroughnessAR 環境で効果をプレビューするためのパラメーター。
  • 実行する価値がある理由: セッションの紹介UsdPreviewSurfaceIBL 照明メタデータ。マテリアルのパラメータを調整すると、AR 環境でのパフォーマンスがエディタでのパフォーマンスとまったく異なる場合があります。リアルタイム プレビューにより、エクスポート テストを繰り返す回数を減らすことができます。
  • 開始方法: を使用しますUsdStage::Open()アセットのロード、USD API 経由の読み取りおよび書き込みUsdPreviewSurface属性値は、複合レンダリングのために ARKit カメラ画像と結合されます。

関連セッション

  • USD の基礎を理解する — これは 10141 の前身であり、ステージ、レイヤー、プリム、コンポジション、バリアントセットといっ​​た USD の中核概念について説明しています。
  • あなたの世界を拡張現実に — Object Capture と RealityKit を使用して現実のオブジェクトを AR シーンに取り込み、USD アセット パイプラインに直接接続する方法を示します。
  • Discover ARKit 6 - USD 資産の最終サービスの AR シナリオを理解するのに役立つ、ARKit 6 のプラットフォーム機能を紹介します。
  • RoomPlan を使用してパラメトリック 3D ルーム スキャンを作成する - RoomPlan は、USD のシーン階層およびアセット構成と同様のモデリング概念を備えた構造化 3D 表現を生成します。

コメント

GitHub Issues · utterances