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 versiones posteriores (se requiere un objetivo de implementación de iOS 12.0 o versiones posteriores)

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 ejemplo de la app.
  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 Rostros aumentados.
  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 caras aumentadas 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 la 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 de rostro 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 de rostro 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 facial para iOS:

Aplica una textura 2D al rostro

La app de ejemplo proporciona una clase para convertir tu rostro aumentado en un objeto SCNGeometry. Puedes usar esta geometría para conectarte fácilmente a un nodo de SceneKit, que colocarás en la transformación central del rostro aumentado.

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 se adjunta a la geometría de la malla facial.

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

faceMesh?.firstMaterial = faceTextureMaterial

Cómo adjuntar objetos 3D al rostro

El GARAugmentedFace que se recibe de la devolución de llamada del delegado proporciona 3 regiones o transformaciones diferentes que puedes usar para adjuntar contenido a un rostro. Estas transformaciones te permiten obtener la nariz, la izquierda de la frente y la derecha de la frente en el espacio mundial. Aquí, se usa una transformación de nariz para unir 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 recursos 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 de Xcode.
  3. Para convertir el archivo en formato .scn en Xcode, ve a Editor > Convert to SceneKit scene file format (.scn).