Demostración de ARKit: creación de películas de realidad aumentada
Publicado: 2022-03-11AR y VR se están convirtiendo en la corriente principal, y todas las principales empresas de alta tecnología las están persiguiendo: Apple tiene ARKit, Google tiene ARCore y Microsoft tiene su propio HoloLens (y luego, por supuesto, está Unity). Y con algunas aplicaciones que reciben mucha atención pública, el desarrollo de aplicaciones de realidad aumentada se está convirtiendo en una habilidad muy deseable para los desarrolladores móviles.
En este artículo, me gustaría demostrar una pequeña aplicación simple pero significativa que hará más que simplemente tener un cubo giratorio. ¿Quién necesita cubos giratorios de todos modos? Hagamos Matrix.
Introducción a ARKit
ARKit es un marco de Apple para crear aplicaciones AR para dispositivos iOS. Se pueden usar varios renderizadores con él: SpriteKit para objetos 2D, SceneKit para 3D y Metal si queremos implementar un renderizador personalizado.
Para esta demostración, usaremos SceneKit para renderizar y colocar objetos 3D completamente renderizados (cuchillos).
A partir de ARKit v2, se admiten cinco tipos de configuración en ARKit:
AROrientationTrackingConfiguration : cuando desea rastrear solo la orientación del dispositivo (por ejemplo, para una aplicación de constelación de estrellas). Con esta configuración, los movimientos físicos como dar un paso al costado no se rastrean y no afectarán la posición o la dirección de los objetos en la escena.
ARWorldTrackingConfiguration : esta es probablemente la configuración más utilizada para AR, ya que admite lo que la mayoría de la gente consideraría realidad aumentada. Los ejemplos incluyen aplicaciones de caza de mascotas virtuales o Pokémon.
ARFaceTrackingConfiguration : esta configuración actualmente solo es compatible con el iPhone X porque requiere una cámara TrueDepth (como Face ID). Esta configuración realiza un seguimiento de las características de la cara y su compensación relativa de la expresión facial neutra (por ejemplo, una aplicación donde los usuarios pueden probarse gafas de sol de moda antes de pedirlas).
ARImageTrackingConfiguration : si tiene un conjunto de marcadores y desea mostrar animales saltando fuera del marcador, entonces esta configuración es adecuada para usted. Estos no tienen que ser marcadores tipo tarjeta, sino cualquier imagen 2D. Podrías apuntar tu cámara a la Mona Lisa, y ella giraría la cabeza y te diría algo. Una desventaja es que hay que decir de antemano cuál es el tamaño físico del marcador de imagen.
ARObjectScanningConfiguration : esta configuración es la versión 3D de ARImageTrackingConfiguration.
En esta demostración, agregaremos cuchillos y balas a la escena y nos gustaría tener seis grados de libertad, por lo que la herramienta adecuada es ARWorldTrackingConfiguration.
El concepto de aplicación
Todos los que han visto The Matrix pueden recordar a Neo (Keanu Reeves) esquivando balas y deteniéndolas en el aire. Nuestra aplicación nos ayudará a recrear esta escena a partir de una transmisión de cámara en vivo. Por lo tanto, podemos crear videos personalizados que demuestren los poderes de Neo.
Nuestra aplicación tendrá modelos 3D de balas y cuchillos. Depende del usuario cuántas balas o cuchillos quiere en su película. Si desea pasar un tiempo y agregar otros modelos, el código de la aplicación es de código abierto y está disponible en GitHub (https://github.com/altaibayar/toptal_ar_video_maker). Si bien este no es un tutorial completo de AR, la demostración y la fuente deberían ser un recurso valioso si está tratando de ingresar al desarrollo de aplicaciones AR en iOS.
El escenario de caso de uso previsto es el siguiente:
- haz que un amigo se disfrace de Neo (no es estrictamente necesario para el funcionamiento de la aplicación, pero también podría verse bien mientras hacemos esto).
- Pídele a “Neo” que se pare a unos 10 metros (30 pies) de ti.
- Inicie la aplicación y escanee el plano de tierra.
- Agregue balas y cuchillos volando en "Neo".
- Mantenga presionado el botón de grabación para grabar el video mientras "Neo" realiza algunos movimientos geniales esquivando o deteniendo las balas.
- suelte el botón de grabación y guarde el video en su biblioteca.
Construyendo la aplicación
Como se mencionó anteriormente, queremos poder movernos libremente mientras grabamos los 360 grados de la escena y que las balas y los cuchillos sigan el movimiento de la cámara de manera adecuada.

Para fines de demostración, tendremos solo dos tipos de objetos virtuales: cuchillos y balas de escopeta.
Los cuchillos son objetos detallados y usaré el modelo gratuito de https://poly.google.com/view/3TnnfzKfHrq (Gracias, Andrew).
Las balas de escopeta, sin embargo, son objetos esféricos simples y simplemente podemos codificarlos. Los haremos metálicos y al rojo vivo para variar. Dado que estamos emulando una escopeta, también los generaremos como grupos agrupados. Para que la agrupación tenga sentido sin demasiados problemas, podemos usar el generador de números aleatorios gaussianos de GamplayKit.
GameplayKit es una herramienta útil que resulta útil siempre que necesite generación de ruido aleatorio, máquina de estado, IA o toma de decisiones basada en probabilidades.
override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }
Se puede usar una lógica de compensación aleatoria similar para los cuchillos, pero dado que no se comportan como grupos, se puede usar una distribución aleatoria simple.
Arquitectura de la aplicación
Está más allá del alcance de esta demostración profundizar en las discusiones sobre qué paradigma de arquitectura es el mejor. Hay muchos artículos por ahí que profundizan en ese tema.
En su lugar, solo presentaré la estructura del proyecto como una guía para orientarse en el proyecto de GitHub vinculado: cuáles son los componentes principales, cómo están conectados y por qué se eligieron.
La aplicación tiene solo tres pantallas:
PermissionViewController : la pantalla en la que le pedimos al usuario que otorgue acceso a la aplicación a las funciones móviles requeridas.
- Cámara – Obviamente
- Galería : para guardar el video grabado y la entrada del micrófono
- Micrófono : se requiere permiso de una biblioteca que estoy usando para crear el video (de forma predeterminada, el sonido del micrófono se usaría como fuente de una pista de audio).
ExportViewController : esta pantalla muestra un video grabado y ofrece las opciones para compartir o guardar el video.
MainViewController : toda la magia sucede aquí.
Según mi experiencia, lo mejor es envolver todas las clases ARKit necesarias como ARSession, ARConfiguration y todos los tipos únicos de SCNNode. De esa manera, el código se explica por sí mismo.
ARSession se hereda en ToptalARSession, y la nueva clase de sesión solo tiene tres métodos: el constructor de clase donde configuramos todo lo que se requiere y los métodos resetTracking y pauseTracking.
La aplicación reconoce cuatro tipos únicos de SCNNodes:
- KnifeNode : representa un objeto 3D de cuchillo y carga automáticamente un cuchillo 3D como su geometría.
BulletsNode : este nodo representa un conjunto de cartuchos de escopeta. El ruido gaussiano aleatorio, los colores y el modo de iluminación física se configuran automáticamente.
No se requiere trabajo especial o adicional en las clases que usan KnifeNode o BulletsNode, y se pueden usar como plantillas para personalizar la aplicación para agregar más tipos de objetos 3D.
- ReticleNode : envuelve un modelo 3D que aparece en la escena sobre el piso para mostrar dónde se agregarán cuchillos o balas.
- Nodo de luz direccional : este es un nodo que representa una luz vertical que apunta hacia abajo.
Referencias y Créditos
Modelo de cuchillo: https://poly.google.com/view/3TnnfzKfHrq
Grabación desde SCNScene: https://github.com/svtek/SceneKitVideoRecorder
Iconos de botones, aplicación de demostración ARKit: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality