ARAnchor
关注对象在物理环境中的位置和方向。
要追踪实体或虚拟对象相对于相机的位置和方向,请创建锚点对象,并使用add(anchor:)方法将其添加到AR会话中。
当你在世界追踪会话中启用planeDetection时,ARKit还会自动添加锚点。
向会话添加锚有助于ARKit优化锚周围区域的世界跟踪准确性,以便虚拟对象相对于现实世界保持原位。如果虚拟对象移动,请从旧位置删除相应的锚点,并在新位置添加一个锚点。
一些ARKit功能会自动向会话添加特殊锚点。世界跟踪会话可以添加 ARPlaneAnchor, ARObjectAnchor, and ARImageAnchor 如果您启用了相应的功能,则为对象;面部跟踪会话添加 ARFaceAnchor objects.
ARPlaneAnchor
ARKit在物理环境中检测到的二维平面表面的锚。
当您在世界跟踪会话中启用平面检测时,ARKit会通知您的应用程序它使用设备的后置摄像头观察到的所有表面。ARKit使用每个唯一表面的ARPlaneAnchor调用委托的会话(_:didAdd:)。每个平面锚都提供有关表面的细节,如其真实世界的位置和形状。
Orientation
var alignment: ARPlaneAnchor.Alignment
检测到的平面相对于重力的一般方向。
描述检测到的平面相对于重力可能的一般方向的值。
平面垂直于重力。
平面与重力平行。
几何学
一种粗三角形网格,代表检测到的平面的一般形状。
描述世界跟踪AR会话中检测到的平面形状的3D网格。
SceneKit表示平面的二维形状,用于AR会话中的平面检测结果。
维度
平面相对于其锚点的中心点。
当ARKit首次检测到平面时,生成的ARPlaneAnchor对象的中心值为(0,0,0),表明锚点变换值的平移部分定位了平面的中心点。
随着场景分析和平面检测的继续,ARKit可能会确定之前检测到的平面锚点是更大的现实世界表面的一部分,从而增加范围宽度和长度值。平面的新边界可能与其初始位置不对称,因此中心点相对于锚点(不变的)变换矩阵而变化。
虽然此属性的类型是 vector_float3,但平面锚始终是二维的,并且总是相对于其变换位置仅定位在x和z方向。(也就是说,这个向量的y分量总是零。)
检测到的平面的估计宽度和长度。
平面分类
class var isClassificationSupported: Bool
一个布尔值,指示当前设备上是否提供平面分类。
var classification: ARPlaneAnchor.Classification
平面锚代表哪种现实世界表面的一般特征。
enum ARPlaneAnchor.Classification
以平面锚为代表的真实世界表面的可能特征。
平面锚代表现实世界的墙壁或类似的大垂直表面。
平面锚点代表现实世界的地板、地面平面或类似的大水平表面。
平面锚代表现实世界的天花板或类似的头顶水平表面。
平面锚代表现实世界的桌子、桌子、酒吧或类似的平面。
平面锚代表现实世界的椅子、凳子、长凳或类似的平面。
平面锚代表现实世界的门或类似的垂直表面。
平面锚点代表现实世界的窗户或类似的垂直表面。
ARObjectAnchor
ARKit在物理环境中检测到的真实世界3D对象的锚。
当您运行世界跟踪AR会话并为会话配置的检测对象属性指定ARReferenceObject对象时,ARKit会在现实环境中搜索这些对象。当会话识别对象时,它会自动将每个检测到的对象的ARObjectAnchor添加到锚列表中。
要放置与检测对象的位置或大小匹配的虚拟3D内容,请使用锚的继承转换属性以及锚的引用对象的中心和范围。
Physical Objects
Visualizing and Interacting with a Reconstructed Scene
使用多边形网格估计物理环境的形状。
Scanning and Detecting 3D Objects
记录现实世界对象的空间特征,然后使用结果在用户环境中找到这些对象并触发AR内容。
您希望ARKit在物理环境中检测到的3D对象的描述。
ARImageAnchor
ARKit在物理环境中检测到的已知图像的锚。
当您运行世界跟踪AR会话并为会话配置的检测图像属性指定ARReferenceImage对象时,ARKit会在现实环境中搜索这些图像。当会话识别图像时,它会自动将每个检测到图像的ARImageAnchor添加到其锚列表中。
要查找场景中可识别图像的范围,请使用继承的转换属性以及锚点参考图像的物理大小。
从用户环境中的矩形形状创建图像,并增强其外观。
Detecting Images in an AR Experience
对用户环境中已知的2D图像做出反应,并使用他们的位置放置AR内容。
您希望ARKit在物理环境中检测到的2D图像。
ARFaceAnchor
前置摄像头中可见的独特面孔的锚。
当会话检测到前置摄像头馈送中的唯一面孔时,会话会自动将ARFaceAnchor对象添加到锚点列表中。
当您使用ARFaceTrackingConfiguration跟踪面孔时,ARKit可以同时跟踪多个面孔。
或者,您可以通过设置使用世界跟踪配置启用人脸跟踪。
跟踪面部位置和方向
继承的变换属性描述了人脸在世界坐标中的当前位置和方向;即相对于会话配置的世界对齐属性指定的坐标空间。使用此转换矩阵将您想要“附加”到AR场景中面部的虚拟内容定位。
此变换矩阵创建一个人脸坐标系统,用于定位相对于人脸的其他元素。人脸坐标空间单位以米为单位,原点位于人脸后面,如下图所示。
坐标系是右手的——正x方向指向观众的右侧(即脸部自己的左边),正y方向指向(相对于脸本身,而不是世界),正z方向指向从脸部(指向观众)。
使用面部拓扑
几何属性提供了一个ARFaceGeometry对象,表示面部的详细拓扑结构,该对象符合通用面部模型,以匹配检测到的面部的尺寸、形状和当前表达式。
您可以使用此模型作为覆盖用户脸型内容的基础,例如,应用虚拟化妆或纹身。您还可以使用此模型创建遮挡几何形状——一个不渲染任何可见内容的3D模型(允许相机图像显示),但会阻碍相机查看场景中其他虚拟内容。
跟踪面部表情
混合形状属性提供了当前面部表情的高级模型,通过一系列许多命名系数进行描述,这些系数代表特定面部特征相对于中性配置的运动。您可以使用混合形状系数以遵循用户面部表情的方式为2D或3D内容(如字符或头像)添加动画效果。
使用人脸几何
代表检测到的面的拓扑结构的粗三角形网格。
ARFaceGeometry 描述面部拓扑的3D网格,用于面部跟踪AR会话。
此类以适合各种渲染技术或导出3D资产的3D网格的形式,为面部的详细拓扑提供了一个通用模型。(有关使用SceneKit可视化人脸几何的快速方法,请参阅ARSCNFaceGeometry类。)
当您在人脸跟踪AR会话中从ARFaceAnchor对象获得人脸几何形状时,模型符合与检测到的人脸的尺寸、形状和当前表达式相匹配。您还可以使用命名的混合形状系数字典创建一个人脸网格,该字典提供了对人脸当前表达式的详细但更有效的描述。
在AR会话中,您可以使用此模型作为覆盖用户脸部形状内容的基础,例如,应用虚拟化妆或纹身。您还可以使用此模型创建遮挡几何形状,它将其他虚拟内容隐藏在相机图像中检测到的人脸的3D形状后面。
人脸网拓扑在ARFaceGeometry实例中是恒定的。也就是说,顶点计数、纹理坐标计数和三角形计数属性的值永远不会改变,三角形索引缓冲区总是描述相同的顶点排列,纹理坐标缓冲区总是将相同的顶点索引映射到相同的纹理坐标。
只有顶点缓冲区在AR会话提供的面部网格之间发生变化,指示当ARKit根据用户面部的形状和表达式调整网格时,顶点位置发生了变化。
访问网格数据
面部网格中每个点的顶点位置数组。
var textureCoordinates: [vector_float2]
面部网格中每个点的纹理坐标值数组。
描述的三角形数量 triangleIndices buffer.
描述人脸几何顶点数据形成的三角形网格的索引数组。
Face Data
Tracking and Visualizing Faces
在前置摄像头增强现实体验中检测面部,覆盖虚拟内容,并实时动画面部表情。
Combining User Face-Tracking and World Tracking
在显示后置摄像头增强现实体验的应用程序中跟踪用户的脸部。
面部拓扑的SceneKit表示,用于AR会话提供的人脸信息。
使用混合形状
var blendShapes: [ARFaceAnchor.BlendShapeLocation : NSNumber]
一本命名系数词典,代表特定面部特征运动中检测到的面部表情。
struct ARFaceAnchor.BlendShapeLocation
特定面部特征的标识符,用于描述这些特征相对运动的系数。
跟踪眼睛运动
var leftEyeTransform: simd_float4x4
表示面部左眼位置和方向的变换矩阵。
var rightEyeTransform: simd_float4x4
表示面部右眼位置和方向的变换矩阵。
人脸坐标空间中估计人脸凝视方向的位置。
该矩阵的平移方面指示眼球中心相对于锚点变换所代表的位置。正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)
使用指定的转换和描述性名称创建一个新的锚对象。
锚的描述性名称。
跟踪锚
锚的唯一标识符。
拥有此锚的会话的唯一标识符。
编码锚相对于锚放置的AR会话的世界坐标空间的位置、方向和比例的矩阵。
常见类型
支持自定义锚子类。
跟踪现实世界对象或位置位置的对象界面。