Android NDK uygulamanızda isabet testleri gerçekleştirin

Bir 3D nesnenin sahnenizdeki doğru yerini belirlemek için isabet testi yapın. Doğru yerleşim, AR içeriğinin uygun (görünen) boyutta oluşturulmasını sağlar.

İsabet sonucu türleri

İsabet testi, aşağıdaki tabloda gösterildiği gibi, dört farklı türde isabet sonucu verebilir.

İsabet sonucu türü Açıklama Yön Kullanım alanı Yöntem çağrıları
Derinlik (AR_TRACKABLE_DEPTH_POINT) Bir noktanın doğru derinliğini ve yönünü belirlemek için sahnenin tamamından alınan derinlik bilgilerini kullanır 3D yüzeye dik Sanal nesneyi rastgele bir yüzeye yerleştirin (yalnızca zeminlere ve duvarlara değil) Bunun çalışması için ArDepthMode etkinleştirilmelidir.

ArFrame_hitTest, iade listesinde ArDepthPoint olup olmadığını kontrol edin
Uçak (AR_TRACKABLE_PLANE) Bir noktanın doğru derinliğini ve yönünü belirlemek için yatay ve/veya dikey yüzeylere çarpar 3D yüzeye dik Bir nesneyi, uçağın tam geometrisini kullanarak düzleme (zemin veya duvar) yerleştirin. Hemen doğru ölçek gerekiyor. Derinlik isabet testinin yedeği ArFrame_hitTest, iade listesindeki ArPlane olup olmadığını kontrol edin
Özellik noktası (AR_TRACKABLE_POINT) Bir noktanın doğru konumunu ve yönünü belirlemek için kullanıcının dokunduğu noktanın etrafındaki görsel özelliklerden yararlanır 3D yüzeye dik Bir nesneyi sadece zemin ve duvarlara değil, rastgele bir yüzeye yerleştirin ArFrame_hitTest, iade listesindeki ArPoint olup olmadığını kontrol edin
Anında Yerleşim (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) İçerik yerleştirmek için ekran alanını kullanır. Başlangıçta uygulama tarafından sağlanan tahmini derinliği kullanır. Anında çalışır, ancak ARCore gerçek sahne geometrisini belirlediğinde poz ve gerçek derinlik değişir. +Y, yer çekiminin karşısında yukarıyı gösteriyor Hızlı yerleştirmenin kritik önemde olduğu ve deneyimin bilinmeyen başlangıç derinliği ve ölçeğin tolere edilebileceği uçağın tam geometrisini kullanarak bir nesneyi düzleme (zemin veya duvar) yerleştirin ArFrame_hitTestInstantPlacement

Standart isabet testi uygulama

İsabet testi yapmak için ArFrame_hitTest numaralı telefonu arayın.

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);
}

İsabet sonuçlarını, ilgilendiğiniz türe göre filtreleyin. Örneğin, ArPlane reklamlara odaklanmak istiyorsanız:

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);

Rastgele bir ışın ve yön kullanarak isabet testi gerçekleştirme

Çarpışma testleri genellikle cihaz veya cihaz kamerasından gelen ışınlar olarak değerlendirilir, ancak dünya uzayda bir ekran-boşluk noktası yerine rastgele bir ışın kullanarak isabet testi yapmak için ArFrame_hitTestRay aracını kullanabilirsiniz.

HitResult'a Sabitleme Ekleme

Bir isabet sonucu elde ettiğinizde, sahnenize AR içeriği yerleştirmek için bu pozisyonu giriş olarak kullanabilirsiniz. İsabet konumunda yeni bir Sabit oluşturmak için ArHitResult_acquireNewAnchor simgesini kullanın.

Sonraki adımlar

  • GitHub'da hello_ar_c örnek uygulamasına göz atın.