Przewodnik dla programistów dotyczący aplikacji Augmented Faces na iOS

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.

  1. Aby uzyskać przykładowy kod aplikacji, sklonuj lub pobierz pakiet ARCore SDK na iOS z GitHuba.
  2. Otwórz okno terminala i w folderze, w którym znajduje się projekt Xcode, uruchom polecenie pod install.
  3. 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.
  4. Naciśnij Cmd+R lub kliknij Run. Do pracy z rozszerzonymi twarzami używaj fizycznego urządzenia, a nie symulatora.
  5. 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.

  1. Wyeksportuj plik *.dae (model 3D).
  2. Przeciągnij plik *.dae do projektu Xcode.
  3. Przekonwertuj plik na format .scn w Xcode, klikając Editor > Convert to SceneKit scene file format (.scn).