Unity(AR Foundation)アプリでレイキャストを実行する

raycast(ヒットテスト)を実行して、シーン内の 3D オブジェクトの正しい配置を決定します。正しく配置することで、AR コンテンツが適切な(見かけの)サイズでレンダリングされます。

ヒット結果のタイプ

ヒットテストでは、次の表に示すように、4 種類のヒット結果が得られます。

ヒット結果のタイプ 説明 向き ユースケース メソッド呼び出し
奥行き シーン全体の深度情報を使用して、ポイントの正しい深度と向きを決定します。 3D サーフェスに垂直 仮想オブジェクトを任意のサーフェス(床や壁だけでなく)に配置する この機能を使用するには、Depth を有効にする必要があります。

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
飛行機 水平面または垂直面をヒットして、点の正しい深さと向きを決定します。 3D サーフェスに垂直 平面の完全なジオメトリを使用して、平面(床または壁)にオブジェクトを配置します。すぐに正しいスケールを必要としています。デプス ヒットテストのフォールバック ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon)
特徴点 ユーザーがタップしたポイントの周囲の視覚的な特徴に基づいて、ポイントの正しい位置と向きを決定します。 3D サーフェスに垂直 任意の表面(床や壁以外)にオブジェクトを配置します。 ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.FeaturePoint)
永続的なレイキャスト(インスタント プレースメント) 画面スペースを使用してコンテンツを配置します。最初は、アプリが提供する推定深度を使用します。すぐに動作しますが、ARCore が実際のシーン ジオメトリを決定すると、ポーズと実際の深度が変化します。 +Y は上向き(重力に逆らう方向) 迅速な配置が重要で、不明な初期の深度とスケールを許容できる場合は、プレーンの完全なジオメトリを使用して、プレーン(床または壁)にオブジェクトを配置します。 ARRaycastManager.AddRaycast(Vector2 screenPoint, float estimatedDistance)

標準のレイヤキャストを実行する

ARRaycastManager.Raycast(Vector2, List<ARRaycastHit>, TrackableType) を呼び出してレイキャスト(ヒットテスト)を実行します。ARRaycastManager はすべての TrackableType をサポートしています。

var touch = Input.GetTouch(0);
if (touch.phase != TouchPhase.Began)
    return;

// Raycast against planes and feature points.
const TrackableType trackableTypes =
    TrackableType.FeaturePoint |
    TrackableType.PlaneWithinPolygon;
List<ARRaycastHit> hits = new List<ARRaycastHit>();
// Perform the raycast.
if (raycastManager.Raycast(touch.position, hits, trackableTypes))
{
    // Raycast hits are sorted by distance, so the first one will be the closest hit.
    var hit = hits[0];
    // Do something with hit.
}

任意のレイと方向を使用してレイキャストを実行する

通常、レイキャストはデバイスまたはデバイスのカメラからのレイとして扱われますが、Raycast(Ray, List<ARRaycastHit>, TrackableType) を使用すると、画面空間の点ではなく、ワールド空間座標で任意のレイを使用してレイキャストを行うことができます。

ARRaycastHit を使用してアンカーを作成する

レイキャスト ヒットしたら、GameObject.AddComponent<ARAnchor> を使用してアンカーを作成し、レイキャスト ヒットを入力として使用して、コンポーネントとして GameObject に追加します。ARAnchor コンポーネントはゲーム オブジェクトの Transform を継続的に更新するため、ゲーム オブジェクトはヒット結果の基盤となる Trackable に接続されたままになります。

永続的なレイキャスト(インスタント プレースメント)

永続的なレイキャストは、画面上の位置とサーフェスまでの推定距離を入力として使用し、新しい ARRaycast を作成してシーンにAR コンテンツを配置します。ARCore では、これをインスタント プレースメントと呼びます。

ARRaycastManager.AddRaycast() を呼び出して ARRaycast を作成します。この ARRaycast は、ARRaycastManager.RemoveRaycast() を呼び出すか、ARRaycastManager を無効にするまで自動的に更新され続けます。

最初は、ARRaycast の距離は AddRaycast() 呼び出しで指定された距離になります。ARCore がローカル ジオメトリをマッピングし、交差する平面を見つけると、距離が実際の距離に更新されます。距離の変化は、物体の見かけの「サイズ」や知覚されるスケールに影響する可能性があります。

次のステップ