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.
El soporte para esto viene con iOS 11.3:
static var vertical: ARWorldTrackingConfiguration.PlaneDetection
La sesión detecta superficies que son paralelas a la gravedad (independientemente de la otra orientación).
https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection/2867271-vertical
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)")
}
}
Se dice que Apple está trabajando en capacidades de AR adicionales para el nuevo iPhone, es decir, sensores adicionales para la cámara. Tal vez esta sea una característica cuando se conozcan las capacidades del dispositivo. Algunas especulaciones aquí. http://uk.businessinsider.com/apple-iphone-8-rumors-3d-laser-camera-augmented-reality-2017-7 y otra fuente https://www.fastcompany.com/40440342/apple-is-working-hard-on-an-iphone-8-rear-facing-3d-laser-for-ar-and-autofocus-source
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.