ヒットテスト
このサンプルでは、現実世界にある点や平面に対してヒットテストを行う方法を紹介します。
レイキャストによるヒットテストの基本情報とAR Foundationのコンポーネントの機能については、UnityのドキュメントのAR Raycast Subsystem
を参照してください。ドキュメント全体では、レイキャストとヒットテストという用語が同じ意味で使用されています。
機能の有効化
この機能を使用するには、以下のOpenXRのプロジェクト設定でHit Testingにチェックする必要があります。
Project Settings > XR Plug-in Management > OpenXR (Androidタブ)
ヒットテストは、他の機能(平面検出や空間メッシュなど)を有効化する必要はなく単体で動作出来ます。
サンプルのインポート
まだサンプルをインポートしていない場合は、以下の手順でインポートすることができます。
サンプルシーンは以下の場所に存在します。
Assets/Samples/Snapdragon Spaces/1.X.X/Core Samples/Scenes/Hit Testing Sample/Hit Testing Sample.unity
サンプルの仕組み
AR Raycast Manager
をXR 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 {
...
}
}
サンプルシーンには、視線を追うデフォルトの赤色のギズモのインジケーターがあります。
毎フレーム、頭部の原点から視線の方向にレイキャストが作成されます。レイキャストが平面に当たると、インジケータのギズモの色が変わり、当たった位置に移動します。何も当たらなければ、ギズモの色は変わりません。