ハイライト
本セッションは visionOS カスタム環境での没入型メディア視聴体験の構築を解説。Destination Video サンプルプロジェクトの Studio 環境を手本に、基本セットアップから高度なエフェクトまで全工程をカバー。
主要内容
visionOS で動画を見るデフォルト体験は、ドラッグ・リサイズ可能なウィンドウ。ウィンドウ体験自体は問題ないが、Apple Vision Pro の没入能力はそれを大きく超える。問題は: 動画をカスタム 3D 環境に置くと、画面が空中に浮き、環境と一切相互作用しない——部屋に貼り付けた浮遊スクリーンのようで、「この空間で映画を見ている」雰囲気を感じられない。
Apple は visionOS 2 でシステムレベルの解を提供。核心は動画を環境内の固定位置に「ドッキング」し、メディア反射、環境照明、空間リバーブ、パススルーティントで動画と環境を一体化。具体的に、ImmersiveSpace は段階的没入(Digital Crown で無没入から全没入へ調整)、AVPlayerViewController はフルスクリーンモードでシステムドッキング動作に自動参加。今年追加の Docking Region コンポーネントでドッキング位置をカスタマイズ。設計した位置に動画を正確配置。Virtual Environment Probe で環境照明、Reverb で空間リバーブ、Brightness と Tint でパススルー画面を環境トーンに合わせ、体験は「部屋に貼り付けたウィンドウ」から「シアターの巨大スクリーン」へ変わる。
詳細
基礎アーキテクチャ: ImmersiveSpace + AVPlayerViewController
メディア視聴体験の基盤は ImmersiveSpace シーンタイプと AVPlayerViewController の組み合わせ(02:07)。ImmersiveSpace は段階的没入をサポート。Digital Crown で没入度を制御。AVPlayerViewController は HLS ストリーミングをサポート。システム TV、Music app と一貫した再生コントロール。AVPlayerViewController がフルスクリーンモードに入ると、システムが自動「ドッキング」——動画を固定位置に配置(03:26)。
カスタムドッキング位置: Docking Region
デフォルトではシステムがドッキング位置を決定。今年は Reality Composer Pro の Docking Region Component でカスタマイズ可能(03:37)。手順: Reality Composer Pro の挿入メニューで Environment > Video Dock プリセット選択。Video Dock エンティティを展開して Player エンティティを見つけ、Inspector で Docking Region Component の width 属性を調整。width は 2.4:1 アスペクト比での最大再生サイズを定義。超過サイズの動画は自動スケール(06:01)。寸法調整後、Player エンティティの position transform を変更して画面を持ち上げ——シアターでスクリーンが地面より少し高いように(06:30)。
ImmersiveSpace の座標原点に注意: 原点は空間初回オープン時に視聴者の足元付近。全エンティティ位置はこの原点相対(05:36)。Destination Video の Studio 環境は Docking Region を視聴者正面、周囲建築と対称に配置。視線遮りなし(07:01)。
メディア反射: Specular と Diffuse
動画画面は環境表面に反射を生み、リアリティを強化。Reality Composer Pro の ShaderGraph に 2 つの反射ノード(08:22):
- Reflection Specular: 動画コンテンツの直接反射。滑らかな表面(金属、鏡、水面)向け。設定: シーンに Docking Region 付きエンティティ + 表面マテリアルに
Reflection_Specularノード接続。RealityKit が Docking Region 位置と地面テクスチャ座標から反射を自動計算(08:55)。 - Reflection Diffuse: ソフト減衰反射。粗い表面(木床、コンクリート)向け。Studio 環境は Diffuse 反射を使用。ソフト減衰が床素材により適合。注意: Docking Region、地面エンティティ、カスタム mesh を移動した場合、
Reflection_Diffuseのテクスチャ座標を再計算して Reality Composer Pro にインポート(09:25)。
Virtual Environment Probe、Brightness & Tint、Reverb
Virtual Environment Probe は環境内の色変化と照明強度を記述。システムがこれに基づき PBR マテリアルを自動着色。物体間の光の反射を近似(10:30)。環境が明暗 2 バリアント(Studio の Dark と Light など)をサポートする場合、2 つの事前生成 Environment Resource と blend factor を設定。app コードが両者間の遷移を駆動。システムが没入ブレンドを駆動。遷移時間は短めに——システム環境の明暗遷移は 1.5 秒(11:13)。
Brightness & Tint はパススルー画面の視聴者手部照明をカスタム環境トーンに合わせる——シアターライトが暗くなった後の手部の視覚感受のように(11:44)。対応コードプロパティは immersiveContentBrightness と surroundingsEffect。
Reverb コンポーネント は今年新規。Reality Composer Pro の Inspector で Add Component 追加(13:21)。プリセット: Medium Room (Treated)、Outdoor、Very Large Room など。Studio は Very Large Room プリセット。環境にカスタムオーディオがなくても Reverb プリセットを選択。システムが UI ボタンなどシステム効果音を空間化(13:46)。
Immersive Environment Picker
.immersiveEnvironmentPicker 修飾子で、カスタム環境がシステム環境と同じ選択リストに表示(14:45):
WindowGroup {
ContentView()
.immersiveEnvironmentPicker {
ForEach(viewModel.environmentItems) { item in
Button(item.title, image: item.thumbnail) {
Task {
await openImmersiveSpace(id: item.id)
}
}
}
}
}
キーポイント:
.immersiveEnvironmentPicker修飾子をContentView()に。当該ビュー内動画プレイヤーの環境選択リストを定義ForEachで環境データを反復。各エントリにtitleとthumbnail画像が必要Buttonの action でopenImmersiveSpace(id:)により対応没入空間をオープン- ユーザーはシステム環境リストでカスタム環境を選択。選択後、動画はその環境の Docking Region に自動ドッキング
SharePlay 環境同期
SharePlay が環境状態を同期可能に。複数参加者が同一没入体験を共有(15:35):
import AVKit
import GroupActivities
for await session in MyActivity.sessions() {
// join the session, activate the activity, etc.
playerViewController
.player?
.playbackCoordinator
.coordinateWithSession(session)
playerViewController
.groupExperienceCoordinator
.coordinateWithSession(session)
}
キーポイント:
AVKitとGroupActivitiesフレームワークをインポートplaybackCoordinator.coordinateWithSession(session)でメディア再生進行を同期。既存 APIgroupExperienceCoordinator.coordinateWithSession(session)は新規。視聴環境状態を同期- 両方同一
GroupSessionを使用。参加者はフルスクリーン視聴時に同一環境を共有
重要ポイント
-
何をするか: 既存 ImmersiveSpace メディア app に Docking Region を追加。Reality Composer Pro で既存環境に Video Dock プリセット追加。Player エンティティ位置と寸法調整。動画を「浮遊ウィンドウ」から「環境に埋め込まれた固定スクリーン」へ。なぜ価値があるか: 最低コストの没入体験アップグレード。コードロジック変更不要。Reality Composer Pro でコンポーネント属性調整のみ。始め方: 既存環境の Reality Composer Pro プロジェクトを開き、Video Dock プリセット挿入。Docking Region Component の width と Player エンティティ position を調整。
-
何をするか: カスタム環境に Reverb コンポーネントとメディア反射を追加。環境音響特性に合うリバーブプリセット選択(室内 Medium Room Treated、屋外 Outdoor、大空間 Very Large Room)。床マテリアルに Reflection_Diffuse または Reflection_Specular ノード接続。なぜ価値があるか: 聴覚と視覚の両次元から「この空間にいる」リアリティを強化。実装コスト低。始め方: Reality Composer Pro Inspector でルートエンティティに Add Component > Reverb、プリセット選択。床マテリアルの ShaderGraph で反射ノード接続。
-
何をするか: 多環境バリアントと Immersive Environment Picker を実装。同一環境アセットの明暗 2 バリアント準備。Virtual Environment Probe で 2 つの Environment Resource 設定。
.immersiveEnvironmentPickerでユーザーにカスタム環境選択。なぜ価値があるか: 環境バリアントはユーザーに選択権。Environment Picker はカスタム環境をシステム環境と並列表示。発見コスト低減。始め方: Destination Video の Studio プロジェクト構造を参照。Dark/Light 双バリアント + Environment Picker 実装を完全展示。
関連セッション
- Create custom environments for your immersive apps in visionOS — カスタム没入環境作成の完全ワークフロー
- Create enhanced spatial computing experiences with ARKit — ARKit 没入体験の高度構築方法
- Bring your iOS or iPadOS game to visionOS — 既存 iOS ゲームを visionOS 没入空間へ移行する実践
- Design interactive experiences for visionOS — visionOS インタラクティブ叙事体験の設計方法論
コメント
GitHub Issues · utterances