Android NDK アプリでヒットテストを実行する

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

ヒット結果のタイプ

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

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

ArFrame_hitTest、戻りリストで ArDepthPoint を確認します
プレーン(AR_TRACKABLE_PLANE 水平または垂直のサーフェスにヒットして、ポイントの正しい奥行きと向きを決定します。 3D サーフェスに垂直 飛行機の完全なジオメトリを使用して、平面(床や壁)にオブジェクトを配置します。すぐに正しい体重計が必要です。Depth ヒットテストの代替 ArFrame_hitTest、戻りリストで ArPlane を確認します。
機能ポイント(AR_TRACKABLE_POINT ユーザーがタップした地点の周囲の視覚的特徴に基づいて、ポイントの正しい位置と向きを決定します。 3D サーフェスに垂直 床や壁だけでなく、任意の面にオブジェクトを配置します。 ArFrame_hitTest、戻りリストで ArPoint を確認します。
インスタント プレースメント(AR_TRACKABLE_INSTANT_PLACEMENT_POINT 画面スペースを使用してコンテンツを配置します。最初は、アプリによって推定される深度が使用されます。すぐに機能しますが、ARCore が実際のシーンのジオメトリを決定できるようになると、ポーズと実際の深度は変化します +Y が上向き、重力とは反対 対象物を平面全体(床面や壁面)に設置する場合は、素早く設置することが重要で、初期の深さや規模が不明でも許容されます。 ArFrame_hitTestInstantPlacement

標準のヒットテストを行う

ArFrame_hitTest を呼び出してヒットテストを行います。

ArHitResultList* hit_result_list = NULL;
ArHitResultList_create(ar_session, &hit_result_list);
CHECK(hit_result_list);
if (is_instant_placement_enabled) {
  ArFrame_hitTestInstantPlacement(ar_session, ar_frame, x, y,
                                  k_approximate_distance_meters,
                                  hit_result_list);
} else {
  ArFrame_hitTest(ar_session, ar_frame, x, y, hit_result_list);
}

ヒットの結果を目的のタイプで絞り込みます。たとえば、ArPlane に焦点を当てたい場合は、次のようにします。

int32_t hit_result_list_size = 0;
ArHitResultList_getSize(ar_session, hit_result_list, &hit_result_list_size);

// Returned hit-test results are sorted by increasing distance from the camera
// or virtual ray's origin. The first hit result is often the most relevant
// when responding to user input.
ArHitResult* ar_hit_result = NULL;
for (int32_t i = 0; i < hit_result_list_size; ++i) {
  ArHitResult* ar_hit = NULL;
  ArHitResult_create(ar_session, &ar_hit);
  ArHitResultList_getItem(ar_session, hit_result_list, i, ar_hit);

  if (ar_hit == NULL) {
    LOGE("No item was hit.");
    return;
  }

  ArTrackable* ar_trackable = NULL;
  ArHitResult_acquireTrackable(ar_session, ar_hit, &ar_trackable);
  ArTrackableType ar_trackable_type = AR_TRACKABLE_NOT_VALID;
  ArTrackable_getType(ar_session, ar_trackable, &ar_trackable_type);
  // Creates an anchor if a plane was hit.
  if (ar_trackable_type == AR_TRACKABLE_PLANE) {
    // Do something with this hit result. For example, create an anchor at
    // this point of interest.
    ArAnchor* anchor = NULL;
    ArHitResult_acquireNewAnchor(ar_session, ar_hit, &anchor);

    // TODO: Use this anchor in your AR experience.

    ArAnchor_release(anchor);
    ArHitResult_destroy(ar_hit);
    ArTrackable_release(ar_trackable);
    break;
  }
  ArHitResult_destroy(ar_hit);
  ArTrackable_release(ar_trackable);
}
ArHitResultList_destroy(hit_result_list);

任意の光線と方向を使用してヒットテストを実施する

ヒットテストは通常、デバイスまたはデバイスのカメラからの光線として処理されますが、ArFrame_hitTestRay を使用すると、画面空間点ではなくワールド空間座標の任意の光線を使用してヒットテストを実施できます。

HitResult にアンカーを追加する

ヒット結果を取得したら、そのポーズを入力として使用し、シーンに AR コンテンツを配置できます。ArHitResult_acquireNewAnchor を使って、ヒットのロケーションに新しいアンカーを作成します。

次のステップ

  • GitHub の hello_ar_c サンプルアプリを確認します。