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.
- Clona o descarga el SDK de ARCore para iOS desde GitHub para obtener el código de ejemplo de la app.
- Abre una ventana de Terminal y ejecuta
pod install
desde la carpeta en la que se encuentra el proyecto de Xcode. - 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
. - Presiona Cmd + R o haz clic en Run. Usa un dispositivo físico, no el simulador, para trabajar con Rostros aumentados.
- 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.
- Exporta un archivo
*.dae
(modelo 3D). - Arrastra el archivo
*.dae
al proyecto de Xcode. - Para convertir el archivo en formato
.scn
en Xcode, ve a Editor > Convert to SceneKit scene file format (.scn).