Faça um teste de hit para determinar o posicionamento correto de um objeto 3D na cena. O posicionamento correto garante que o conteúdo de RA seja renderizado no tamanho adequado (aparente).
Tipos de resultados de hits
Um teste de hit pode gerar quatro tipos diferentes de resultados de hit, conforme a tabela a seguir.
Tipo de resultado de hit | Descrição | Orientações | Caso de uso | Chamadas de método |
---|---|---|---|---|
Profundidade (DepthPoint ) |
Usa informações de profundidade de toda a cena para determinar a profundidade e a orientação corretas de um ponto | Perpendicular à superfície 3D | Colocar um objeto virtual em uma superfície arbitrária (não apenas em pisos e paredes) |
O ArDepthMode precisa estar ativado para que isso funcione.Frame.hitTest(…) , verifique se há DepthPoint s na lista de devolução.
|
Plane |
atinge superfícies horizontais e/ou verticais para determinar a profundidade e orientação corretas de um ponto. | Perpendicular à superfície 3D | Coloque um objeto em um plano (solo ou parede) usando a geometria completa do plano. Escala correta precisa imediatamente. Substituto do teste de hit de profundidade |
Frame.hitTest(…) , verifique se há Plane s na lista de devolução.
|
Ponto de recurso (Point ) |
Baseia-se em recursos visuais ao redor do ponto de toque do usuário para determinar a posição e a orientação corretas de um ponto. | Perpendicular à superfície 3D | Colocar um objeto em uma superfície arbitrária (não apenas em pisos e paredes) |
Frame.hitTest(…) , verifique se há Point s na lista de devolução.
|
Posicionamento instantâneo (InstantPlacementPoint ) |
Usa o espaço da tela para posicionar o conteúdo. Inicialmente usa a profundidade estimada fornecida pelo app. Funciona instantaneamente, mas a pose e a profundidade real mudam quando o ARCore consegue determinar a geometria real da cena. | +Y apontando para cima, oposto à gravidade | Colocar um objeto em um plano (solo ou parede) usando a geometria completa do avião, em que o posicionamento rápido é fundamental e a experiência pode tolerar profundidade e escala iniciais desconhecidas |
Frame.hitTestInstantPlacement(float, float, float)
|
Realizar um teste de hit padrão
Chame Frame.hitTest()
para realizar um teste de hit usando o utilitário TapHelper
para extrair MotionEvent
s da visualização em RA.
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) }
Filtre os resultados de hits com base no tipo em que você tem interesse. Por exemplo, se você quiser se concentrar em DepthPoint
s:
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. }
Realizar um teste de hit usando um raio e uma direção arbitrários
Eles normalmente são tratados como raios da câmera do dispositivo ou da câmera, mas é possível usar Frame.hitTest(float[], int, float[], int)
para realizar um teste de hit com um raio arbitrário nas coordenadas do espaço mundial, em vez de um ponto na tela.
Criar uma âncora usando o resultado do hit
Quando você receber um resultado de hit, use a pose dele como entrada para inserir conteúdo de RA na sua cena. Use HitResult.createAnchor()
para criar um novo Anchor
, garantindo que o conteúdo seja anexado ao Trackable
subjacente do resultado do hit. Por exemplo, para o resultado de um acidente de avião, a âncora permanece presa ao plano detectado, parecendo fazer parte do mundo real.
O que vem em seguida?
- Confira os apps de exemplo
hello_ar_java
ehello_ar_kotlin
(links em inglês) no GitHub.