ハイライト
Apple は USDKit フレームワークを導入し、Swift 開発者がネイティブ API で USD シーンを作成、編集、書き出せるようにしました。Mac の Preview App で 3D コンテンツを直接扱え、Safari の新しい
<model>タグにより Web ページへ 3D モデルをネイティブに埋め込めます。
主要内容
以前の 3D シーン処理は面倒だった
Apple プラットフォームで 3D コンテンツ開発をしたことがあるなら、次のような状況に出会った可能性が高いでしょう。USD(Universal Scene Description)は事実上の業界標準ですが、公式 API は C++ です。Swift 開発者はブリッジコードを書くか、コミュニティが保守する SwiftUSD バインディングに頼る必要がありました。シーンの組み立て、階層の走査、属性の変更など、どの手順でも SdfPath や UsdPrim といった 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 を走査し、ノード名や型から label と description を推定して AccessibilityAPI スキーマで書き込みます。これにより、視覚に障がいのあるユーザーも VoiceOver で 3D コンテンツを探索できます。入口は stage.descendants と applyAPISchema(_:instanceName:) です。
4. 軽量 USD シーンエディタを作る
USDKit の definePrim、references.add、addTransformOperation を使ってノードエディタを構築します。ユーザーが 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