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

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

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

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

יצירה והפעלה של אפליקציה לדוגמה

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

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

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

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

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

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

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

// 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 שהתקבל מהקריאה החוזרת של המשתמש שקיבל הרשאה, כולל 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).