WWDC Quick Look 💓 By SwiftGGTeam
USDKit と OpenUSD の新機能を知る

USDKit と OpenUSD の新機能を知る

元の動画を見る

ハイライト

Apple は USDKit フレームワークを導入し、Swift 開発者がネイティブ API で USD シーンを作成、編集、書き出せるようにしました。Mac の Preview App で 3D コンテンツを直接扱え、Safari の新しい <model> タグにより Web ページへ 3D モデルをネイティブに埋め込めます。

主要内容

以前の 3D シーン処理は面倒だった

Apple プラットフォームで 3D コンテンツ開発をしたことがあるなら、次のような状況に出会った可能性が高いでしょう。USD(Universal Scene Description)は事実上の業界標準ですが、公式 API は C++ です。Swift 開発者はブリッジコードを書くか、コミュニティが保守する SwiftUSD バインディングに頼る必要がありました。シーンの組み立て、階層の走査、属性の変更など、どの手順でも SdfPathUsdPrim といった C++ 型を扱うことになります。

さらに厄介なのが協業です。アーティストは Blender や Maya からモデルを書き出し、開発者はコード内で手動で組み立てます。双方がそれぞれシーン記述を持つことになります。アーティストがモデル位置を更新すると、開発者は座標をまたハードコードし直す必要があります。統一された Scene Graph 管理の仕組みがないため、プロジェクトが大きくなるほど保守が難しくなります。

USDKit は USD を Swift の第一級市民にする

USDKit は Apple が今年導入した新しいシステムフレームワークで、USD の中核概念を Swift らしい API として包みます。(08:12) シーンの作成、階層の走査、属性の変更、アセットの書き出しを、すべて Swift ネイティブの構文で実行できます。

設計意図は明確です。USD を知っている人には概念がなじみやすく、Swift を知っている人は先に C++ を学ばなくても使い始められます。USDStage は Stage、USDPrim はシーンノード、references.add() は軽量な参照に対応します。これらの API 名は USD の中核概念へ直接対応しているため、学習コストは低くなっています。

3D ワークフローは Mac から Vision Pro へ広がる

macOS 27 の Preview App は、もはや画像を見るだけのツールではありません。(04:24) 3D シーンを直接編集できます。オブジェクトをドラッグし、属性を調整し、ライトを変更し、アセットを変換または圧縮できます。背後には3つのレンダラーがあります。RealityKit はクロスプラットフォームの一貫性を担い、Storm は既存の制作パイプラインを支え、新しい Raytracer は物理的に正しいレイトレーシング結果を提供します。

Spatial Preview フレームワークにより、Mac 上の変更を Vision Pro の Quick Look へリアルタイムに同期できます。(05:42) チームは SharePlay で同じ空間シーンに入り、歩き回りながらライティングや構図を確認できます。このワークフローは以前、専門的な DCC ソフトウェアと複雑な書き出し手順を必要としていました。今は Mac 1台で実現できます。

Safari が 3D コンテンツをネイティブサポート

Safari は <model> タグを追加し、画像を埋め込むように 3D モデルを埋め込めるようにしました。(06:25) macOS と iOS では、ユーザーはブラウザー内で直接モデルを操作して確認できます。visionOS では、モデルが Web ページから「外へ出て」ユーザーの空間に入ることもできます。EC 展示、製品コンフィギュレーター、教育コンテンツなどでは、Three.js や Babylon.js を導入しなくても、HTML 1行で足りる場面が出てきます。

詳細

USD Stage を開いて走査する

USDKit の入口は USDStage です。(08:12) 空のインメモリ Stage を作ることも、ディスク上のファイルから開くこともできます。

import USDKit

// 新しい空のインメモリ Stage を作成する
let stage = USDStage()

// ディスク上のファイルから Stage を開く
let url = URL(fileURLWithPath: "/ALab/entry.usda")
let stage = try USDStage.open(url)

重要ポイント:

  • USDStage() はメモリ内の空 Stage を作成します。プログラムでシーンを生成する場合に向いています。
  • USDStage.open(url).usda.usdc.usdz ファイルから読み込みます。ファイル IO を伴うため try が必要です。
  • 読み込みに成功するとシーンはすぐ使えます。追加の非同期コールバックは不要です。

シーン階層を走査して特定のノードを探します。(08:44)

// すべての子孫ノードを走査し、scope という名前の機器を探す
for prim in stage.descendants {
    if prim.name == "scope" {
        // 見つかった
    }
}

// 見つからなかった場合は、指定パスに新しい Xform ノードを定義する
let scope = stage.definePrim(at: "/World/scope", type: "Xform")

// データをコピーせずにファイル参照を追加する
try scope.references.add("/ALab/assets/scope.usda")

重要ポイント:

  • stage.descendants は遅延走査を提供し、すべての子孫ノードを深さ優先順に訪問します。
  • definePrim(at:type:) は指定パスにノードを作ります。パスは USD 内の一意識別子です。
  • references.add() は USD Composition の中核機構です。データを埋め込まず、外部ファイルを参照します。上流が更新されると、Stage を再読み込みするだけで自動的に反映されます。

Transform Operation でオブジェクトを移動する

USDKit は USD の変換操作を Swift フレンドリーな API として包みます。(09:36)

// 平行移動の変換操作を作成し、xformOpOrder を自動更新する
scope.addTransformOperation(type: .translate)

// 平行移動の値を設定する
scope["xformOp:translate", as: USDValue.Vec3d.self] = [2.5, 0.0, -1.0]

重要ポイント:

  • addTransformOperation(type:)xformOp:translate 属性を自動作成し、xformOpOrder を維持します。開発者が変換順序を手動管理する必要はありません。
  • 添字構文 scope[key, as: Type.self] は USDKit における属性の読み書きの統一手段です。型安全で Swift らしく使えます。
  • USDValue.Vec3d は3次元の倍精度ベクトルに対応し、シーンレベルの座標記述に適しています。

3D オブジェクトにアクセシビリティ情報を追加する

Apple はアクセシビリティメタデータの標準化を USD 層まで進め、視覚に障がいのあるユーザーも VoiceOver で 3D シーン内のオブジェクトを理解できるようにしています。(10:42)

// AccessibilityAPI スキーマを適用し、インスタンス名を "default" にする
try scope.applyAPISchema("AccessibilityAPI", instanceName: "default")

// ラベル属性と説明属性を作成する
scope.makeAttribute(named: "accessibility:default:label", as: .string)
scope.makeAttribute(named: "accessibility:default:description", as: .string)

// 属性値を設定する
scope["accessibility:default:label", as: String.self] = "オシロスコープ"
scope["accessibility:default:description", as: String.self] =
    "3D ワイヤーフレーム表示を備え、上部にカラーバーテストモニターを載せたビンテージ信号解析機"

重要ポイント:

  • applyAPISchema(_:instanceName:) はノードへスキーマを付け、そのノードがアクセシビリティ API をサポートすることを宣言します。
  • 属性名は accessibility:{instanceName}:{property} という命名規則に従います。ここでは accessibility:default:label です。
  • makeAttribute(named:as:) は属性を作成し、as: .string で属性型を指定します。
  • ラベル(label)は簡潔に、説明(description)は詳しくします。両者を組み合わせることで、支援技術がオブジェクトを正確に伝えられます。
  • Apple は Blender と Maya でこの標準を直接サポート済みで、アーティストはモデリング段階からアクセシビリティデータを書き込めます。

圧縮した USDZ を書き出す

本番レベルの USD シーンは数 GB になることも珍しくありません。USDKit はメッシュとテクスチャの圧縮を内蔵しています。(12:05)

let output = URL(fileURLWithPath: "/ALab/alab_compressed.usdz")

// USDZ パッケージとして書き出す
try stage.exportPackage(
    to: output,
    options: [
        .preferSmallTextureFiles(quality: .standard),   // AVIF テクスチャ圧縮
        .preferSmallMeshFiles                           // メッシュジオメトリ圧縮
    ]
)

重要ポイント:

  • exportPackage(to:options:) は Stage を .usdz 形式へ書き出します。これは Apple プラットフォームで推奨されるパッケージ形式です。
  • .preferSmallTextureFiles(quality:) は AVIF でテクスチャを圧縮します。.standard はファイルサイズと画質のバランスを取ります。
  • .preferSmallMeshFiles はメッシュ圧縮を有効にします。Alliance for Open Media の新しいエンコーディングにより、メッシュサイズは最大 90% 削減できます。
  • 両者を組み合わせると、平均的なアセットサイズは元の約 1/7 まで小さくなります。
  • コードを書きたくない場合、Mac の Preview App と usdcrush コマンドラインツールでも同じ圧縮を行えます。

重要な示唆

1. リアルタイム協業対応の 3D アセットレビュー工具を作る

USDKit でシーンを読み込み、Spatial Preview フレームワークで Vision Pro へ送ります。チームメンバーはヘッドセットを装着し、同じ空間を歩き回って確認し、SharePlay で視点を同期できます。入口 API は USDStage.open() と Spatial Preview のリアルタイム同期機構です。

2. EC App にネイティブ 3D 製品表示を入れる

USDKit で製品バリエーション(色違い、付属品の組み合わせなど)を組み立て、圧縮した USDZ を書き出し、<model> タグで Web へ埋め込みます。visionOS ユーザーは製品を現実空間に取り出して確認できます。中心となる API は exportPackage(options:) と Safari の <model> タグです。

3. 既存 3D コンテンツへアクセシビリティ対応を一括追加する

シーン内の各 USDPrim を走査し、ノード名や型から labeldescription を推定して AccessibilityAPI スキーマで書き込みます。これにより、視覚に障がいのあるユーザーも VoiceOver で 3D コンテンツを探索できます。入口は stage.descendantsapplyAPISchema(_:instanceName:) です。

4. 軽量 USD シーンエディタを作る

USDKit の definePrimreferences.addaddTransformOperation を使ってノードエディタを構築します。ユーザーが 3D アセットをドラッグして組み合わせ、位置を調整し、圧縮パッケージとして書き出せます。Blender より軽く、純粋なコードより柔軟です。

5. Gaussian Splats と従来モデルを混在させる

OpenUSD は今年、Particle Fields という基礎タイプを追加し、Gaussian Splats をサポートします。USDKit で従来のメッシュとパーティクルフィールドを同時に含むシーンを作り、RealityKit でレンダリングします。現実シーンのスキャンと仮想物体の重ね合わせに向いています。

関連 Session

  • Spatial Preview — Mac App に Spatial Preview フレームワークを組み込み、Mac から Vision Pro へリアルタイム 3D プレビューを行う方法を学びます
  • RealityKit — USDKit は RealityKit と深く統合されています。USDKit で組み立てたシーンを RealityKit でレンダリングする方法を学びます
  • Reality Composer Pro 3 — 視覚的な 3D コンテンツ制作ツールです。USDKit と組み合わせて、コードとツールの二本立てワークフローを構成します
  • Immersive Web — Safari の <model> タグの深い技術詳細と、Web 上の 3D コンテンツのさらなる可能性
  • 3D Models — Apple プラットフォーム上の USD モデルに関するベストプラクティスと最適化戦略を学びます

コメント

GitHub Issues · utterances