Unity でのカメラの設定
[アーティクル] 03/21/2023
7 人の共同作成者
フィードバック
この記事の内容
Mixed Reality ヘッドセットを装着すると、それがホログラフィックの世界の中心になります。 Unity の Camera コンポーネントは、ステレオスコピック レンダリングを自動的に処理し、頭の動きと回転を追跡します。 ただし、視覚効果とホログラムの安定性 を完全に最適化するには、以下で説明するカメラ設定を設定する必要があります。
HoloLens と VR イマーシブ ヘッドセット
Unity の Camera コンポーネントの既定の設定は、従来の 3D アプリケーション用であり、現実世界を持たないため、スカイボックスのような背景を必要とします。
イマーシブ ヘッドセット で実行すると、ユーザーに表示されるすべてのものがレンダリングされるため、スカイボックスを維持することをお勧めします。
ただし、HoloLens のような ホログラフィック ヘッドセット で実行すると、カメラがレンダリングするすべての要素の背後に現実世界が表示されます。 カメラの背景を、Skybox テクスチャではなく透明に設定します (HoloLens では、黒は透明としてレンダリングされます)。
[階層] パネルで [メイン カメラ] を選択します
[インスペクター] パネルで、Camera コンポーネントを見つけて、[フラグのクリア] ドロップダウンを [スカイボックス] から [単色] に変更します
[背景色] ピッカーを選択し、RGBA の値を (0,0, 0, 0) に変更します。
これをコードから設定する場合は、Unity の Color.clear
を使用できます
MRTK は、カメラ システム プロファイル の構成 に基づいて、特定のカメラ設定を自動的に処理します。
Namespace: Microsoft.MixedReality.Toolkit.CameraSystem
Type: MixedRealityCameraSystem
カメラの不透明性を確認するために、MixedRealityCamera システムには IsOpaque
プロパティ があります。
CoreServices.CameraSystem.IsOpaque;
Namespace: UnityEngine.XR
Type: XRDisplaySubsystem
スクリプト コードを使用して、アクティブに実行されている XRDisplaySubsystem で displayOpaque をチェックすることで、ヘッドセットがイマーシブかホログラフィックかを実行時に判断できます。
カメラの設定
開発しているエクスペリエンスの種類に関係なく、メイン カメラは常にデバイスのヘッドマウント ディスプレイに接続されている主要なステレオ レンダリング コンポーネントです。 ユーザーの開始位置を (X: 0, Y: 0, Z: 0) に想定すると、アプリのレイアウトが簡単になります。 メイン カメラはユーザーの頭の移動を追跡するため、メイン カメラの開始位置を設定することで、ユーザーの開始位置を設定できます。
行う必要がある中心的な選択は、開発するヘッドセットが HoloLens 用と VR イマーシブ用のどちらであるかです。 それが完了したら、該当する設定セクションにスキップします。
HoloLens カメラの設定
HoloLens アプリの場合は、シーン環境にロックするオブジェクトに対してアンカーを使用する必要があります。 安定性を最大限に高め、複数の部屋にアンカーを作成するには、無制限空間を使用することをお勧めします。
このステップバイ ステップ チュートリアル に従って、Unity プロジェクトに新しい Mixed Reality ツールキットを追加して自動的に構成します。 Unity 用の MRTK の MixedRealityPlayspace クラスを直接操作して、[ターゲット スケール] を [ワールド] に設定することもできます。
MRTK は、プレイスペースとカメラの位置を自動的に処理する必要がありますが、再確認することをお勧めします。
[階層] パネルで、[MixedRealityPlayspace] オブジェクトを展開し、[メイン カメラ] の子オブジェクトを検索します
[インスペクター] パネルで [変換] コンポーネントを見つけて、[位置] を (X: 0、Y: 0、Z: 0) に変更します
XRInputSubsystem で追跡原点モードを設定します。 サブシステムを取得した後、TrySetTrackingOriginMode を呼び出します。
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Device);
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Unbounded); // Recommendation for OpenXR
ARSession は、アンカーと ARKit/ARCore を使用して適切に動作する HoloLens アプリケーションに使用できます。
重要
AR セッションと関連する機能には、AR Foundation がインストールされている必要があります。
ARSession を使用せずに、カメラの変更を手動で適用することもできます。
[階層] パネルで [メイン カメラ] を選択します
[インスペクター] パネルで [変換] コンポーネントを見つけて、[位置] を (X: 0、Y: 0、Z: 0) に変更します
Unity のインスペクター ペインのカメラ
[メイン カメラ] に [TrackedPoseDriver] を追加します
[階層] パネルで [メイン カメラ] を選択します
[インスペクター] パネルで [変換] コンポーネントを見つけて、[位置] を (X: 0、Y: 0、Z: 0) に変更します
Unity のインスペクター ペインのカメラ
[Windows ストア プレーヤー設定] の [その他の設定] セクションに移動します
デバイスとして [Windows Mixed Reality] を選択します。これは、以前のバージョンの Unity では [Windows Holographic] として表示される場合があります
[仮想現実のサポート] を選択します
Main Camera オブジェクトはカメラとして自動的にタグ付けされるため、Unity ではすべての移動と変換が可能になります。
Note
これらの設定は、アプリの各シーンのカメラに適用する必要があります。
既定では、Unity で新しいシーンを作成すると、Camera コンポーネントを含む Main Camera GameObject が階層に含められますが、設定が正しく適用されていない可能性があります。
VR カメラ設定
Windows Mixed Reality は、向き限定および座位のアプリからルーム スケールのアプリまで、広範なエクスペリエンスのスケール のアプリをサポートしています。 HoloLens では、さらに進んで、ユーザーが 5 メートルを超えて歩き、建物の床全体を探索できるワールド スケールのアプリを構築できます。
Unity で複合現実エクスペリエンスを構築する最初の手順は、アプリがターゲットとするエクスペリエンスのスケール を決定することです。
ルーム スケールまたはスタンディング エクスペリエンス
Note
HL2 用に構築する場合は、目の高さのエクスペリエンスを作成するか、シーンの理解 を使用してシーンの床を推論することを検討することをお勧めします。
Unity 用の MRTK の MixedRealityPlayspace クラスを使用し、[ターゲット スケール] を [ルーム] または [スタンディング] に設定します。
MRTK は、プレイスペースとカメラの位置を自動的に処理する必要がありますが、再確認することをお勧めします。
[階層] パネルで、[MixedRealityPlayspace] オブジェクトを展開し、[メイン カメラ] の子オブジェクトを検索します
[インスペクター] パネルで [変換] コンポーネントを見つけて、[位置] を (X: 0、Y: 0、Z: 0) に変更します
[Windows ストア プレーヤー設定] の [その他の設定] セクションに移動します
デバイスとして [Windows Mixed Reality] を選択します。これは、以前のバージョンの Unity では [Windows Holographic] として表示される場合があります
[仮想現実のサポート] を選択します
Main Camera オブジェクトはカメラとして自動的にタグ付けされるため、Unity ではすべての移動と変換が可能になります。
Note
これらの設定は、アプリの各シーンのカメラに適用する必要があります。
既定では、Unity で新しいシーンを作成すると、Camera コンポーネントが含まれている Main Camera GameObject が階層に含められますが、次の設定は適切に適用されません。
Namespace: UnityEngine.XR
Type: XRDevice
立位スケール またはルーム スケールのエクスペリエンス の場合は、床を基準としてコンテンツを配置する必要があります。 最初の実行時に設定された、ユーザーが定義したフロア レベルの原点とオプションの部屋の境界を表す空間ステージ を使用して、ユーザーのフロアについて推論します。
Unity がワールド座標系をフロアレベルで動作させていることを確認するために、Unity が RoomScale 追跡空間の種類を使用していることを設定し、テストすることができます。
if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
// RoomScale mode was set successfully. App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
// RoomScale mode was not set successfully. App cannot make assumptions about where the floor plane is.
}
SetTrackingSpaceType によって true が返された場合、Unity は、そのワールド座標系をステージ座標系 を追跡するように切り替えています。
SetTrackingSpaceType から false が返された場合、ユーザーが環境に床を設定していない可能性があるため、Unity はステージ座標系に切り替えることができませんでした。 false の値が戻されることはあまりありませんが、ステージが別の部屋に設定されていて、ユーザーが新しいステージを設定せずに現在の部屋にデバイスを移動した場合に発生する可能性があります。
RoomScale 追跡スペースの種類が正常に設定されると、y=0 平面に配置されたコンテンツがフロアに表示されます。 0, 0, 0 の原点は、部屋の設定時にユーザーが立っていた床の特定の場所になります (-Z は設定時に向いていた前方方向を表します)。
座位のエクスペリエンス
Unity 用の MRTK の MixedRealityPlayspace クラスを使用し、[ターゲット スケール] を [座位] に設定します。
MRTK は、プレイスペースとカメラの位置を自動的に処理する必要がありますが、再確認することをお勧めします。
[階層] パネルで、[MixedRealityPlayspace] オブジェクトを展開し、[メイン カメラ] の子オブジェクトを検索します
[インスペクター] パネルで [変換] コンポーネントを見つけて、[位置] を (X: 0、Y: 0、Z: 0) に変更します
[Windows ストア プレーヤー設定] の [その他の設定] セクションに移動します
デバイスとして [Windows Mixed Reality] を選択します。これは、以前のバージョンの Unity では [Windows Holographic] として表示される場合があります
[仮想現実のサポート] を選択します
Main Camera オブジェクトはカメラとして自動的にタグ付けされるため、Unity ではすべての移動と変換が可能になります。
Note
これらの設定は、アプリの各シーンのカメラに適用する必要があります。
既定では、Unity で新しいシーンを作成すると、Camera コンポーネントが含まれている Main Camera GameObject が階層に含められますが、次の設定は適切に適用されません。
Namespace: UnityEngine.XR
Type: XRDevice
向き限定 や座位のエクスペリエンス を構築するには、Unity を固定の追跡空間の種類に設定する必要があります。 固定の追跡空間は、静止基準系 を追跡するように Unity のワールド座標系を設定します。 固定追跡モードでは、アプリの起動時に、カメラの既定の場所 (前方が Z) の直前にあるエディターに配置されたコンテンツがユーザーの前に表示されます。
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
Namespace: UnityEngine.XR
Type: InputTracking
360 度ビデオ ビューアー (位置指定ヘッドの更新によって錯覚が台無しになる) などの純粋な向き限定のエクスペリエンス の場合は、XR.InputTracking.disablePositionalTracking を true に設定できます。
InputTracking.disablePositionalTracking = true;
座位のエクスペリエンス の場合、ユーザーが後で座位の基点をもう一度中央に揃えられるようにするために、XR.InputTracking.Recenter メソッドを呼び出すことができます。
InputTracking.Recenter();
座位のエクスペリエンス を構築する場合は、XR.InputTracking.Recenter メソッドを呼び出すことによって、ユーザーの現在の頭の位置で Unity のワールド原点をもう一度中心に置くことができます。
カメラの背景の設定
MRTK を使用している場合、カメラの背景は自動的に構成および管理されます。 XR SDK または従来の WSA プロジェクトでは、HoloLens でカメラの背景を黒一色に設定し、スカイボックスを VR 用にしておくことをお勧めします。
複数のカメラの使用
シーンに複数の Camera コンポーネントがある場合、Unity は、MainCamera タグがある GameObject に基づいてステレオスコピック レンダリングに使用するカメラを認識します。 従来の XR では、このタグを使用してヘッド トラッキングも同期します。 XR SDK では、ヘッド トラッキングは、カメラにアタッチされている TrackedPoseDriver スクリプトによって行われます。
深度バッファーの共有
アプリの深度バッファーを Windows の各フレームで共有すると、レンダリングするヘッドセットの種類に基づいて、アプリのホログラムの安定性において 2 つのいずれかが向上します。
VR イマーシブ ヘッドセット は、深度バッファーが指定されると位置の再投影を処理し、位置と向きの両方で予測ミスがないようにホログラムを調整できます。
HoloLens ヘッドセット には、いくつかの異なる方法があります。 HoloLens 1 は、深度バッファーが指定されるとフォーカス ポイント を自動的に選択し、ほとんどのコンテンツと交差する平面に沿ったホログラムの安定性を最適化します。 HoloLens 2 は、Depth LSR (「解説」を参照) を使用してコンテンツを安定させます。
MRTK の構成ダイアログ は、XR SDK と従来の WSA の両方に対して深度バッファー設定を試みますが、これらのタブをチェックし、Unity の設定を確認することをお勧めします。
Unity アプリが Windows に深度バッファーを指定するかどうかを設定するには:
[編集] >[プロジェクトの設定] >[XR プラグイン管理] の順に移動し、メニュー項目が展開されていることを確認します。
選択した XR ランタイム (Windows Mixed Reality または OpenXR のいずれか) に対応するメニュー項目をクリックします。 また、Windows スタンドアロンとユニバーサル Windows プラットフォームの両方のタブとして、適切なビルド プラットフォームが選択されていることを確認します。
有効にして構成するには:
OpenXR の場合は、[深度送信モード] ドロップダウンで、深度の形式または [なし] を選択します。
Windows Mixed Reality の場合は、[共有深度バッファー] チェックボックスをオンまたはオフにします。 次に、[深度バッファーの形式] ドロップダウンから形式を選択します。
Note
パフォーマンスを向上させるには、通常は 16 ビットの深度バッファーを使用することをお勧めします。 ただし、16 ビット深度の形式を使用する場合、この設定では Unity はステンシル バッファーを作成しない ため、ステンシル バッファーを必要とする効果 (一部の Unity UI のスクロール パネルなど) は機能しません。 24 ビットの深度の形式 を選択した場合、エンドポイントのグラフィックス プラットフォームが対応する場合は、通常、8 ビットのステンシル バッファー が作成されます。
Unity アプリが Windows に深度バッファーを指定するかどうかを設定するには:
[編集] >[プロジェクトの設定] >[プレーヤー] >[ユニバーサル Windows プラットフォーム] >[XR 設定] の順に移動します。
[Windows Mixed Reality SDK] 項目を展開します。
[深度バッファーの共有を有効にする] チェックボックスをオンまたはオフにします。 新しいプロジェクトでは [深度バッファーの共有を有効にする] が既定でオンになっていますが、以前のプロジェクトでは既定でオフになっている可能性があります。
深度バッファーは、メイン カメラの Unity で設定した近距離と遠距離の平面を使用して、Windows が深度バッファー内の正規化されたピクセルごとの深度値をメートル単位の距離に正確にマッピングできる限り、視覚効果を向上させることができます。 レンダー パスが通常の方法で深度値を処理する場合、ここでは通常問題ありませんが、既存のカラー ピクセルに透けて見えているときに深度バッファーに書き込む半透明のレンダー パスは、再投影を混乱させる可能性があります。 レンダー パスによって最終的な深度ピクセルの多くが不正確な深度値のままになることがわかっている場合は、[深度バッファーの共有を有効にする] をオフにすることで、視覚効果が向上する可能性があります。
Note
パフォーマンスを向上させるには、通常は 16 ビットの深度バッファーを使用することをお勧めします。 ただし、16 ビット深度の形式を使用する場合、この設定では Unity はステンシル バッファーを作成しない ため、ステンシル バッファーを必要とする効果 (一部の Unity UI のスクロール パネルなど) は機能しません。 24 ビットの深度の形式 を選択した場合、エンドポイントのグラフィックス プラットフォームが対応する場合は、通常、8 ビットのステンシル バッファー が作成されます。
クリッピング平面の使用
ユーザーに近すぎるコンテンツのレンダリングは、複合現実では不快に感じられる可能性があります。 Camera コンポーネントでは、近距離と遠距離のクリッピング平面 を調整できます。
[階層] パネルで [メイン カメラ] を選択します
[インスペクター] パネルで、Camera コンポーネントの [クリッピング平面] を見つけて、[近距離] テキスト ボックスを [0.3] から [0.85] に変更します。 さらに近くにレンダリングされたコンテンツは、ユーザーに不快感を与える可能性があるため、レンダリング距離のガイドライン に従って回避する必要があります。
カメラをもう一度中心に置く
座位のエクスペリエンス を構築する場合は、レガシ XR では XR.InputTracking.Recenter メソッド、または XR SDK では XRInputSubsystem.TryRecenter を呼び出すことによって、ユーザーの現在の頭の位置で Unity のワールド原点をもう一度中心に置くことができます。
テレポーテーション
この機能は、通常、VR エクスペリエンス用に予約されています。
MRTK には、多関節ハンドとコントローラーをまたいで自動的に機能する、組み込みのテレポート システム が用意されています。
MRTK のテレポート実装を使用することをお勧めします。
MRTK を使用しないことを選択した場合、Unity は XR Interaction Toolkit でテレポーテーションを実装します。
独自の実装を選択した場合は、カメラを直接移動できないことに注意してください。 Unity によるヘッド トラッキング用のカメラの制御により、カメラに階層内の親を与え、代わりにその GameObject を移動する必要があります。 これは MRTK のプレイスペースに相当します。
MRTK のテレポート実装を使用することをお勧めします。
独自の実装を選択した場合は、カメラを直接移動できないことに注意してください。 Unity によるヘッド トラッキング用のカメラの制御により、カメラに階層内の親を与え、代わりにその GameObject を移動する必要があります。 これは MRTK のプレイスペースに相当します。
再投影モード
HoloLens とイマーシブ ヘッドセットはどちらも、アプリがレンダリングする各フレームを再投影して、フォトンが放出されたときのユーザーの実際の頭の位置の予測ミスを調整します。
既定:
アプリが特定のフレームに深度バッファーを提供する場合、VR イマーシブ ヘッドセット は位置の再投影を処理します。 イマーシブ ヘッドセットでは、位置と向きの両方で予測ミスが発生しないようにホログラムの調整も行われます。 深度バッファーが指定されていない場合、システムは向きの予測ミスのみを修正します。
HoloLens 2 のようなホログラフィック ヘッドセット は、アプリがその深度バッファーを提供するかどうかに関係なく、位置の再投影を処理します。 レンダリングは現実世界によって提供される安定した背景でまばらであることが多いため、HoloLens の深度バッファーなしで位置の再投影が可能です。
MRTK には、現時点では再投影モード用のヘルパーはありません。 詳細については、その他のタブのいずれかを参照してください。
次の開発チェックポイント
Microsoft による Unity 開発体験に沿って進んでいるなら、ここでは MRTK の主要構成要素を扱います。 ここから、次の構成要素を続けることができます。
または、Mixed Reality プラットフォームの機能と API に移動します。
いつでも Unity 開発チェックポイント に戻ることができます。
関連項目