מדריך למפתחים של 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. פותחים את האפליקציה לדוגמה בגרסת Xcode מגרסה 10.3 ואילך ומחברים את המכשיר למחשב הפיתוח באמצעות USB. כדי להימנע משגיאות build, צריך לוודא שהיצירה מתבצעת מהקובץ .xcworkspace ולא מהקובץ .xcodeproj.
  4. מקישים על Cmd+R או לוחצים על Run. כדי לעבוד עם פנים משופרות, צריך להשתמש במכשיר פיזי ולא בסימולטור.
  5. מקישים על 'אישור' כדי לתת למצלמה גישה לאפליקציה לדוגמה. האפליקציה אמורה לפתוח את המצלמה הקדמית ולעקוב מיד אחרי הפנים בפיד של המצלמה. יש למקם תמונות של אוזני השועל מעל שני צדי המצח, ולהניח אף שועל מעל האף.

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

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

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

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

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

// 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. תוכל להשתמש בגאומטריה הזו כדי לחבר בקלות לצומת סצנה, שאותו תציב בטרנספורמציה של מרכז הפנים Augmented.

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