ARAnchor

570 阅读10分钟

ARAnchor

关注对象在物理环境中的位置和方向。

要追踪实体或虚拟对象相对于相机的位置和方向,请创建锚点对象,并使用add(anchor:)方法将其添加到AR会话中。

当你在世界追踪会话中启用planeDetection时,ARKit还会自动添加锚点。

向会话添加锚有助于ARKit优化锚周围区域的世界跟踪准确性,以便虚拟对象相对于现实世界保持原位。如果虚拟对象移动,请从旧位置删除相应的锚点,并在新位置添加一个锚点。

一些ARKit功能会自动向会话添加特殊锚点。世界跟踪会话可以添加 ARPlaneAnchorARObjectAnchor, and ARImageAnchor 如果您启用了相应的功能,则为对象;面部跟踪会话添加 ARFaceAnchor objects.

ARPlane​Anchor

ARKit在物理环境中检测到的二维平面表面的锚。

当您在世界跟踪会话中启用平面检测时,ARKit会通知您的应用程序它使用设备的后置摄像头观察到的所有表面。ARKit使用每个唯一表面的ARPlaneAnchor调用委托的会话(_:didAdd:)。每个平面锚都提供有关表面的细节,如其真实世界的位置和形状。

Orientation

var alignment: ARPlaneAnchor.Alignment

检测到的平面相对于重力的一般方向。

enum ARPlaneAnchor.Alignment

描述检测到的平面相对于重力可能的一般方向的值。

case horizontal

平面垂直于重力。

case vertical

平面与重力平行。

几何学

var geometry: ARPlaneGeometry

一种粗三角形网格,代表检测到的平面的一般形状。

class ARPlaneGeometry

描述世界跟踪AR会话中检测到的平面形状的3D网格。

class ARSCNPlaneGeometry

SceneKit表示平面的二维形状,用于AR会话中的平面检测结果。

维度

var center: simd_float3

平面相对于其锚点的中心点。

当ARKit首次检测到平面时,生成的ARPlaneAnchor对象的中心值为(0,0,0),表明锚点变换值的平移部分定位了平面的中心点。

随着场景分析和平面检测的继续,ARKit可能会确定之前检测到的平面锚点是更大的现实世界表面的一部分,从而增加范围宽度和长度值。平面的新边界可能与其初始位置不对称,因此中心点相对于锚点(不变的)变换矩阵而变化。

虽然此属性的类型是 vector_float3,但平面锚始终是二维的,并且总是相对于其变换位置仅定位在x和z方向。(也就是说,这个向量的y分量总是零。)

var extent: simd_float3

检测到的平面的估计宽度和长度。

平面分类

class var isClassificationSupported: Bool

一个布尔值,指示当前设备上是否提供平面分类。

var classification: ARPlaneAnchor.Classification

平面锚代表哪种现实世界表面的一般特征。

enum ARPlaneAnchor.Classification

以平面锚为代表的真实世界表面的可能特征。

case wall

平面锚代表现实世界的墙壁或类似的大垂直表面。

case floor

平面锚点代表现实世界的地板、地面平面或类似的大水平表面。

case ceiling

平面锚代表现实世界的天花板或类似的头顶水平表面。

case table

平面锚代表现实世界的桌子、桌子、酒吧或类似的平面。

case seat

平面锚代表现实世界的椅子、凳子、长凳或类似的平面。

case door

平面锚代表现实世界的门或类似的垂直表面。

case window

平面锚点代表现实世界的窗户或类似的垂直表面。

ARObject​Anchor

ARKit在物理环境中检测到的真实世界3D对象的锚。

当您运行世界跟踪AR会话并为会话配置的检测对象属性指定ARReferenceObject对象时,ARKit会在现实环境中搜索这些对象。当会话识别对象时,它会自动将每个检测到的对象的ARObjectAnchor添加到锚列表中。

要放置与检测对象的位置或大小匹配的虚拟3D内容,请使用锚的继承转换属性以及锚的引用对象的中心和范围。

Physical Objects

Visualizing and Interacting with a Reconstructed Scene

使用多边形网格估计物理环境的形状。

Scanning and Detecting 3D Objects

记录现实世界对象的空间特征,然后使用结果在用户环境中找到这些对象并触发AR内容。

class ARReferenceObject

您希望ARKit在物理环境中检测到的3D对象的描述。

ARImage​Anchor

ARKit在物理环境中检测到的已知图像的锚。

当您运行世界跟踪AR会话并为会话配置的检测图像属性指定ARReferenceImage对象时,ARKit会在现实环境中搜索这些图像。当会话识别图像时,它会自动将每个检测到图像的ARImageAnchor添加到其锚列表中。

要查找场景中可识别图像的范围,请使用继承的转换属性以及锚点参考图像的物理大小。


Tracking and Altering Images

从用户环境中的矩形形状创建图像,并增强其外观。

Detecting Images in an AR Experience

对用户环境中已知的2D图像做出反应,并使用他们的位置放置AR内容。

class ARReferenceImage

您希望ARKit在物理环境中检测到的2D图像。

ARFace​Anchor

前置摄像头中可见的独特面孔的锚。

当会话检测到前置摄像头馈送中的唯一面孔时,会话会自动将ARFaceAnchor对象添加到锚点列表中。

当您使用ARFaceTrackingConfiguration跟踪面孔时,ARKit可以同时跟踪多个面孔。

或者,您可以通过设置使用世界跟踪配置启用人脸跟踪。

跟踪面部位置和方向

继承的变换属性描述了人脸在世界坐标中的当前位置和方向;即相对于会话配置的世界对齐属性指定的坐标空间。使用此转换矩阵将您想要“附加”到AR场景中面部的虚拟内容定位。

此变换矩阵创建一个人脸坐标系统,用于定位相对于人脸的其他元素。人脸坐标空间单位以米为单位,原点位于人脸后面,如下图所示。

image.png

坐标系是右手的——正x方向指向观众的右侧(即脸部自己的左边),正y方向指向(相对于脸本身,而不是世界),正z方向指向从脸部(指向观众)。

使用面部拓扑

几何属性提供了一个ARFaceGeometry对象,表示面部的详细拓扑结构,该对象符合通用面部模型,以匹配检测到的面部的尺寸、形状和当前表达式。

您可以使用此模型作为覆盖用户脸型内容的基础,例如,应用虚拟化妆或纹身。您还可以使用此模型创建遮挡几何形状——一个不渲染任何可见内容的3D模型(允许相机图像显示),但会阻碍相机查看场景中其他虚拟内容。

跟踪面部表情

混合形状属性提供了当前面部表情的高级模型,通过一系列许多命名系数进行描述,这些系数代表特定面部特征相对于中性配置的运动。您可以使用混合形状系数以遵循用户面部表情的方式为2D或3D内容(如字符或头像)添加动画效果。

使用人脸几何

var geometry: ARFaceGeometry

代表检测到的面的拓扑结构的粗三角形网格。

ARFace​Geometry 描述面部拓扑的3D网格,用于面部跟踪AR会话。

此类以适合各种渲染技术或导出3D资产的3D网格的形式,为面部的详细拓扑提供了一个通用模型。(有关使用SceneKit可视化人脸几何的快速方法,请参阅ARSCNFaceGeometry类。)

当您在人脸跟踪AR会话中从ARFaceAnchor对象获得人脸几何形状时,模型符合与检测到的人脸的尺寸、形状和当前表达式相匹配。您还可以使用命名的混合形状系数字典创建一个人脸网格,该字典提供了对人脸当前表达式的详细但更有效的描述。

在AR会话中,您可以使用此模型作为覆盖用户脸部形状内容的基础,例如,应用虚拟化妆或纹身。您还可以使用此模型创建遮挡几何形状,它将其他虚拟内容隐藏在相机图像中检测到的人脸的3D形状后面。

人脸网拓扑在ARFaceGeometry实例中是恒定的。也就是说,顶点计数、纹理坐标计数和三角形计数属性的值永远不会改变,三角形索引缓冲区总是描述相同的顶点排列,纹理坐标缓冲区总是将相同的顶点索引映射到相同的纹理坐标。

只有顶点缓冲区在AR会话提供的面部网格之间发生变化,指示当ARKit根据用户面部的形状和表达式调整网格时,顶点位置发生了变化。

访问网格数据

var vertices: [vector_float3]

面部网格中每个点的顶点位置数组。

var textureCoordinates: [vector_float2]

面部网格中每个点的纹理坐标值数组。

var triangleCount: Int

描述的三角形数量 triangleIndices buffer.

var triangleIndices: [Int16]

描述人脸几何顶点数据形成的三角形网格的索引数组。

Face Data

Tracking and Visualizing Faces

在前置摄像头增强现实体验中检测面部,覆盖虚拟内容,并实时动画面部表情。

Combining User Face-Tracking and World Tracking

在显示后置摄像头增强现实体验的应用程序中跟踪用户的脸部。

class ARSCNFaceGeometry

面部拓扑的SceneKit表示,用于AR会话提供的人脸信息。

使用混合形状

var blendShapes: [ARFaceAnchor.BlendShapeLocation : NSNumber]

一本命名系数词典,代表特定面部特征运动中检测到的面部表情。

struct ARFaceAnchor.BlendShapeLocation

特定面部特征的标识符,用于描述这些特征相对运动的系数。

跟踪眼睛运动

var leftEyeTransform: simd_float4x4

表示面部左眼位置和方向的变换矩阵。

var rightEyeTransform: simd_float4x4

表示面部右眼位置和方向的变换矩阵。

var lookAtPoint: simd_float3

人脸坐标空间中估计人脸凝视方向的位置。

该矩阵的平移方面指示眼球中心相对于锚点变换所代表的位置。正z轴从眼球中心指向瞳孔的方向。

矩阵的旋转方面表示眼球的方向——例如,围绕x轴的旋转将瞳孔向上或向下引导。眼睛不会围绕z轴旋转。

子类笔记

除了创建自己的ARAnchor实例来跟踪虚拟内容的真实位置外,您还可以对ARAnchor进行子类,以将自定义数据与您创建的锚联系起来。当ARKit在ARWorldMap中更新帧或保存和加载锚时,请确保锚类行为正确:

锚子类必须满足ARAnchor复制协议的要求。ARKit调用init(锚:)(在后台线程上)将锚类的实例从每个ARFrame复制到下一个ARFrame。您对此初始化器的实现应该复制子类添加的任何自定义属性的值。

锚子类还必须采用NSSecureCoding协议。重写编码(使用:)和init(编码器:)以保存和恢复ARKit保存和加载子类自定义属性的值在世界地图中时。

锚根据其标识符属性被视为相等。

当您保存世界地图时,仅包含不采用ARTrackable的锚。

创建 Anchors

init(transform: simd_float4x4)

使用指定的转换创建一个新的锚对象。

init(name: String, transform: simd_float4x4)

使用指定的转换和描述性名称创建一个新的锚对象。

var name: String?

锚的描述性名称。

跟踪锚

var identifier: UUID

锚的唯一标识符。

var sessionIdentifier: UUID?

拥有此锚的会话的唯一标识符。

var transform: simd_float4x4

编码锚相对于锚放置的AR会话的世界坐标空间的位置、方向和比例的矩阵。

常见类型

protocol ARAnchorCopying

支持自定义锚子类。

protocol ARTrackable

跟踪现实世界对象或位置位置的对象界面。