איך משתמשים בפנים משופרות באפליקציות שלכם
דרישות מוקדמות
- Xcode מגרסה 13.0 ואילך
- Cocoapods מגרסה 1.4.0 ואילך, אם משתמשים ב-Cocoapods
- מכשיר Apple תואם ARKit עם iOS מגרסה 12.0 ואילך (נדרש יעד פריסה עם iOS מגרסה 12.0 ואילך)
פיתוח גרסת build והרצה של האפליקציה לדוגמה
הוראות מפורטות מפורטות במדריך למתחילים.
- כדי לקבל את קוד האפליקציה לדוגמה, מעתיקים (clone) או מורידים את ARCore SDK ל-iOS מ-GitHub.
- פותחים חלון Terminal ומפעילים את
pod install
מהתיקייה שבה נמצא פרויקט Xcode. - פותחים את אפליקציית הדוגמה ב-Xcode בגרסה 10.3 ואילך ומחברים את המכשיר למכונת הפיתוח באמצעות USB. כדי להימנע משגיאות ב-build, חשוב לוודא שאתם מבצעים build מהקובץ
.xcworkspace
ולא מהקובץ.xcodeproj
. - מקישים על Cmd+R או לוחצים על Run. כדי לעבוד עם פנים משופרים, צריך להשתמש במכשיר פיזי ולא בסימולטור.
- מקישים על '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.
- מייצאים קובץ
*.dae
(מודל תלת-ממדי). - גוררים את הקובץ
*.dae
לפרויקט Xcode. - ממירים את הקובץ לפורמט
.scn
ב-Xcode. עוברים אל Editor > Convert to SceneKit scene file format (.scn).