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 z pliku
.xcworkspace
, a nie z pliku.xcodeproj
. - Naciśnij klawisze Cmd + R lub kliknij Run. Do pracy z ulepszonymi twarzami używaj urządzenia fizycznego, a nie symulatora.
- Kliknij „OK”, aby przyznać aparatowi dostęp do aplikacji przykładowej. Aplikacja powinna otworzyć przedni aparat i natychmiast śledzić Twoją twarz na obrazie z kamery. 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ć własne zasoby, takie jak tekstury i modele 3D do wykrytej twarzy w aplikacji, przeciągnij zasób *.scn
do Xcode.
Zainicjuj sesję rozszerzonej twarzy
Aby używać interfejsu Augmented Faces API w aplikacji, zainicjuj sesję rozszerzonej twarzy. Ta sesja odpowiada za robienie zdjęć aparatem z szybkością 60 kl./s, a synchronicznie zwraca aktualizacje twarzy do metody delegacji. Podczas inicjowania po prostu przekaż pole widzenia urządzenia do przechwytywania i pamiętaj, aby ustawić osobę z przekazanym dostępem.
// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self
Przekazywanie zdjęć 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 pobiera zdjęcia z aparatu przez utworzenie elementu AVCaptureSession
z klatkami wideo z przedniego aparatu.
Poniższa próbka kodu przedstawia implementację metody przekazywania danych wyjściowych w AVFoundation
, która przekazuje obraz, sygnaturę czasową i obrót 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 do przedstawiciela, które zwraca GARAugmentedFaceFrame
. Zawiera obiekt Rozszerzona twarz, który pomaga dołączać do twarzy efekty. Zawiera on również bufor obrazu oraz sygnaturę czasową przesłaną do metody aktualizacji. Przydaje się to do synchronizowania efektów twarzy z obrazami. Ten obiekt udostępnia również przekształcenie wyświetlacza i matrycę rzutowania, dzięki czemu możesz skonfigurować świat 3D i widoki 2D w sposób ułatwiający renderowanie efektów Twojej twarzy, które są powiązane 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:
Nałóż na twarz teksturę 2D
Przykładowa aplikacja zawiera klasę umożliwiającą konwertowanie rozszerzonej twarzy na obiekt SCNGeometry
. Za pomocą tej geometrii możesz łatwo dołączyć do węzła SceneKit, który zostanie umieszczony w przekształceniu centralnym płaszczyzny powiększonej.
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łącz obiekty 3D do twarzy
GARAugmentedFace
odebrane z wywołania zwrotnego przedstawiciela, zawiera 3 różne regiony lub przekształcenia, których możesz używać do dołączania treści do twarzy. Te przekształcenia pozwalają ułożyć nos, lewą część czoła i prawą część czoła w kosmosie. 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ć do wykrytej twarzy w aplikacji zasoby, takie jak tekstury i modele 3D, najpierw zaimportuj je do Xcode.
- Wyeksportuj plik
*.dae
(model 3D). - Przeciągnij plik
*.dae
do projektu Xcode. - Przekonwertuj plik na format
.scn
w Xcode, przechodząc do Editor > Convert to SceneKit scene file format (.scn).