Dowiedz się, jak używać funkcji rozszerzonych twarzy 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.
- zgodne z ARKit urządzenie Apple z systemem iOS 12.0 lub nowszym (wymagane jest wdrożenie w systemie iOS 12.0 lub nowszym).
Tworzenie i uruchamianie przykładowej aplikacji
Szczegółowe instrukcje znajdziesz w krótkim wprowadzeniu.
- Aby uzyskać przykładowy kod aplikacji, skopiuj lub pobierz pakiet SDK ARCore SDK na iOS z GitHuba.
- Otwórz okno terminala i uruchom
pod install
z folderu, w którym istnieje projekt Xcode. - Otwórz przykładową aplikację w Xcode w wersji 10.3 lub nowszej i podłącz urządzenie do komputera programisty przez USB. Aby uniknąć błędów kompilacji, upewnij się, że tworzysz kompilację z pliku
.xcworkspace
, a nie z pliku.xcodeproj
. - Naciśnij Cmd+R lub kliknij Run. Do pracy z rozszerzonymi twarzami używaj urządzenia fizycznego, a nie symulatora.
- Kliknij „OK”, aby przyznać dostęp aparatu do przykładowej aplikacji. Aplikacja powinna uruchomić przedni aparat i od razu śledzić Twoją twarz na obrazie z kamery. Zdjęcia lisa powinny znajdować się na obu stronach czoła, a nad własnym nosem nakładać nos lisa.
Omówienie wdrażania funkcji rozszerzonych w aplikacji
Importuj pliki *.scn
do Xcode
Aby dodać własne zasoby, takie jak tekstury i modele 3D, do wykrytej twarzy w aplikacji, przeciągnij zasób *.scn
do Xcode.
Inicjowanie sesji rozszerzonych twarzy
Aby użyć w aplikacji interfejsu Augmented Faces API, zainicjuj sesję rozszerzonych twarzy. Ta sesja odpowiada za robienie zdjęć z użyciem aparatu z szybkością 60 klatek na sekundę i asynchronicznie zwraca aktualizacje twarzy do metody przedstawiciela. Podczas inicjowania po prostu przekaż pole widzenia urządzenia, na którym będzie się znajdować, oraz ustaw osobę, której przekazujesz dostęp.
// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self
Przekaż zdjęcia z aparatu do sesji
Gdy sesja zostanie zainicjowana i prawidłowo skonfigurowana, aplikacja może zacząć wysyłać do niej obrazy z kamery. Aplikacja przykładowa pobiera obrazy z aparatu, tworząc AVCaptureSession
z klatkami wideo z przedniego aparatu.
Poniższy przykładowy kod ilustruje implementację metody delegowania danych wyjściowych rejestrowanych przez AVFoundation
, która przekazuje obraz, sygnaturę czasową i rotację rozpoznawania do sesji 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 delegata, które zwraca wartość GARAugmentedFaceFrame
. Zawiera obiekt rozszerzonej twarzy, który umożliwia dodawanie efektów do twarzy. Zawiera on też bufor obrazów oraz sygnaturę czasową przesłaną do metody aktualizacji. Jest to przydatne do synchronizowania efektów twarzy ze zdjęciami. Obiekt ten zapewnia również przekształcenie wyświetlacza oraz macierz projekcji, dzięki czemu możesz skonfigurować świat 3D i widoki 2D w taki sposób, aby łatwo renderować efekty twarzy, które wyglądają na przymocowane do wykrytej twarzy.
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
Orientacja siatki twarzy
Zwróć uwagę na orientację siatki twarzy w iOS:
Nałóż teksturę 2D na twarz
Przykładowa aplikacja udostępnia klasę, która pozwala przekonwertować twarz rozszerzoną na obiekt SCNGeometry
. Za pomocą tej geometrii możesz łatwo przymocować go do węzła SceneKit, który zostanie umieszczony w przekształceniu środkowej twarzy rozszerzonej.
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 ścianki 2D jest wczytywana jako UIImage
i ustawiona na materiał przylegający do geometrii siatki płaszczyznowej.
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
Załączaj obiekty 3D do twarzy
Element GARAugmentedFace
otrzymany w ramach wywołania zwrotnego przez osobę, której przekazano dostęp, zawiera 3 różne regiony lub przekształcenia, za pomocą których możesz dołączać treści do twarzy. Przekształcenia te umożliwiają położenie nosa na lewo od czoła i na prawo od czoła w kosmosie. W tym przypadku do nosa przymocowuje się kulę.
// 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 je do Xcode.
- Wyeksportuj plik
*.dae
(model 3D). - Przeciągnij plik
*.dae
do projektu Xcode. - Przekonwertuj plik na format
.scn
w Xcode, wchodząc na stronę Editor > Convert to SceneKit scene file format (.scn).