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 usas 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 se encuentra el proyecto de Xcode.
  3. Abre la app de ejemplo en Xcode versión 10.3 o posterior y conecta el dispositivo a tu máquina de desarrollo a través de 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 "Aceptar" 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. Debería colocar imágenes de orejas de zorro sobre ambos lados de la frente y una nariz de zorro sobre tu 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.

Cómo inicializar una sesión de rostros aumentados

Para usar la API de Augmented Faces desde tu app, inicializa una sesión de Augmented Faces. Esta sesión es responsable de capturar imágenes de la cámara a 60 fps y devolverá actualizaciones de rostros de forma asíncrona a un método delegado. Cuando realices la inicialización, simplemente pasa el campo de visión 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. La app de ejemplo obtiene imágenes de la cámara creando un AVCaptureSession con fotogramas de video de la cámara frontal.

En la siguiente muestra de código, se muestra una implementación del método del 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 de rostro.

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 al rostro. 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 brinda una transformación de visualización y una matriz de proyección para asegurarte de poder configurar el mundo 3D y las vistas 2D de una manera que facilite la renderización de los efectos faciales que aparecen unidos 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:

Aplica una textura 2D al rostro

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 2D se carga como un UIImage y se establece en un material que está unido 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 importa los recursos a Xcode.

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