מדריך למפתחים של Augmented Faces ל-iOS

איך משתמשים בפנים משופרות באפליקציות שלכם

דרישות מוקדמות

  • Xcode מגרסה 13.0 ואילך
  • Cocoapods מגרסה 1.4.0 ואילך, אם משתמשים ב-Cocoapods
  • מכשיר Apple תואם ARKit עם iOS מגרסה 12.0 ואילך (נדרש יעד פריסה עם iOS מגרסה 12.0 ואילך)

פיתוח גרסת build והרצה של האפליקציה לדוגמה

הוראות מפורטות מפורטות במדריך למתחילים.

  1. כדי לקבל את קוד האפליקציה לדוגמה, מעתיקים (clone) או מורידים את ARCore SDK ל-iOS מ-GitHub.
  2. פותחים חלון Terminal ומפעילים את pod install מהתיקייה שבה נמצא פרויקט Xcode.
  3. פותחים את אפליקציית הדוגמה ב-Xcode בגרסה 10.3 ואילך ומחברים את המכשיר למכונת הפיתוח באמצעות USB. כדי להימנע משגיאות ב-build, חשוב לוודא שאתם מבצעים build מהקובץ .xcworkspace ולא מהקובץ .xcodeproj.
  4. מקישים על Cmd+R או לוחצים על Run. כדי לעבוד עם פנים משופרים, צריך להשתמש במכשיר פיזי ולא בסימולטור.
  5. מקישים על 'OK' (בסדר) כדי לתת לאפליקציה לדוגמה גישה למצלמה. האפליקציה אמורה לפתוח את המצלמה הקדמית ולעקוב מיד אחרי הפנים שלכם בפיד המצלמה. התמונות של אוזני השועל צריכות להיות ממוקמות בשני צידי המצח, והאף של השועל צריך להיות ממוקם מעל האף שלכם.

סקירה כללית על הטמעת 'פנים משופרים' באפליקציה

ייבוא קבצי *.scn ל-Xcode

כדי להוסיף נכסים משלכם, כמו טקסטורות ודגמים תלת-ממדיים, לפנים שזוהו באפליקציה, גוררים את הנכס *.scn אל Xcode.

איך מפעילים סשן של Augmented Faces

כדי להשתמש ב-Augmented Faces API מהאפליקציה, צריך לאתחל סשן של Augmented Faces. הסשן הזה אחראי לצילום תמונות מהמצלמה ב-60fps, והוא יחזיר עדכוני פנים לשיטת הענקת גישה (delegate) באופן אסינכרוני. כשמאתחלים את הרכיב, פשוט מעבירים את שדה הראייה של מכשיר הצילום ומוודאים שמגדירים את הנציג.

// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self

העברת תמונות מהמצלמה לסשן

עכשיו, אחרי שהסשן הופעל והוגדר כראוי, האפליקציה יכולה להתחיל לשלוח תמונות מהמצלמה לסשן. האפליקציה לדוגמה מקבלת תמונות מהמצלמה על ידי יצירת AVCaptureSession עם פריימים של סרטון מהמצלמה הקדמית.

בדוגמת הקוד הבאה מוצגת הטמעה של שיטת הנציג של פלט הצילום של AVFoundation, שמעבירה את התמונה, חותמת הזמן וסיבוב הזיהוי לסשן זיהוי הפנים.

func captureOutput(_ output: AVCaptureOutput,
                     didOutput sampleBuffer: CMSampleBuffer,
                     from connection: AVCaptureConnection) {

     faceSession.update(with: imageBuffer,
                        timestamp: frameTime,
                        recognitionRotation: rotationDegrees)
}

אחרי עיבוד התמונה, ה-API של Augmented Faces שולח קריאה חוזרת למעבד שמייצרת GARAugmentedFaceFrame. הוא מכיל אובייקט של פנים משופרות שעוזר לכם לצרף אפקטים לפנים. הוא מכיל גם את מאגר התמונות ואת חותמת הזמן שהעברתם לשיטת העדכון. כדאי להשתמש באפשרות הזו כדי לסנכרן את אפקטים הפנים עם התמונות. האובייקט הזה מספק גם טרנספורמציה של תצוגה ומטריצה של הקרנה, כדי לוודא שתוכלו להגדיר את העולם התלת-ממדי והתצוגות הדו-ממדיות בצורה שמאפשרת לכם ליצור בקלות את האפקטים של הפנים שמופיעים מחוברים לפנים שזוהו.

var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }

כיוון של רשת פנים

שימו לב לכיוון של רשת הפנים ל-iOS:

החלת טקסטורה דו-ממדית על הפנים

באפליקציית הדוגמה יש כיתה להמרת הפנים המשופרים לאובייקט SCNGeometry. אפשר להשתמש בגיאומטריה הזו כדי לצרף בקלות צומת של SceneKit, שתמקמו בהמרה של מרכז הפנים המשופרים.

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

טקסטורת הפנים הדו-ממדית נטענת כ-UIImage ומוגדר לה חומר שמצורף לגיאומטריה של רשת הפנים.

faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")

faceMesh?.firstMaterial = faceTextureMaterial

הצמדת אובייקטים תלת-ממדיים לפנים

הערך של GARAugmentedFace שמתקבל מהקריאה החוזרת (callback) של הנציג מספק 3 אזורים או טרנספורמציות שונים שאפשר להשתמש בהם כדי לצרף תוכן לפנים. הטרנספורמציות האלה מאפשרות לקבל את האף, את החלק שמשמאל לקדקוד ואת החלק שמימין לקדקוד במרחב העולם. כאן נעשה שימוש בטרנספורמציה של האף כדי לצרף כדור לאף.

// 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)

ייבוא נכסים משלכם ל-Xcode

כדי להוסיף נכסים כמו טקסטורות ודגמים תלת-ממדיים לפנים שזוהו באפליקציה, קודם צריך לייבא את הנכסים ל-Xcode.

  1. מייצאים קובץ *.dae (מודל תלת-ממדי).
  2. גוררים את הקובץ *.dae לפרויקט Xcode.
  3. ממירים את הקובץ לפורמט .scn ב-Xcode. עוברים אל Editor > Convert to SceneKit scene file format (.scn).