Scopri come usare i volti aumentati nelle tue app.
Prerequisiti
- Xcode 13.0 o versioni successive
- CocoaPods 1.4.0 o versioni successive se utilizzi CocoaPods
- Un dispositivo Apple compatibile con ARKit con iOS 12.0 o versioni successive (è necessario un target di deployment di iOS 12.0 o versioni successive)
Crea ed esegui l'app di esempio
Per la procedura dettagliata, consulta la guida rapida.
- Clona o scarica l'SDK ARCore per iOS da GitHub per ottenere il codice dell'app di esempio.
- Apri una finestra Terminale ed esegui
pod install
dalla cartella in cui si trova il progetto Xcode. - Apri l'app di esempio in Xcode versione 10.3 o successiva e collega il dispositivo al computer di sviluppo tramite USB. Per evitare errori di compilazione, assicurati di eseguire la compilazione dal file
.xcworkspace
e non dal file.xcodeproj
. - Premi Cmd+R o fai clic su Run. Per lavorare con i volti aumentati, usa un dispositivo fisico, non il simulatore.
- Tocca "Ok" per consentire alla fotocamera di accedere all'app di esempio. L'app dovrebbe aprire la fotocamera anteriore e rilevare immediatamente il tuo volto nel feed della fotocamera. Dovresti posizionare immagini di orecchie di volpe su entrambi i lati della fronte e posizionare un naso di volpe sopra il tuo.
Panoramica dell'implementazione dei volti aumentati nell'app
Importa *.scn
file in Xcode
Per aggiungere asset personalizzati, come texture e modelli 3D, a un volto rilevato nella tua app, trascina l'asset *.scn
in Xcode.
Inizializzare una sessione di volti aumentati
Per utilizzare l'API Augmented Faces dalla tua app, inizializza una sessione Augmented Faces. Questa sessione è responsabile dell'acquisizione delle immagini della fotocamera a 60 fps e restituisce in modo asincrono gli aggiornamenti del volto a un metodo delegato. Durante l'inizializzazione, passa semplicemente il campo visivo del dispositivo di acquisizione e assicurati di impostare il delegato.
// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self
Trasmettere le immagini della fotocamera alla sessione
Ora che la sessione è stata inizializzata e configurata correttamente, l'app può iniziare a inviare immagini della videocamera alla sessione. L'app di esempio recupera le immagini della fotocamera creando un AVCaptureSession
con i fotogrammi del video della fotocamera anteriore.
Il seguente esempio di codice mostra un'implementazione del metodo delegato dell'output di acquisizione di AVFoundation
, che trasmette l'immagine, un timestamp e una rotazione del riconoscimento alla sessione del volto.
func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
faceSession.update(with: imageBuffer,
timestamp: frameTime,
recognitionRotation: rotationDegrees)
}
Una volta elaborata l'immagine, l'API Augmented Faces invia un callback del delegato che restituisce un GARAugmentedFaceFrame
. Contiene un oggetto Volto aumentato che ti aiuta ad applicare effetti al viso. Contiene anche il buffer di immagine e il timestamp che hai passato nel metodo di aggiornamento. Questa opzione è utile per sincronizzare gli effetti sul viso con le immagini. Questo oggetto fornisce anche una trasformazione del display e una matrice di proiezione per assicurarti di poter configurare il mondo 3D e le visualizzazioni 2D in modo da facilitare il rendering degli effetti sul volto che vengono visualizzati attaccati al volto rilevato.
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
Orientamento della maglia del viso
Osserva l'orientamento del mesh del volto per iOS:
Applica una texture 2D al viso
L'app di esempio fornisce una classe per convertire il tuo volto aumentato in un oggetto SCNGeometry
. Puoi utilizzare questa geometria per collegarlo facilmente a un nodo SceneKit, che posizionerai nella trasformazione Centro della faccia aumentata.
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 texture del viso 2D viene caricata come UIImage
e impostata su un materiale collegato alla geometria della mesh del viso.
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
Attaccare oggetti 3D al viso
Il GARAugmentedFace
ricevuto dal callback del delegato, fornisce 3 diverse regioni, o trasformazioni, che puoi utilizzare per collegare contenuti a un volto. Queste trasformazioni ti consentono di ottenere il naso, la parte sinistra e la parte destra della fronte nello spazio mondiale. Qui viene utilizzata una trasformazione del naso per attaccare una sfera al naso.
// 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)
Importare i tuoi asset in Xcode
Per aggiungere asset, come texture e modelli 3D a un volto rilevato nella tua app, devi prima importarli in Xcode.
- Esporta un file
*.dae
(modello 3D). - Trascina il file
*.dae
nel progetto Xcode. - Converti il file nel formato
.scn
in Xcode andando su Editor > Convert to SceneKit scene file format (.scn).