Guía para desarrolladores de Rostros aumentados en iOS

Obtén información para 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 el 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 a fin de 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 con Xcode 10.3 o una versión posterior y conecta el dispositivo a tu máquina de desarrollo por 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, de inmediato, hacer un seguimiento de tu rostro en el feed de la cámara. El dispositivo debe colocar imágenes de orejas de zorro en ambos lados de la frente y una nariz de zorro sobre la propia 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 Augmented Faces

Para usar la API de Augmented Faces desde tu app, inicializa una sesión de Augmented Faces. Esta sesión se encarga de tomar imágenes de la cámara a 60 fps y mostrará las actualizaciones de rostros de forma asíncrona a un método delegado. Durante la inicialización, simplemente 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, la app de ejemplo crea un objeto AVCaptureSession con fotogramas de video de la cámara frontal.

En la siguiente muestra de código, se ve una implementación del método de delegado de salida de captura de AVFoundation, que pasa la imagen, una marca de tiempo y una rotación de reconocimiento a la sesión de tu 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 delegada que muestra un GARAugmentedFaceFrame. Contiene un objeto de rostro aumentado que te ayuda a aplicar efectos en el 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 proporciona una transformación de pantalla y una matriz de proyección para garantizar que puedas configurar el mundo en 3D y las vistas en 2D de una manera que facilite la renderización de los efectos de rostro que aparecen adjuntos al rostro detectado.

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

Orientación de la malla facial

Ten en cuenta la orientación de la malla facial en 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 adjuntar fácilmente a un nodo de SceneKit, que colocarás en la transformación Augmented Face’s Center.

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 UIImage y se establece en un material que se adhiere a la geometría de la malla facial.

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

faceMesh?.firstMaterial = faceTextureMaterial

Adjuntar objetos 3D a la cara

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