apps ios swift ios11 arkit ios12

ios - apps - arkit android



¿Cómo detectar planos verticales en ARKit? (7)

Apple ha lanzado la versión iOS 11.3 que contará con varias actualizaciones para AR, incluyendo ARKit 1.5. En esta actualización, ARKit incluye la capacidad para que ARKit reconozca y coloque objetos virtuales en superficies verticales como paredes y puertas.

El soporte para vertical ahora es compatible con ARWorldTrackingConfiguration

let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.horizontal, .vertical] sceneView.session.run(configuration)

¿Cómo es posible implementar una detección de plano vertical (es decir, para paredes)?

let configuration = ARWorldTrackingSessionConfiguration() configuration.planeDetection = .horizontal //TODO


Como el iPhone X presenta una cámara de profundidad frontal, mi sospecha es que la trasera estará en la próxima versión y tal vez la capacidad .vertical se delegue hasta ese momento.



Lo hice con Unity, pero necesito hacer mis cálculos.

Utilizo el Random Sample Consensus para detectar el plano vertical de la nube de puntos devuelta por ARkit. Es como tener un bucle que escoge al azar 3 puntos para crear un plano y cuenta los puntos que coinciden, y ver cuál es el mejor intento.

Esta funcionando. Pero porque ARkit no puede devolver muchos puntos cuando la pared es de color liso. Así que no funciona en muchas situaciones.


Para implementar una detección de plano vertical en ARKit 2.0 use el siguiente código:

configuration.planeDetection = .vertical

O puedes usar la detección para ambos tipos de planos:

private func configureSceneView(_ sceneView: ARSCNView) { let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.horizontal, .vertical] //BOTH TYPES configuration.isLightEstimationEnabled = true sceneView.session.run(configuration) }

También puede agregar una extensión a ARSceneManager para manejar las llamadas delegadas:

extension ARSceneManager: ARSCNViewDelegate { func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { guard let planeAnchor = anchor as? ARPlaneAnchor else { return } print("Found plane: /(planeAnchor)") } }



Editar: Esto ahora es compatible con ARKit 1.5 (iOS 11.3). Simplemente use .vertical . He mantenido el post anterior a continuación para fines históricos.

TL; DR

La detección de planos verticales no es (todavía) una característica que existe en ARKit. El .horizontal sugiere que esta característica podría ser trabajada y agregada en el futuro. Si solo fuera un valor booleano, esto sugeriría que es definitivo.

Confirmación

Esta sospecha fue confirmada por una conversación que tuve con un ingeniero de Apple en WWDC17.

Explicación

Podría argumentar que crear una implementación para esto sería difícil ya que hay infinitas orientaciones más para un plano vertical en lugar de uno horizontal, pero como dice Rodamn , probablemente este no sea el caso.

Del comentario de Rodamn : En su forma más simple, un plano se define como tres puntos coplanares. Tiene un candidato de superficie una vez que se detectan suficientes características coplanares detectadas a lo largo de una superficie (vertical, horizontal o en cualquier ángulo arbitrario). Es solo que lo normal para las horizontales será a lo largo del eje arriba / abajo, mientras que las normales de la vertical serán paralelas al plano de tierra. El desafío es que los paneles de yeso sin adornos tienden a generar pocas características visuales, y las paredes lisas a menudo pueden pasar desapercibidas. Sospecho fuertemente que esta es la razón por la cual la característica .vertical aún no se ha lanzado.

Sin embargo, hay un argumento contrario a esto . Vea los comentarios de rickster para más información.