Android uygulamanızda isabet testleri yapın

Sahnenizdeki 3D nesnenin doğru yerleşimini belirlemek için hit-test 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 (DepthPoint) Bir noktanın doğru derinliğini ve yönünü belirlemek için sahnenin tamamından derinlik bilgilerini 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.

Frame.hitTest(…), iade listesinde DepthPoint olup olmadığını kontrol edin
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ımız var. Derinlik isabet testi için yedek Frame.hitTest(…), iade listesinde Plane olup olmadığını kontrol edin
Önemli nokta (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) Frame.hitTest(…), iade listesinde Point olup olmadığını kontrol edin
Anında Yerleşim (InstantPlacementPoint) İç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. Frame.hitTestInstantPlacement(float, float, float)

Standart bir isabet testi gerçekleştirme

AR görünümünden MotionEvent elde etmek için TapHelper yardımcı programını kullanarak isabet testi yapmak üzere Frame.hitTest() komutunu çağırın.

Java

MotionEvent tap = tapHelper.poll();
if (tap == null) {
  return;
}

if (usingInstantPlacement) {
  // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
  // how far away the anchor will be placed, relative to the camera's view.
  List<HitResult> hitResultList =
      frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
  // Hit-test results using Instant Placement will only have one result of type
  // InstantPlacementResult.
} else {
  List<HitResult> hitResultList = frame.hitTest(tap);
  // TODO: Filter hitResultList to find a hit result of interest.
}

Kotlin

val tap = tapHelper.poll() ?: return
val hitResultList =
  if (usingInstantPlacement) {
    // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
    // how far away the anchor will be placed, relative to the camera's view.
    frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
    // Hit-test results using Instant Placement will only have one result of type
    // InstantPlacementResult.
  } else {
    frame.hitTest(tap)
  }

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

Java

// 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.
for (HitResult hit : hitResultList) {
  Trackable trackable = hit.getTrackable();
  if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
    // Do something with this hit result. For example, create an anchor at this point of
    // interest.
    Anchor anchor = hit.createAnchor();
    // TODO: Use this anchor in your AR experience.
    break;
  }
}

Kotlin

// 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.
val firstHitResult =
  hitResultList.firstOrNull { hit ->
    when (val trackable = hit.trackable!!) {
      is DepthPoint -> true // Replace with any type of trackable type
      else -> false
    }
  }
if (firstHitResult != null) {
  // Do something with this hit result. For example, create an anchor at this point of interest.
  val anchor = firstHitResult.createAnchor()
  // TODO: Use this anchor in your AR experience.
}

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

İsabet testleri genellikle cihazdan veya cihaz kamerasından gelen ışınlar olarak değerlendirilir. Ancak ekran alanındaki bir nokta yerine dünya alanındaki rastgele bir ışın kullanarak isabet testi yapmak için Frame.hitTest(float[], int, float[], int) işlevini kullanabilirsiniz.

İsabet sonucunu kullanarak bir ana başlık oluşturma

İsabet sonucu elde ettiğinizde, sahnenize AR içeriğini yerleştirmek için bu duruşu giriş olarak kullanabilirsiniz. Yeni bir Anchor oluşturmak için HitResult.createAnchor()'u kullanın. Böylece, içeriğin isabet sonucunun temel Trackable'ına eklenmesini sağlayabilirsiniz. Örneğin, çapa bir Uçak isabeti sonucu için algılanan düzleme bağlı kalmaya devam eder, böylece gerçek dünyanın bir parçası gibi görünür.

Sırada ne var?