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 (DepthPoint ) |
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.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 ç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 |
Frame.hitTest(…) , iade listesindeki Plane olup olmadığını kontrol edin
|
Özellik noktası (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 |
Frame.hitTest(…) , iade listesindeki Point olup olmadığını kontrol edin
|
Anında Yerleşim (InstantPlacementPoint ) |
İç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 |
Frame.hitTestInstantPlacement(float, float, float)
|
Standart isabet testi uygulama
AR görünümünden MotionEvent
almak için TapHelper
yardımcı programını kullanarak isabet testi yapmak üzere Frame.hitTest()
numaralı telefonu ç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
reklamlara 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ş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 Frame.hitTest(float[], int, float[], int)
aracını kullanabilirsiniz.
İsabet sonucunu kullanarak bir Sabitleme oluşturun
Bir isabet sonucu elde ettiğinizde, sahnenize AR içeriği yerleştirmek için bu pozisyonu giriş olarak kullanabilirsiniz. İçeriğin, isabet sonucunun temel Trackable
öğesine eklendiğinden emin olarak yeni bir Anchor
oluşturmak için HitResult.createAnchor()
aracını kullanın. Örneğin, çapa, bir uçak çarpması sonucu tespit edilen düzlemde kalır ve böylece gerçek dünyanın bir parçası gibi görünür.
Sonraki adımlar
- GitHub'da
hello_ar_java
vehello_ar_kotlin
örnek uygulamalarına göz atın.