瞭解如何在自己的應用程式中使用擴增臉孔功能。
必要條件
- Xcode 13.0 以上版本
- Cocoapods 1.4.0 以上版本 (如果使用 Cocoapods)
- 搭載 iOS 12.0 以上版本的 ARKit 相容 Apple 裝置 (需要 iOS 12.0 以上版本的部署目標)
建構並執行範例應用程式
如需詳細步驟,請參閱快速入門導覽課程。
- 從 GitHub 複製或下載 iOS 版 ARCore SDK,取得範例應用程式的程式碼。
- 開啟終端機視窗,然後從 Xcode 專案所在的資料夾執行
pod install
。 - 在 Xcode 10.3 以上版本中開啟範例應用程式,並透過 USB 將裝置連接至開發機器。為了避免建構錯誤,請確認您是從
.xcworkspace
檔案 (而不是.xcodeproj
檔案) 建構。 - 按下 Cmd+R 鍵或點選 Run 鍵。搭配實體裝置 (而非模擬器) 使用擴增臉孔功能。
- 輕觸「確定」,授權相機存取範例應用程式。應用程式應該會開啟前置鏡頭,並在攝影機畫面內立即追蹤您的臉孔。請將狐狸耳朵的兩側放在額頭的兩側,並在自己的鼻子上放置一根狐狸。
在應用程式中實作擴增臉孔功能總覽
將 *.scn
檔案匯入 Xcode
如要為應用程式偵測到的臉孔新增自有資產 (例如紋理和 3D 模型),請將 *.scn
素材資源拖曳至 Xcode。
初始化擴增臉孔工作階段
如要透過應用程式使用擴增 Faces API,請初始化擴增臉孔工作階段。這個工作階段負責以 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)
}
圖片處理完畢後,擴增 Faces API 會傳送會傳回 GARAugmentedFaceFrame
的委派回呼。因為這個模式包含擴增臉物件,方便你為臉孔增添效果。其中也包含圖片緩衝區,以及您傳遞至更新方法的時間戳記。這很適合用於同步處理圖片的臉部效果。這個物件也會提供顯示轉換和投影矩陣,確保您能夠以簡單的方式設定 3D 世界和 2D 檢視,以便輕鬆呈現您偵測到的臉孔上貼的臉部效果。
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
臉部網格方向
請注意 iOS 的臉部網格方向:
將 2D 紋理套用至表面
範例應用程式提供一個類別,可將擴增臉孔轉換成 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
2D 臉部紋理會以 UIImage
的形式載入,並設定為附加至臉孔網格幾何形狀的材質。
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
將 3D 物體附加到錶面
從委派回呼收到的 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
如要為應用程式中偵測到的臉孔新增資產 (例如紋理和 3D 模型),請先將資產匯入 Xcode。
- 匯出
*.dae
(3D 模型) 檔案。 - 將
*.dae
檔案拖曳至 Xcode 專案。 - 前往 Editor > Convert to SceneKit scene file format (.scn),將檔案轉換為 Xcode 中的
.scn
格式。