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)
永続 Raycast(インスタント プレースメント) 画面スペースを使用してコンテンツを配置します。最初は、アプリによって推定される深度が使用されます。すぐに機能しますが、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 にゲーム オブジェクトがアタッチされたままになります。

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

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

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

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

次のステップ