Reconocimiento de objetos con ARKit 2.0

Alfonso Miranda Castro
Build and run
Published in
2 min readAug 24, 2018

Al igual que cuando hablamos del reconocimiento de imágenes, a partir de la versión 2.0 también se añadió la funcionalidad de reconocer objetos, lo cual es un avance muy grande.

La forma es muy similar, casi idéntica, que el reconocimiento de imágenes. La mayor diferencia es que primero tenemos que generar un archivo arobject. Este archivo se genera con una aplicación que nos proporciona Apple, ARKit Scanner, y la forma es muy sencilla, y es más fácil verlo que explicarlo. Lo podéis ver en el siguiente video.

Una vez escaneado nuestro objeto, exportamos el archivo y lo añadimos en nuestro proyecto. ¿Y donde hay que añadirlo? Pues al igual que con las imágenes, creamos un AR Resource Group y lo añadimos ahí.

Ahora nos vamos al código y como ya hemos comentado todo es muy similar a lo que hicimos con las imágenes. Tenemos que añadir lo siguiente a la configuración.

configuration.detectionObjects = ARReferenceObject.referenceObjects(inGroupNamed: “AR Resources”, bundle: nil)!

Y ya solo nos quedaría implementar el delegado necesario para reconocer el objeto cuando pase por nuestra cámara. Y, sin sorpresa para nadie, se implementa del mismo que para las imágenes, pero en este caso comprobando si hemos detectado un anchor del tipo ARObjectAnchor.

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {if let objectAnchor = anchor as? ARObjectAnchor {debugPrint("DETECTADO --> \(objectAnchor.name ?? "")")}}

Y listo, una vez detectado ya podemos añadir en el node lo que queramos y necesitemos. Tenemos todos los datos de ese objeto, desde su punto central, sus medidas e incluso los “feature points” que se ha detectado y guardado durante el escaneado. De esta forma podemos poner información virtual en los puntos que queramos de ese objeto para crear efectos interesante o ampliar la información del mismo.

Nosotros vamos a hacer algo mucho más simple, tan solo añadimos un cubo en la posición central donde detectamos el objeto. Sería tan fácil como esto.

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {if let objectAnchor = anchor as? ARObjectAnchor {let cube = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)cube.firstMaterial?.diffuse.contents = UIColor.redlet cubeNode = SCNNode(geometry: cube)cubeNode.opacity = 0.5node.addChildNode(cubeNode)}}

Y funcionaría así.

Aquí tenéis el código para que comparéis con el vuestro: https://github.com/alfonsomiranda/ARKitTutorial/tree/master/ARKitObjectTutorial

El funcionamiento aún no es perfecto (en el momento de escribir este artículo aún está en beta) pero tiene muchas posibilidades de mejoras y de ser una funcionalidad indispensable.

--

--