Dowiedz się, jak używać rozszerzonej twarzy we własnych 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 systemem iOS 12.0 lub nowszym zgodne z ARKit, (wymagane jest miejsce docelowe wdrożenia na iOS w wersji 12.0 lub nowszej)
Tworzenie i uruchamianie przykładowej aplikacji
Szczegółowe instrukcje znajdziesz w krótkim wprowadzeniu.
- Skopiuj lub pobierz ARCore SDK na iOS z GitHuba, aby uzyskać przykładowy kod aplikacji.
- Otwórz okno terminala i uruchom
pod install
z folderu, w którym znajduje się projekt Xcode. - Otwórz przykładową aplikację w Xcode w wersji 10.3 lub nowszej i podłącz urządzenie do komputera przez 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 umożliwić aplikacji przykładowej dostęp do aparatu. Aplikacja powinna otworzyć przedni aparat i natychmiast śledzić Twoją twarz na podglądzie aparatu. Powinien umieścić zdjęcia uszu lisa po obu stronach czoła i umieścić lisa na nosie.
Omówienie implementacji rozszerzonych twarzy w aplikacji
Importuj *.scn
pliki 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.
Zainicjuj sesję rozszerzonej twarzy
Aby używać interfejsu Augmented Faces API w aplikacji, zainicjuj sesję Augmented Faces. Ta sesja odpowiada za robienie zdjęć aparatem z szybkością 60 kl./s, a synchronicznie zwraca aktualizacje twarzy do metody delegacji. 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 zdjęcia z aparatu. Przykładowa aplikacja uzyskuje obrazy z kamery, tworząc AVCaptureSession
z ramek wideo z przedniej kamery.
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 na urządzeniach z 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 centrum transformacji 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 płaszczyzny 2D jest ładowana jako UIImage
i ustawiona na materiał dołączony do geometrii siatki płaszczyzny.
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. Tutaj wykorzystuje się przekształcenie nosa, które pozwala dołączyć kulę do 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)
Importuj własne zasoby 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).