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

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

ヒット結果タイプ

ヒットテストでは、次の表に示すように、4 つの異なるタイプのヒット結果が生成されます。

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

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
飛行機 水平面や垂直面に接触することで、ポイントの正しい奥行きと向きが判断される 3D 表面に垂直 飛行機の完全なジオメトリを使用して、平面(床または壁)にオブジェクトを配置します。すぐに適切なスケールが必要。Depth ヒットテストのフォールバック 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> を使用して Anchor を作成し、レイキャスト ヒットを入力として使用してコンポーネントとして GameObject に追加します。ARAnchor コンポーネントはゲーム オブジェクトの Transform を継続的に更新するため、ゲーム オブジェクトはヒット結果の基礎となる Trackable にアタッチされたままになります。

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

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

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

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

次のステップ