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

Sahnenizdeki 3D nesnenin doğru yerleşimini belirlemek için isabet testi gerçekleştirin. Doğru yerleşim, AR içeriğinin uygun (görünür) 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 derinlik bilgisini kullanır 3D yüzeye dik Sanal nesneyi rastgele bir yüzeye (yalnızca zeminlere ve duvarlara değil) yerleştirin Bu özelliğin ç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 vurur 3D yüzeye dik Bir nesneyi düzlemin (zemin veya duvar) üzerine, uçağın tam geometrisini kullanarak yerleştirin. Hemen doğru ölçeğe ihtiyacınız var. Derinlik isabet testi için yedek ArFrame_hitTest, iade listesinde 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ı dokunduğu nokta etrafındaki görsel özelliklerden yararlanır 3D yüzeye dik Bir nesneyi rastgele bir yüzeye yerleştirin (yalnızca zeminlere ve duvarlara değil) ArFrame_hitTest, iade listesinde 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, uygulamanın sağladığı 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 çekimine karşı yukarıyı gösteriyor Hızlı yerleştirmenin kritik öneme sahip olduğu ve uçağın tam geometrisini kullanarak bir nesneyi düzleme (zemin veya duvar) üzerine yerleştirin. Deneyim, bilinmeyen başlangıç derinliğini ve ölçeğine tolere edilebilir. ArFrame_hitTestInstantPlacement

Standart bir isabet testi gerçekleştirme

İsabet testi gerçekleştirmek için ArFrame_hitTest numaralı telefonu çağırı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 özelliklerine 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ştirin

İsabet testleri genellikle cihazdan veya cihaz kamerasından gelen ışınlar olarak kabul edilir. Ancak, dünya uzayı koordinatlarında ekran alanı yerine rastgele bir ışın kullanarak isabet testi yapmak için ArFrame_hitTestRay aracını kullanabilirsiniz.

Bir HitResult'a Anchor ekleme

İsabet sonucu elde ettiğinizde, sahnenize AR içeriğini yerleştirmek için bu duruşu giriş olarak kullanabilirsiniz. İsabet konumunda yeni bir Sabit oluşturmak için ArHitResult_acquireNewAnchor öğesini kullanın.

Sırada ne var?

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