Guía para desarrolladores de Rostros aumentados en iOS

Aprende a usar rostros aumentados en tus propias apps.

Requisitos previos

  • Xcode versión 13.0 o posterior
  • CocoaPods 1.4.0 o una versión posterior si se usa CocoaPods
  • Un dispositivo Apple compatible con ARKit que ejecute iOS 12.0 o una versión posterior (se requiere un destino de implementación de iOS 12.0 o una versión posterior)

Cómo compilar y ejecutar la app de muestra

Consulta la Guía de inicio rápido para obtener pasos detallados.

  1. Clona o descarga el SDK de ARCore para iOS desde GitHub para obtener el código de la app de ejemplo.
  2. Abre una ventana de terminal y ejecuta pod install desde la carpeta en la que existe el proyecto de Xcode.
  3. Abre la app de ejemplo en Xcode 10.3 o una versión posterior y conecta el dispositivo a tu máquina de desarrollo mediante USB. Para evitar errores de compilación, asegúrate de compilar desde el archivo .xcworkspace y no desde el archivo .xcodeproj.
  4. Presiona Cmd + R o haz clic en Run. Usa un dispositivo físico, no el simulador, para trabajar con caras aumentadas.
  5. Presiona "OK" para permitir que la cámara acceda a la app de ejemplo. La app debería abrir la cámara frontal y hacer un seguimiento de tu rostro de inmediato en el feed de la cámara. Debes colocar imágenes de orejas de zorro en ambos lados de la frente y una nariz de zorro sobre tu propia nariz.

Descripción general de la implementación de rostros aumentados en tu app

Importa archivos *.scn a Xcode

Para agregar tus propios recursos, como texturas y modelos 3D, a un rostro detectado en tu app, arrastra el recurso *.scn a Xcode.

Inicializa una sesión de Augmented Faces

Para usar la API de Augmented Faces desde tu app, inicializa una sesión de Augmented Faces. Esta sesión es responsable de tomar imágenes de la cámara a 60 FPS y devolverá actualizaciones de rostros de manera asíncrona a un método de delegado. Durante la inicialización, pasa el campo visual del dispositivo de captura y asegúrate de configurar el delegado.

// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self

Pasa imágenes de la cámara a la sesión

Ahora que tu sesión se inicializó y configuró correctamente, tu app puede comenzar a enviar imágenes de la cámara a la sesión. Para obtener imágenes de la cámara de ejemplo, la app crea un elemento AVCaptureSession con fotogramas de video de la cámara frontal.

En la siguiente muestra de código, se presenta una implementación del método delegado de salida de captura de AVFoundation, que pasa la imagen, una marca de tiempo y una rotación de reconocimiento a tu sesión facial.

func captureOutput(_ output: AVCaptureOutput,
                     didOutput sampleBuffer: CMSampleBuffer,
                     from connection: AVCaptureConnection) {

     faceSession.update(with: imageBuffer,
                        timestamp: frameTime,
                        recognitionRotation: rotationDegrees)
}

Después de que se procesa la imagen, la API de Augmented Faces envía una devolución de llamada de delegado que muestra un GARAugmentedFaceFrame. Contiene un objeto de rostro aumentado que te ayuda a adjuntar efectos a los rostros. También contiene el búfer de imagen y la marca de tiempo que pasaste al método de actualización. Esto es útil para sincronizar los efectos faciales con las imágenes. Este objeto también te proporciona una transformación de pantalla y una matriz de proyección para asegurarte de que puedas configurar las vistas del mundo en 3D y en 2D de una manera que facilite la renderización de los efectos faciales que aparecen adjuntos al rostro detectado.

var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }

Orientación de la malla facial

Observa la orientación de la malla de rostros para iOS:

Aplicar una textura 2D a la cara

La app de ejemplo proporciona una clase para convertir tu cara aumentada en un objeto SCNGeometry. Puedes usar esta geometría para adjuntarla con facilidad a un nodo de SceneKit, que colocarás en la transformación Center de Augmented Face.

let faceNode = SCNNode()

// Gets the most recent frame's face
let face = faceSession.currentFrame?.face

// This is instantiated once, not with every frame
let faceGeometryConverter = FaceMeshGeometryConverter()

// Converts Augmented Face to SCNGeometry object
let faceMesh = faceGeometryConverter.geometryFromFace(face)

// Assigns geometry to node and sets the pose
faceNode.geometry = faceMesh
faceNode.simdTransform = face.centerTransform

La textura facial en 2D se carga como un objeto UIImage y se establece en un material que se une a la geometría de la malla facial.

faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")

faceMesh?.firstMaterial = faceTextureMaterial

Fija objetos 3D en el rostro

El GARAugmentedFace recibido de la devolución de llamada del delegado proporciona 3 regiones diferentes, o transformaciones, que puedes usar para adjuntar contenido a un rostro. Estas transformaciones te permiten mover la nariz, la izquierda de la frente y la derecha de la frente en el espacio del mundo. Aquí, se usa una transformación de nariz para adjuntar una esfera a la nariz.

// Create node and add to scene
let node = SCNNode(geometry: SCNSphere(radius: .02))
sceneView.rootNode.addChild(node)

// Every frame updates the node's position
node.simdWorldTransform = session.currentFrame.face.transform(for: .nose)

Importa tus propios elementos a Xcode

Para agregar recursos, como texturas y modelos 3D, a un rostro detectado en tu app, primero debes importarlos a Xcode.

  1. Exporta un archivo *.dae (modelo 3D).
  2. Arrastra el archivo *.dae al proyecto Xcode.
  3. Para convertir el archivo al formato .scn en Xcode, dirígete a Editor > Convert to SceneKit scene file format (.scn).