Dowiedz się, jak używać funkcji Augmented Faces w swoich aplikacjach.
Wymagania wstępne
- Xcode w wersji 13.0 lub nowszej
- Cocoapods w wersji 1.4.0 lub nowszej (jeśli używasz Cocoapods).
- Urządzenie Apple z ARKit w wersji 12.0 lub nowszej (wymagany jest cel wdrożenia w wersji iOS 12.0 lub nowszej)
Tworzenie i uruchamianie przykładowej aplikacji
Szczegółowe instrukcje znajdziesz w krótkim wprowadzeniu.
- Aby uzyskać przykładowy kod aplikacji, sklonuj lub pobierz pakiet ARCore SDK na iOS z GitHuba.
- Otwórz okno terminala i w folderze, w którym znajduje się projekt Xcode, uruchom polecenie
pod install
. - Otwórz przykładową aplikację w Xcode w wersji 10.3 lub nowszej i podłącz urządzenie do komputera programistycznego za pomocą kabla USB. Aby uniknąć błędów kompilacji, upewnij się, że kompilujesz na podstawie pliku
.xcworkspace
, a nie.xcodeproj
. - Naciśnij Cmd+R lub kliknij Run. Do pracy z rozszerzonymi twarzami używaj fizycznego urządzenia, a nie symulatora.
- Kliknij „OK”, aby przyznać przykładowej aplikacji dostęp do aparatu. Aplikacja powinna otworzyć przedni aparat i natychmiast śledzić Twoją twarz na podglądzie aparatu. Powinien on umieścić obrazy uszu lisa po obu stronach czoła oraz nosa lisa nad Twoim nosem.
Omówienie implementacji funkcji Augmented Faces w aplikacji
Importowanie plików *.scn
do Xcode
Aby dodać do wykrytej twarzy w aplikacji własne zasoby, takie jak tekstury i modele 3D, przeciągnij zasób *.scn
do Xcode.
Inicjowanie sesji Augmented Faces
Aby używać interfejsu Augmented Faces API w aplikacji, zainicjuj sesję Augmented Faces. Ta sesja odpowiada za rejestrowanie obrazów z kamery z częstotliwością 60 FPS i asymetrycznie zwraca informacje o twarzy do metody delegowanej. Podczas inicjowania wystarczy przejść przez pole widzenia urządzenia do rejestrowania i ustawić delegowanie.
// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self
Przekazywanie obrazów z kamery do sesji
Po zainicjowaniu i prawidłowym skonfigurowaniu sesji aplikacja może zacząć wysyłać do niej obrazy z kamery. Przykładowa aplikacja uzyskuje obrazy z kamery, tworząc AVCaptureSession
z ramek wideo z przedniego aparatu.
Poniższy przykładowy kod pokazuje implementację metody AVFoundation
capture output delegate, która przekazuje obraz, sygnaturę czasową i rotację rozpoznawania do sesji rozpoznawania twarzy.
func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
faceSession.update(with: imageBuffer,
timestamp: frameTime,
recognitionRotation: rotationDegrees)
}
Po przetworzeniu obrazu interfejs Augmented Faces API wysyła wywołanie zwrotne delegowane, które zwraca GARAugmentedFaceFrame
. Zawiera on obiekt Augmented Face, który ułatwia dołączanie efektów do twarzy. Zawiera ona też bufor obrazu i sygnaturę czasową przekazane do metody update. Jest to przydatne do synchronizowania efektów twarzy z obrazami. Ten obiekt zawiera też transformację wyświetlania i macierz projekcji, dzięki którym możesz skonfigurować widoki świata 3D i 2D w sposób ułatwiający renderowanie efektów twarzy, które są widoczne w powiązaniu z wykrytą twarzą.
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
Orientacja siatki twarzy
Zwróć uwagę na orientację siatki twarzy w iOS:
Zastosuj teksturę 2D do twarzy
Przykładowa aplikacja zawiera klasę, która umożliwia przekształcenie rozszerzonego obrazu twarzy w obiekt SCNGeometry
. Za pomocą tej geometrii możesz łatwo dołączyć węzeł SceneKit, który umieścisz w transformacji centrum 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
Tekstura 2D twarzy jest wczytana jako UIImage
i ustawiona jako materiał dołączony do geometrii siatki twarzy.
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
Dołączanie obiektów 3D do twarzy
GARAugmentedFace
otrzymany z wywołania zwrotnego delegowanego zawiera 3 różne regiony lub przekształcenia, których możesz użyć do dołączania treści do twarzy. Te transformacje umożliwiają uzyskanie nosa, lewej i prawej części czoła w przestrzeni świata. W tym przypadku do przymocowania kuli do nosa użyto transformacji nosa.
// 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)
Importowanie własnych zasobów do Xcode
Aby dodać zasoby, takie jak tekstury i modele 3D, do wykrytej twarzy w aplikacji, najpierw zaimportuj te zasoby do Xcode.
- Wyeksportuj plik
*.dae
(model 3D). - Przeciągnij plik
*.dae
do projektu Xcode. - Przekonwertuj plik na format
.scn
w Xcode, klikając Editor > Convert to SceneKit scene file format (.scn).