AR シーンにおける Unity のカメラ
Unity の AR 体験はカメラに支えられています。この記事では、AR シーンにおけるカメラの役割と、session がどのようにカメラのプロパティを制御して正しい AR 体験を実現するかを説明します。
はじめる前に
- ARSession の紹介 で、session の基本概念、構成、ワークフローを学んでください。
AR シーンにおけるカメラの役割
Unity では、カメラはプレイヤーにゲーム世界を見せるために使われますが、AR シーンではその役割はさらに重要です。仮想コンテンツを描画するだけでなく、現実世界に正しく重ねるために現実世界と整合している必要があります。
この動画は、簡単な AR シーンを示しています。左側が
Sceneビュー、右側がGameビューです。動画は Unity Editor のPlayモードで、simulation data を使って録画されています。Gameビューの内容は、現実世界でユーザーがスマートフォン上で見る内容と同じです。この動画では、ユーザーを表すカメラ(カメラアイコン)が現実世界でのユーザーの移動に応じて動きます。白い円錐は、過去一定期間のカメラの位置と向きを示しています。
Gameビューでは、カメラはSceneビューの仮想コンテンツを表示するだけでなく、その下に現実世界の画像も重ねています。これが AR シーンにおけるカメラの典型的な動作です。
仮想オブジェクトを現実のシーンに正しく重ねるには、AR の実行状態に応じていくつかのカメラプロパティを調整する必要があります。これらのプロパティには次が含まれます:
- カメラの transform(位置と向き)
- カメラの視野角(FOV)、アスペクト比、投影行列
- カメラのカリング設定(
<xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType>)
警告
アプリ開発時に、session camera 上のこれらのプロパティを変更することはサポートされていません。仮想コンテンツが現実世界と正しく整列しなくなり、ユーザー体験に影響する可能性があるためです。何らかの方法でこれらのプロパティを変更しても、AR システムが実行中にその変更を上書きするか、描画データと計算データの不整合により予期しない動作が発生することがあります。
これらのプロパティを制御する対象によって、session が使用するカメラは、session によって制御されるカメラと session によって制御されないカメラの 2 種類に分けられます。
session によって制御されるカメラ
session camera が headset や AR Foundation のような外部システムに属していない場合、session は上記のカメラプロパティを自動的に制御し、カメラが現実世界と正しく整合するようにします。
transform
カメラの transform(位置と向き)は、AR 機能の実行状態に応じて session により調整されます。一般に、session は motion tracking データや target tracking データに基づいてカメラの位置と向きを更新し、ユーザーが見る内容が現実世界と一致するようにします。
Unity では、すべての AR tracking の中心となる参照点を session origin と呼び、session 実行中にこの origin を決めるルールを center mode と呼びます。カメラの transform は center mode によって異なる動作をします:
<xref:u:easyar.ARSession.ARCenterMode.Camera>center mode では、カメラは自由に移動できます。一般に、
<xref:u:easyar.ARSession.ARCenterMode.Camera>mode はアプリケーションでほとんど使われません。<xref:u:easyar.ARSession.ARCenterMode.FirstTarget>のような他の center mode では、カメラは自由に移動できません。<xref:u:easyar.ARSession.ARCenterMode.FirstTarget>は、多くの AR アプリケーションで使われる mode です。
警告
カメラ transform の scale は常に (1, 1, 1) のままにしてください。カメラの scale を変更すると、予期しない動作を引き起こすことがあります。
投影行列
カメラの投影行列は、物理カメラの intrinsics に基づいて session により毎フレーム更新され、仮想コンテンツが現実のシーンに正しく重なるようにします。
カリング設定
カメラのカリング設定(<xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType>)は、session の mirror 設定に応じて調整され、仮想コンテンツが現実のシーンで正しく描画されるようにします。
<xref:u:easyar.ARSession.HorizontalFlip> で現在のカメラに対応する設定が <xref:u:easyar.ARSession.ARHorizontalFlipMode.World> のとき、<xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType> は true に設定されます。これは front camera の既定設定です。
AR 背景ビデオストリーム
AR シーンでは、カメラは通常、物理カメラのビデオストリームを背景として描画し、没入感を高めます。session はビデオストリームの取得と描画を自動的に処理し、それが仮想コンテンツと正しく整合するようにします。
session によって制御されないカメラ
headset や AR Foundation を使用する場合、または実装で <xref:u:easyar.FrameSource.IsCameraUnderControl> を <xref:u:easyar.FrameSource> に対して false と指定している場合、session は上記のカメラプロパティを制御しません。代わりに、それらは外部システムによって制御されます。
警告
この場合 session はカメラプロパティを制御しませんが、それらは headset SDK や AR Foundation のような第三者システムによって制御されるため、開発時にこれらのプロパティを変更することは引き続きサポートされていません。
カメラをコピーする際の注意点
session camera のパラメータを別のカメラにコピーしたい場合があります。その場合は、次の 2 点に特に注意してください。
- プロパティ取得のタイミング: 制御されるカメラを使う場合は session 出力の取得 を参照し、正しいタイミングでこれらのパラメータを取得してください。session によって制御されないカメラを使う場合は、第三者システムのドキュメントを参照して、正しいタイミングで取得してください。
- カメラの視野角(FOV)、アスペクト比、投影行列:
<xref:UnityEngine.Camera.projectionMatrix?displayProperty=nameWithType>を使ってカメラの投影行列を取得し、別のカメラへコピーしてください。<xref:UnityEngine.Camera.fieldOfView?displayProperty=nameWithType>と<xref:UnityEngine.Camera.aspect?displayProperty=nameWithType>は数学的には投影行列の一部であり、<xref:UnityEngine.Camera.fieldOfView?displayProperty=nameWithType>と<xref:UnityEngine.Camera.aspect?displayProperty=nameWithType>だけでは不十分です。
次のステップ
- Camera configuration を読んで、最適な AR 体験のためにカメラを設定する方法を学んでください