ARFaceAnchor
關於臉部追蹤AR會話中檢測到的臉部的姿勢、拓撲和表情的信息。
概述
當運行面部追蹤會話時(參閱ARFaceTrackingConfiguration),會話使用前置攝像頭檢測到用戶臉部時會自動將面部添加到ARFaceAnchor對象的錨點列表中。每個臉部錨點提供有關臉部當前位置和方向、拓撲和面部表情的信息。
追蹤臉部的位置和方向
繼承而來的transform屬性描述了人臉在世界坐標中的當前位置和方向;也就是說,在相對於會話配置的worldAlignment屬性指定的坐標空間中。使用此變換矩陣將虛擬內容放置到AR場景的臉部中。
此變換矩陣創建一個臉部坐標系,用於相對於臉部定位其他元素。臉部坐標系的單位為米,原點居中在臉部后。

坐標系遵循右手准則--正x方向指向觀察者的右邊(即臉的左邊),正y方向向上(相對於臉本身而不是世界),正z方向為從臉部指向觀察者(朝向觀察者)。
使用臉部拓撲
geometry屬性提供了一個表示臉部詳細拓撲的ARFaceGeometry對象,該對象符合通用臉部模型以匹配檢測到的臉部的尺寸、形狀和當前表情。
可以使用此模型作為覆蓋用戶臉部形狀的內容的基礎--例如,應用於虛擬化妝或紋身。也可以使用此模型創建遮擋幾何體--不會渲染任何可見內容(允許相機圖像顯示)的3D模型,但會妨礙相機對場景中其他虛擬內容的視圖。
追蹤臉部表情
blendShapes屬性提供了當前面部表情的通過一系列命名系數來描述的高級模型,這些系數代表特定面部特征相對於其配置的移動。可以使用混合形狀系數以遵循用戶面部表情的方式動畫化2D或3D內容,如角色或頭像。
API
- var geometry: ARFaceGeometry
表示檢測到的臉部的拓撲的粗三角形網格。
討論
該網格提供了描述臉部3D形狀的頂點、索引和紋理坐標緩沖區,使得通用臉部模型符合檢測到的臉部的尺寸、形狀和當前表情。
可以通過將這些緩沖區傳遞到偏好的渲染引擎以可視化臉部幾何體。要使用SceneKit可視化臉部幾何體,請創建一個ARSCNFaceGeometry實例,並使用它的update(from:)方法來更新它以匹配臉部幾何體。
- class ARFaceGeometry
描述臉部追蹤AR會話中使用的臉部拓撲的3D網格。
概述
該類為臉部的詳細拓撲提供了一個通用模型,其形式為適用於各種渲染技術或導出的3D資源的3D網格。(要使用SceneKit輕松可視化臉部幾何體,參閱ARSCNFaceGeometry類。)
當在臉部追蹤AR會話中從ARFaceAnchor對象獲取到臉部幾何體時,該模型將符合檢測到的臉部的尺寸、形狀和當前表情。也可以使用命名混合形狀系數的字典創建一個臉部網格,它提供了當前臉部表情的詳細而有效的描述。
在AR會話中,可以使用此模型作為覆蓋用戶臉部形狀的內容的基礎--例如,應用於虛擬化妝或紋身。還可以使用此模型創建遮擋幾何體,其隱藏相機圖像中檢測到的臉部的3D形狀后面的其他虛擬內容。
獲取網格數據
-
var triangleCount: Int
由triangleIndices緩沖區描述的三角形數。
討論
每組的三個索引都形成一個三角形,所以triangleIndices緩沖區中的索引數量是triangleCount值的三倍。
從混合形狀中創建網格
-
init?(blendShapes: [ARFaceAnchor.BlendShapeLocation : NSNumber])
創建與指定字典中描述的臉部表情相匹配的臉部幾何體。
參數:blendShapes
根據特定臉部特征的位置描述臉部表情的混合形狀系數的字典。對於此字典中未指定的任何系數,ARKit指定為0.0。
返回值
臉部幾何體對象,若當前設備不支持ARKit臉部追蹤,則為nil。
討論
blendShapes字典中的每個鍵都是一個識別臉部特征的ARFaceAnchor.BlendShapeLocation常數。相應的值是該特征相對於其配置的位置,范圍從0.0到1.0(最大移動量)。
此字典的格式與ARFaceAnchor blendShapes屬性提供的格式相同。可以使用該屬性和此初始化器來有效保存和恢復臉部表情數據;混合形狀字典的序列化形式比這些系數描述的面部網格更加便捷。
- class ARSCNFaceGeometry
與AR會話提供的臉部信息一起使用的臉部拓撲的SceneKit表示。
概述
此類是SCNGeometry的一個子類,用於包裝ARFaceGeometry
類提供的網格數據。可以使用ARSCNFaceGeometry快速輕松地在SceneKit視圖中顯示由ARKit提供的臉部拓撲和臉部表情。
重要
ARSCNFaceGeometry僅在使用Metal的SceneKit視圖或渲染器中可用,且不支持基於OpenGL的SceneKit渲染。
創建幾何體
-
init?(device: MTLDevice)
創建一個用於使用指定的Metal設備進行渲染的SceneKit臉部幾何體。
參數:device
用於渲染幾何體的Metal設備。
返回值
一個新的SceneKit臉部幾何體,或如果Metal設備不可用或者當前設備不支持ARKit臉部追蹤,則為nil。
討論
新創建的ARSCNFaceGeometry實例表示一個中性的通用臉部; 使用update(from:)方法變形幾何體以匹配特定的面部表情或臉部形狀。
該幾何體包含單個幾何元素; 因此,分配多個材料不可視(參閱繼承的materials屬性)。
調用這個初始化器等效於調用init(device:fillMesh:)初始化器,並為fillMesh參數傳遞false。
-
init?(device: MTLDevice, fillMesh: Bool)
創建一個可選填充眼睛和嘴巴的網格間隙的SceneKit臉部幾何體。
參數:
device
用於渲染幾何體的Metal設備。
fillMesh
若為false,則網格不包括臉部拓撲的眼睛和嘴巴區域。
若在true,網格填充眼睛和嘴巴的間隙。
返回值
一個新的SceneKit臉部幾何體,或如果Metal設備不可用或者當前設備不支持ARKit臉部追蹤,則為nil。
討論
新創建的ARSCNFaceGeometry實例表示一個中性的通用臉部; 使用update(from:)方法變形幾何體以匹配特定的面部表情或臉部形狀。
如果fillMesh參數為false,則幾何包含單個幾何元素。 如果fillMesh參數為true,則幾何體包含以下順序的四個元素:臉本身,左眼和右眼以及嘴。(當SceneKit幾何體包含多個元素時,分配給其材料數組的材料的數量和順序可確定整個曲面是否具有均勻的外觀或每個幾何元素的外觀不同。)
更新幾何體
- func update(from: ARFaceGeometry)
改變SceneKit幾何體以匹配指定的臉部網格。
參數
faceGeometry
臉部拓撲、唯獨和表情的粗糙網格表示。
討論
要更新AR會話中主動追蹤的臉部SceneKit模型,請在ARSCNView代理對象的renderer(_:didUpdate:for:)回調中調用此方法,從回調提供的ARFaceAnchor對象傳遞geometry屬性。
或者,可以通過使用ARFaceGeometry init(blendShapes:)初始化器創建臉部幾何體對象並將其傳遞給該方法來創建、配置和可視化獨立於AR會話的臉部模型。
- var blendShapes: [ARFaceAnchor.BlendShapeLocation : NSNumber]
根據特定臉部特征的移動表示檢測到的臉部表情的命名系數的字典。
- struct ARFaceAnchor.BlendShapeLocation
用於特定臉部特征的標識符,用於描述這些特征的相對運動的系數。
