AR シーンにおける Unity カメラ
Unity で AR を表現するにはカメラが不可欠です。以下では、AR シーンにおけるカメラの役割と、session がカメラプロパティを制御して正しい AR 体験を確保する仕組みについて説明します。
開始する前に
- ARSession 入門で session の基本概念、構成、ワークフローを理解してください。
AR シーンにおけるカメラの役割
Unity のカメラはプレイヤーにゲーム世界を表示しますが、AR シーンではその役割がより重要です。仮想コンテンツのレンダリングだけでなく、仮想オブジェクトが現実シーンに正確に重なるよう現実世界との位置合わせも行います。
この動画はシンプルな AR シーンを示しています。左側が
Sceneビュー、右側がGameビューです。Unity エディタのPlayモードでシミュレーションデータを使用して録画されました。Gameビューの内容は現実世界でスマートフォンを通してユーザーが見る内容と同一です。動画内でユーザーを表すカメラ(カメラアイコン)は、現実世界でのユーザーの動きに応じて移動します。白色の円錐は過去のカメラ位置と向きの軌跡を示しています。
Gameビューでは、カメラがSceneビューの仮想コンテンツを表示すると同時に、仮想コンテンツの背景に現実世界の映像を重ねて表示しています。これが AR シーンにおけるカメラの典型的な動作です。
仮想オブジェクトを現実シーンに正確に重ねるため、カメラの一部プロパティは AR 実行状態に基づいて調整されます。これらには以下が含まれます:
- カメラの transform(位置と向き)
- カメラの視野角(FOV)、アスペクト比(aspect ratio)、投影行列
- カメラのカリング設定(GL.invertCulling)
警告
アプリ開発時、session カメラのこれらのプロパティを変更することはサポートされていません。仮想コンテンツと現実世界の位置合わせが不正確になり、ユーザー体験を損なう可能性があります。これらのプロパティを何らかの手段で変更しても、AR システムは実行中に変更を上書きするか、レンダリングデータと計算データの不一致により予期せぬ動作を引き起こします。
これらのプロパティを制御するオブジェクトに基づき、session で使用されるカメラは2種類に分類されます:session 管理下のカメラと session 管理外のカメラ。
Session 管理下のカメラ
session のカメラがヘッドセットや AR Foundation などの外部システムに属さない場合、session はカメラの上記プロパティを自動制御し、現実世界との正確な位置合わせを保証します。
Transform
カメラの transform(位置と向き)は、AR 機能の実行状態に基づき session によって調整されます。一般的に session はモーション追跡データおよび/またはターゲットの追跡データを使用してカメラの位置と向きを更新し、ユーザーが見る内容と現実世界の内容を一致させます。
Unity では、すべての AR 追跡の基準点を session 中心と呼び、この中心を決定する session 実行中のルールを中心モードと呼びます。異なる中心モードでは、カメラの transform 動作が異なります:
Camera 中心モードでは、カメラは自由に移動できます。
通常、Camera モードがアプリで使用されることは稀です。
その他の中心モード(例:FirstTarget)では、カメラは自由に移動できません。
FirstTarget は大半の AR アプリが採用するモードです。
警告
カメラ transform の scale 値は常に (1, 1, 1) を維持してください。カメラの scale 変更は予期せぬ動作を引き起こす可能性があります。
投影行列
カメラの投影行列は、session がフレーム更新する際に物理カメラの内部パラメータに基づき更新され、仮想コンテンツが現実シーンに正確に重なるようにします。
カリング設定
カメラのカリング設定(GL.invertCulling)は session のミラーリング設定に基づき調整され、仮想コンテンツが現実シーンに正しくレンダリングされるようにします。
HorizontalFlip で使用中カメラの設定が World に対応する場合、GL.invertCulling は true に設定されます。これはフロントカメラのデフォルト設定です。
AR 背景ビデオストリーム
AR シーンでは、カメラは通常、ユーザーの没入感を高めるため物理カメラからのビデオストリームを背景としてレンダリングします。session はビデオストリームの取得とレンダリングを自動処理し、ビデオストリームと仮想コンテンツの正確な位置合わせを保証します。
Session 管理外のカメラ
ヘッドセットや AR Foundation を使用する場合、および IsCameraUnderControl を false と指定して実装された FrameSource を使用する場合、session はカメラの上記プロパティを制御せず、外部システムが制御を担当します。
警告
この場合でも session はカメラプロパティを制御しませんが、これらはヘッドセット SDK や AR Foundation などのサードパーティシステムによって制御されるため、アプリ開発時にこれらのプロパティを変更することは依然としてサポートされていません。
カメラ複製時の注意点
session カメラのパラメータを別のカメラに複製する必要がある場合、以下の2点に特に注意してください:
- プロパティ取得タイミング:管理下カメラを使用する場合、session 実行結果の取得を参照し適切なタイミングでパラメータを取得する必要があります;session 管理外のカメラを使用する場合、サードパーティシステムのドキュメントを参照し適切なタイミングで取得する必要があります。
- カメラの視野角(FOV)、アスペクト比、投影行列:Camera.projectionMatrix を使用してカメラ投影行列を取得し、別のカメラに複製する必要があります。Camera.fieldOfView および Camera.aspect は数学的に投影行列の一部であり、これらを使用するだけでは不十分です。
次のステップ
- カメラ設定 を読み、最適な AR 体験を得るためのカメラ設定方法を学びましょう