ヒットテスト

はじめに
このサンプルでは、現実世界にある点や平面に対してヒットテストを行う方法を紹介します。
レイキャストによるヒットテストの基本情報とAR Foundationのコンポーネントの機能については、UnityのドキュメントのAR Raycast Subsystem
を参照してください。ドキュメント全体では、レイキャストとヒットテストという用語が同じ意味で使用されています。
機能の有効化
この機能を使用するには、以下のOpenXRのプロジェクト設定でHit Testingにチェックする必要があります。
Project Settings > XR Plug-in Management > OpenXR (Androidタブ)
サンプルのインポート
まだサンプルをインポートしていない場合は、以下の手順でインポートすることができます。
サンプルシーンは以下の場所に存在します。
Assets/Samples/Snapdragon Spaces/0.XX.0/Core Samples/Scenes/Hit Testing Sample/Hit Testing Sample.unity
サンプルの仕組み
平面検出の機能設定で「Use Scene Understanding Plane Detection」が有効になっている場合、ARRaycastHit.trackableId
フィールドは常に、ヒットした追跡可能オブジェクトのセッション固有の識別子としてのtrackableId
を返 します。
「Use Scene Understanding Plane Detection」が無効な場合、ARRaycastHit.trackableId
は、レイキャストがヒットした平面のtrackableIds
を返します。
AR Raycast Manager
をAR Session Origin
ゲームオブジェクトに追加すると、レイキャストのサブシステムが有効になります。利用可能なPlane Managerがない場合、Hit Testing
機能がヒットテストのための基礎を作ります。
後でPlane Managerが生成される場合、基礎となる平面検出のサブシステムはそのマネージャー用に調整され、ヒットトラッキングは異なる動作をするかもしれません(例えば、結果はPlane Managerに設定されたプレーンフィルタに依存します)。
ヒットテストを使い最適な結果を得るには、Plane Managerのすべてのフィルターを有効にしてください。別のPlane Managerを使用しない場合、ヒットテスト機能が自動的にこれを処理し、最良の結果が得られます。
AR Raycast Manager
のコンポーネントには、平面との交差に成功したときにスポーンするプレハブを定義するフィールドがあります。この機能はHit Testing Sample Controller
のコンポーネントに実装されているため、このサンプルではプレハブは空欄のままです。
レイキャストマネージャのレイキャスト関数は、レイがプレーンにヒットしたかどうかに応じてbool
値を返します。ヒットした結果はARRaycastHit
リストに追加され、距離の昇順でソートされます。
public void Update() {
CastRay();
_activeIndicator.transform.position = _desiredPosition;
}
private void CastRay() {
Ray ray = new Ray(_cameraTransform.position, _cameraTransform.forward);
List<ARRaycastHit> hitResults = new List<ARRaycastHit>();
if (_raycastManager.Raycast(ray, hitResults)) {
_desiredPosition = hitResults[0].pose.position;
...
}
else {
...
}
}
サンプルシーンには、視線を追うデフォルトの赤色のギズモのインジケーターがあります。
毎フレーム、頭部の原点から視線の方向にレイキャストが作成されます。レイキャストが平面に当たると、インジケータのギズモの色が変わり、当たった位置に移動します。何も当たらなければ、ギズモの色は変わりません。