Highlight
visionOS の Quick Look に PreviewApplication API が追加され、数行のコードでウィンドウ化プレビューを開けます。3D モデルは Surface Mapping でデスクに自動吸着し、USDZ の variants メカニズムで 1 ファイル内の複数配色を切り替えられます。
主要内容
visionOS でファイルをプレビューする方法は 2 つ:インライン式(アプリを全画面 cover で覆う)とウィンドウ式(独立した volume で表示し、ユーザーがアプリを同時操作可能)。しかしウィンドウ式は以前ドラッグ&ドロップでのみトリガーでき、アプリはプレビュー過程をほぼ制御できませんでした——タイトル指定不可、編集オプションの無効化不可、ユーザーがプレビューを閉じたタイミングも不明。
今年 Apple は PreviewApplication API を発表。SwiftUI と Swift Concurrency 上に構築されています。PreviewApplication.open に URL を渡すとウィンドウ化プレビューを開き、URL 配列を渡すとコレクションビューを開き前後ナビゲーション矢印を表示。PreviewItem でタイトル(displayName)と編集モード(editingMode)をカスタマイズ可能——例えば .disabled でクロップ、トリムなどの編集ボタンを削除。API は session オブジェクトを返し、その events は Swift async stream でプレビューの開閉イベントを監視できます。
3D コンテンツ面では、最も要望の高かった 2 機能が実装されました。Surface Mapping で任意の 3D モデルがデスクや床に自動吸着——ウィンドウバーをデスクに近づけるとトリガー、吸着後は自由にスライドでき、ピッチ回転をロックしてモデルがデスクにめり込むのを防止。Configurations(USDZ では variants)で 1 ファイルに複数バリアントを含められます——異なる色の iPhone など、Quick Look 内で直接切り替え、配色ごとに別ファイルを用意する必要がありません。iOS と macOS でも利用可能。visionOS では FaceTime 通話中の設定切り替え同期にも対応。
詳細
PreviewApplication API
最も基本的な使い方:PreviewApplication.open に単一ファイルの URL を渡す(02:53)。
PreviewApplication.open(url: selectedURL)
URL 配列を渡すとコレクションビューを開く(03:48):
PreviewApplication.open(urls: allURLs, selectedURL: selectedURL)
キーポイント:
urlsパラメータは配列を受け取り、Quick Look がコレクションビューとナビゲーション矢印を表示selectedURLで初期フォーカスファイルを指定
PreviewItem でタイトルと編集モードをカスタマイズ(05:19):
let previewItem = PreviewItem(url: selectedURL, displayName: entryName, editingMode: .disabled)
PreviewApplication.open(previewItem: previewItem)
キーポイント:
displayNameは Quick Look 上部メニューバーに表示editingMode: .disabledで編集ボタンを削除し、元ファイルの誤変更を防止- その他の editingMode オプションは API ドキュメントを参照
session の events でプレビューライフサイクルを管理(06:47):
let session = PreviewApplication.open(url: selectedURL)
for await event in session.events {
switch event {
case .opened:
isPreviewOpen = true
case .closed:
isPreviewOpen = false
}
}
キーポイント:
session.eventsは Swift AsyncSequence——for awaitで反復.openedと.closedイベントで UI 上のプレビュー状態を同期- 同じファイルを再度開いても新しいウィンドウは作成されず、既存ウィンドウが前面に
USDZ Variants(Configurations)
USDZ で variantSet を使って設定バリアントを定義(12:22):
#usda 1.0
(
defaultPrim = "iPhone"
)
def Xform "iPhone" (
variants = {
string Color = "Black_Titanium"
}
prepend variantSets = ["Color"]
)
{
variantSet "Color" = {
"Black_Titanium" { }
"Blue_Titanium" { }
"Natural_Titanium" { }
"White_Titanium" { }
}
}
キーポイント:
- すべての variants は
defaultPrim上に定義する必要があり、Quick Look が正しくクエリ・表示できる string Color = "Black_Titanium"でデフォルトバリアントを設定prepend variantSets = ["Color"]でバリアントセット名を宣言- バリアント名にスペースは不可——アンダースコアを使用。Quick Look が表示時にスペースに変換
- Quick Look 下部に設定ボタンが表示され、選択するとモデルが対応バリアントで再読み込み
- バリアントに重いテクスチャや複雑なジオメトリを含めない——読み込み速度への影響を避ける
Surface Mapping
- すべての 3D モデルで Surface Mapping が自動有効——追加コード不要
- 水平面(デスク、床)をサポート
- ウィンドウバーを面に近づけると吸着がトリガーされ、効果音が鳴る
- 吸着後はピッチ回転をロックし、モデルが面にめり込むのを防止
- USDZ エクスポート時、モデル底部が座標原点にあることを確認——吸着効果が正しく機能
重要ポイント
-
インライン式 Quick Look の代わりに PreviewApplication.open を使用:ウィンドウ化プレビューはユーザーの現在操作を中断せず、マルチタスクに対応。コード量は SwiftUI の fullScreenCover + UIViewControllerRepresentable から 1 行呼び出しに削減。サムネイルの
onTapGestureでPreviewApplication.open(url:)を呼ぶ。 -
variants を含む USDZ ファイルを作成:1 ファイルにすべての配色を含め、Quick Look 内で直接切り替え——ファイル数と管理コストを削減。visionOS の FaceTime では設定同期もサポート。USDZ の defaultPrim 上に
variantSetを定義し、各バリアントが 1 設定に対応。バリアント名はスペースの代わりにアンダースコアを使用。 -
3D モデル底部を座標原点に合わせる:Quick Look の Surface Mapping はすべてのモデルでデフォルト有効——底部が原点にないと、デスク吸着後に浮いたりめり込んだりする。3D モデリングソフトでエクスポート前にモデル全体を下げ、底面が Y=0 平面に来るようにする。
-
session.events で UI 上にプレビュー中のファイルを表示:複数プレビューを開くとユーザーはどれを見ているか忘れがち——目のアイコンなどの視覚マーカーで状態を明確に。
PreviewApplication.openが返す session を保持し、for await event in session.eventsで状態変数を更新して UI をリフレッシュ。
関連セッション
- Build compelling spatial photo and video experiences — アプリで空間写真と動画を作成・採用する方法
- Optimize your 3D assets for spatial computing — 3D アセット最適化ワークフロー。バリアント読み込み時間を短縮する重要テクニック
- What’s new in USD and MaterialX — USD フォーマットの最新更新。variants メカニズムの基盤技術
- Dive deep into volumes and immersive spaces — volume のカスタマイズを深掘り。Quick Look ウィンドウ化プレビューの基盤コンテナ
コメント
GitHub Issues · utterances