境界線を統合する
臨場感に富むアプリを構築するには、アプリで実世界でのユーザーの動きをトラッキングして、仮想ワールド内の動きに変換することが必要です。ユーザーがトラッキングカメラの表示領域外に出て位置トラッキングが失われた場合、そのことをアプリが認識できる必要があります。この状態はユーザーの快適なエクスペリエンスを妨げます。
境界線システムは、ユーザーの安全を確保し、ユーザーが新しい環境でヘッドセットを装着した場合に途切れることのないエクスペリエンスを提供します。このシステムでは、障害物のない床スペースの境界線を描くよう求められます。外側境界線を定義するためにスペースに描かれた外周に基づいて、Meta Questは軸に沿ったバウンディングボックス(プレイエリアと呼ばれる)を自動的に計算します。ユーザーの頭やコントローラーがプレイエリアに近づくと、境界線システムから視覚的な合図が出されます。アプリ内に壁と床のマーカーが半透明メッシュグリッドの形で設定され、パススルーカメラビューがフェードインします。こうして、ユーザーは、プレイエリアの外側にあるリアルタイムオブジェクトを避けられるようになります。以下の画像は、アクティブな境界線システムを示します。コントローラーを持ったユーザーの手が境界線を突き抜けています。

外側境界線とは、ユーザーが境界を設定する際に描画する点とそれらをつなぐ接続線の複合的組み合わせです。プレイエリアとは、外側境界線の内側に、軸に平行なバウンディングボックスとして自動生成される長方形の領域です。

位置をトラッキングするには、ユーザーが外側境界線を定義する必要があります。境界線システムが、ユーザー定義の境界線がスペースの最小要件を満たしているかどうかを確認します。歩行モードのアプリのエクスペリエンスの場合、臨場感のあるエクスペリエンスでユーザーが自由に動き回れるように、最小限の広さの、障害物のない床スペースが必要です。障害物のないプレイアブルエリアが6フィート×6フィートある、9フィート×9フィートのスペースを用意することをおすすめします。静止モードのアプリのエクスペリエンス(座ってプレイするアプリのエクスペリエンス)は、狭いスペースのために設計されたコンパクトな代替機能です。その中では、アプリ内オブジェクトとのインタラクションのために、腕を伸ばしたり胴を傾けたりして届く範囲を超える動きを促すことはありません。
トラッキングスペースとして、ローカルとステージの2種類があります。デフォルトのトラッキングスペースはローカルです。つまり、再センタリングが通常の動作として機能します。これは多くのアプリで適切な動作です。ユーザーが定義した境界線に従ってレイアウトを行うアプリの場合、エクスペリエンスが継続している間は同じスペースに結び付けられたままにすることもできます。例えば、ユーザーが定義したプレイエリア全体を利用するため家具を動的にレイアウトするアプリが考えられます。このようなアプリでは、ステージトラッキングスペースを使うとよいかもしれません。その原点はプレイエリアの中央の床にあり、前方向はバウンディングボックスのエッジの1つを指しています。これは、ユーザーが再センタリング操作を開始しても変更されません。ただし、ユーザーが1つのプレイエリアから別のプレイエリアに歩いて移動した場合は、アプリがmid-appを変更することがあります。そのため、アプリが一時停止の状態から戻った時点で境界を再確認してください。
境界線システムへのアクセスは、
OVRBoundaryクラスによって提供されます。さまざまな方法で境界線システムに対するインタラクションを行い、臨場感あふれるエクスペリエンスを生み出すことができます。
注: Oculus統合SDK v31からv57やMeta XR Core SDK v59以上の場合、OpenXRバックエンドで廃止されたAPIがいくつかあります。廃止されたAPIはアップグレードもサポートもされないため、使わないよう強くおすすめします。レガシーアプリでは引き続き利用できますが、コンパイラーの警告が出ます。廃止されたAPIは、enum value OVRBoundary.BoundaryType.OuterBoundary、struct OVRBoundary.BoundaryTestResult、OVRBoundary.TestNode()、OVRBoundary.TestPoint()、OVRBoundary.GetVisible()、OVRBoundary.SetVisible()です。
GetGeometryと
GetDimensionsを使用して、外側境界線やプレイエリアをクエリし、境界線タイプをユーザーがマッピングした境界線と厳密に一致する
BoundaryType.OuterBoundary、または外側境界線内に設定された軸に合わせた境界である
BoundaryType.PlayAreaとして渡します。
GetGeometryは、外側境界線エリアまたはプレイエリアを定義する、床面の最大256個のポイントを時計回りにした配列を返します。すべてのポイントは、トラッキング対象ノードによって共有されるローカルトラッキングスペースに返され、OVRCameraRigのTrackingSpaceアンカーを使ってアクセスできます。
GetDimensionsは、トラッキングスペースユニットの幅、高さ、奥行きを含むVector3を返します。高さは常に0になります。この情報を使って、境界線が現実世界に沿っている仮想世界を設定したり、プレイエリア内に重要かつインタラクティブなシーンオブジェクトをレンダリングしたりします。用途としては、ユーザーがプレイエリアから出た時点でゲームを一時停止させること、または境界点に基づいてジオメトリーを世界に配置してシーン内オブジェクトと統合された自然なバリアを作成すること、などが考えられます。例えば、プレイエリアに基づいてコックピットのサイズを調整したり、ユーザー自身の位置決めのためにユーザーの原点をシーンに表示したりできます。
注: 現在、OVRCameraRigのTrackingSpaceアンカーで
OVRManager.boundary.GetGeometry()を使用すると、LinkモードではStageタイプの
トラッキング原点に関して誤った結果が返されます。この問題に関する最新情報については、
Meta XR Core SDKリリースノートをご覧ください。
境界線は、ヘッドセットまたはいずれかのコントローラーが境界を越えるたびに表示されます。境界線の現在の可視性ステータスを確認するには、
GetVisible()を呼び出します。境界線がアクティブに表示される場合はtrueが返されます。この情報を使って、境界線が表示されている場合にオブジェクトを隠すことができます。
SetVisible()を呼び出し、可視性の値をtrueかfalseとして渡し、境界線を表示または非表示にします。境界線の可視性を設定する際には、例外的なケースを考慮してください。特定の条件下では、アプリリクエストがMeta Questによって無効にされます。例えば、トラッキングされているデバイスが境界線の自動表示をトリガーするほど接近している場合、境界エリアの可視化のfalse設定は無効になります。またユーザーが境界システムの視覚表示を無効化している場合、可視化のtrue設定は無効になります。
IsTriggering - ノードと境界線の間にトリガー中のインタラクションがあるかどうかを示すブーリアンClosestDistance - 境界からノードまでの距離ClosestPoint - 指定された境界面上のノードに最も近いポイントClosestPointNormal - 最も近いポイントでの、境界面の幾何学上の法線ベクトル