ARKit文档翻译之ARFaceAnchor类
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
用于特定脸部特征的标识符,用于描述这些特征的相对运动的系数。