ดูวิธีใช้ Augmented Faces ในแอปของคุณเอง
ข้อกำหนดเบื้องต้น
- Xcode เวอร์ชัน 13.0 ขึ้นไป
- CocoaPods 1.4.0 ขึ้นไปหากใช้ CocoaPods
- อุปกรณ์ Apple ที่รองรับ ARKit ที่ใช้ iOS 12.0 ขึ้นไป (ต้องมีเป้าหมายการติดตั้งใช้งาน iOS 12.0 ขึ้นไป)
สร้างและเรียกใช้แอปตัวอย่าง
โปรดดูขั้นตอนโดยละเอียดที่การเริ่มต้นอย่างรวดเร็ว
- โคลนหรือดาวน์โหลด ARCore SDK สำหรับ iOS จาก GitHub เพื่อรับตัวอย่างโค้ดของแอป
- เปิดหน้าต่างเทอร์มินัลและเรียกใช้
pod install
จากโฟลเดอร์ที่มีโปรเจ็กต์ Xcode อยู่ - เปิดแอปตัวอย่างใน Xcode เวอร์ชัน 10.3 ขึ้นไป และเชื่อมต่ออุปกรณ์กับเครื่องพัฒนาซอฟต์แวร์ผ่าน USB โปรดตรวจสอบว่าคุณสร้างจากไฟล์
.xcworkspace
ไม่ใช่ไฟล์.xcodeproj
เพื่อหลีกเลี่ยงข้อผิดพลาดของรุ่น - กด Cmd+R หรือคลิก Run ใช้อุปกรณ์จริงเพื่อทำงานกับ Augmented Faces ไม่ใช่เครื่องจำลอง
- แตะ "ตกลง" เพื่อให้กล้องเข้าถึงแอปตัวอย่าง แอปควรเปิดกล้องหน้าและติดตามใบหน้าของคุณในฟีดกล้องทันที โดยควรติดรูปหูสุนัขจิ้งจอกไว้ที่หน้าผากทั้ง 2 ด้าน และวางจมูกสุนัขจิ้งจอกไว้ที่จมูกของคุณ
ภาพรวมของการใช้ Augmented Faces ในแอป
นําเข้า *.scn
ไฟล์ไปยัง Xcode
หากต้องการเพิ่มเนื้อหาของคุณเอง เช่น พื้นผิวและโมเดล 3 มิติไปยังใบหน้าที่ตรวจพบในแอป ให้ลากเนื้อหา *.scn
ลงใน Xcode
เริ่มต้นเซสชัน Augmented Faces
หากต้องการใช้ Augmented Faces API จากแอปของคุณ ให้เริ่มต้นเซสชัน Augmented Faces เซสชันนี้มีหน้าที่ถ่ายภาพจากกล้องที่ 60 fps และจะส่งการอัปเดตใบหน้าแบบไม่พร้อมกันไปยังวิธีการที่ได้รับมอบสิทธิ์ เมื่อเริ่มต้น เพียงแค่ส่งขอบเขตการมองเห็นของอุปกรณ์จับภาพ และตรวจสอบว่าได้ตั้งค่าผู้รับมอบสิทธิ์แล้ว
// 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
โดยมีวัตถุ Augmented Face ที่ช่วยแนบเอฟเฟกต์ไว้บนใบหน้า และยังมีบัฟเฟอร์รูปภาพและการประทับเวลาที่คุณส่งผ่านวิธีการอัปเดตด้วย ซึ่งจะเป็นประโยชน์สำหรับการซิงค์เอฟเฟกต์ใบหน้ากับรูปภาพ วัตถุนี้ยังให้การแปลงการแสดงผลและเมทริกซ์การฉายภาพเพื่อให้คุณตั้งค่าโลก 3 มิติและมุมมอง 2 มิติในลักษณะที่ทำให้แสดงผลเอฟเฟ็กต์ใบหน้าที่ปรากฏแนบกับใบหน้าที่ตรวจพบได้โดยง่าย
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
การวางแนวแบบตาข่ายของใบหน้า
โปรดสังเกตการวางแนวของโครงตาข่ายสำหรับ iOS ดังนี้
ใช้พื้นผิว 2 มิติกับใบหน้า
แอปตัวอย่างมีคลาสสำหรับแปลง Augmented Face เป็นออบเจ็กต์ SCNGeometry
คุณสามารถใช้รูปเรขาคณิตนี้เพื่อติดเข้ากับโหนด SceneKit ได้ง่ายๆ ซึ่งคุณจะวางในการแปลงกึ่งกลางของ Augmented Face
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
พื้นผิวของใบหน้าแบบ 2 มิติจะโหลดเป็น UIImage
และตั้งค่าเป็นวัสดุที่แนบอยู่กับเรขาคณิตของตาข่ายด้านใบหน้า
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
แนบวัตถุ 3 มิติที่ใบหน้า
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
หากต้องการเพิ่มเนื้อหา เช่น พื้นผิวและโมเดล 3 มิติไปยังใบหน้าที่ตรวจพบในแอป ให้นำเข้าเนื้อหาลงใน Xcode ก่อน
- ส่งออกไฟล์
*.dae
(โมเดล 3 มิติ) - ลากไฟล์
*.dae
ลงในโปรเจ็กต์ Xcode - แปลงไฟล์เป็นรูปแบบ
.scn
ใน Xcode โดยไปที่ Editor > Convert to SceneKit scene file format (.scn)