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

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

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

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

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

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

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

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

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

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

איך מתחילים סשן של פנים מורחבות

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

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

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

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

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

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

החלת טקסטורה דו-ממדית על משטח

באפליקציית הדוגמה יש כיתה להמרת הפנים המשופרים לאובייקט SCNGeometry. אפשר להשתמש בגיאומטריה הזו כדי לחבר בקלות לצומת SceneKit, שאותו מציבים בטרנספורמציה Augmented Face’s Center.

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