WWDC Quick Look 💓 By SwiftGGTeam
Enhance the immersion of media viewing in custom environments

Enhance the immersion of media viewing in custom environments

元の動画を見る

ハイライト

本セッションは 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)。対応コードプロパティは immersiveContentBrightnesssurroundingsEffect

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 で環境データを反復。各エントリに titlethumbnail 画像が必要
  • 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)
}

キーポイント:

  • AVKitGroupActivities フレームワークをインポート
  • playbackCoordinator.coordinateWithSession(session) でメディア再生進行を同期。既存 API
  • groupExperienceCoordinator.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 実装を完全展示。

関連セッション

コメント

GitHub Issues · utterances