SceneKit + ARKitiOS ARKitARKIT+SCENEKIT

ARKit框架阅读笔迹

2018-01-14  本文已影响84人  叶子扬

ARKit框架下的类有:

ARAnchor

用于跟踪真实或虚拟对象相对于相机的位置和方向,addAnchor:方法将它们添加到AR会话中。
在世界跟踪会话中启用planeDetection选项时,ARKit还会自动添加锚点
属性:

锚点唯一的identifier
@property (nonatomic, readonly) NSUUID *identifier;

在世界坐标中定义锚的旋转,平移和缩放的转换矩阵

@property (nonatomic, readonly) matrix_float4x4 transform;

ARKit类(如ARFaceAnchor类)采用此协议,该类表示场景中的移动对象。
ARKit自动管理活动AR会话中的这些对象的表示,确保现实世界对象的位置和方向(锚的转换属性)的变化反映在相应的ARKit对象中。

@protocol ARTrackable <NSObject>
指示当前变换对于现实世界对象的移动是否有效。
@property (nonatomic, readonly) BOOL isTracked;

ARPlaneAnchor

ARPlaneAnchor继承自ARAnchor

平面校准,是个枚举,只有一个值。这个值与重力平面垂直
@property (nonatomic, readonly) ARPlaneAnchorAlignment alignment;

平面在锚的坐标空间中的中心
@property (nonatomic, readonly) vector_float3 center;

平面在锚的坐标空间中的范围
@property (nonatomic, readonly) vector_float3 extent;

ARConfiguration

这是一个抽象类,用与配置ARSession,配置的属性有:

参考坐标系
@property (nonatomic, readwrite) ARWorldAlignment worldAlignment;

这是一个枚举,确定坐标系如何与世界保持一致
默认是ARWorldAlignmentGravity(0, -1, 0)
还有ARWorldAlignmentGravityAndHeadingARWorldAlignmentCamera
其中,ARWorldAlignmentGravityAndHeading默认是(0, -1, 0),当North is True的时候,向量是(0, 0, -1)

光预估。默认是Enabled
@property (nonatomic, readwrite, getter=isLightEstimationEnabled) BOOL lightEstimationEnabled;
是否采集和提供音频数据。默认禁止
@property (nonatomic, readwrite) BOOL providesAudioData;
设置是否支持配置,要求芯片是A9,版本是iOS11及以上
@property(class, nonatomic, readonly) BOOL isSupported;

ARConfiguration有三个子类:

ARWorldTrackingConfiguration

所有的AR配置都会建立设备居住的真实世界与虚拟三维坐标空间之间的对应关系,我们可以在其中模拟内容。当应用程序将该内容与实时相机图像一起显示时,用户会体验到虚拟内容是真实世界的一部分的错觉。

在空间之间创建和维护这种对应关系需要跟踪设备的运动。 ARWorldTrackingConfiguration类以六个自由度(6DOF)跟踪设备的运动:三个旋转轴(滚动,俯仰和偏航)以及三个平移轴(在x,y和z中的运动)。

这种跟踪可以创造出逼真的AR体验:即使用户将设备倾斜到对象的上方或下方,或者移动设备以查看对象,虚拟对象也可能与真实世界保持相同的位置物体的侧面和背面。

当设备旋转、平移的时候,6DOF保持相应的AR幻觉
如果启用planeDetection设置,ARKit将分析场景以查找真实的平坦表面。对于检测到的每个平面,ARKit会自动将ARPlaneAnchor对象添加到会话中
AROrientationTrackingConfiguration

AROrientationTrackingConfiguration类以三个自由度(3DOF)跟踪设备的运动:特别是三个旋转轴(滚动,俯仰和偏航)。

这种基本的运动跟踪级别可以创建有限的AR体验:即使用户将设备旋转到位于该对象的上方,下方或旁边,虚拟对象也可能成为真实世界的一部分。但是,这种配置不能跟踪设备的移动:非平凡地改变设备的位置会打破AR幻觉,导致虚拟内容相对于真实世界出现漂移。例如,用户不能四处走动以查看虚拟对象的侧面和背面。此外,3DOF跟踪不支持平面检测或命中测试。

苹果建议:

由于3DOF跟踪限制了AR体验,因此通常不应直接使用AROrientationTrackingConfiguration类。相反,使用子类ARWorldTrackingConfiguration进行六自由度(6DOF)跟踪,平面检测和命中测试。使用3DOF跟踪仅在6DOF跟踪暂时不可用的情况下作为后备


当设备转动时,3DOF跟踪保持AR幻觉,但是当设备的位置移动时不会 当设备转动时,3DOF跟踪保持AR幻觉,但是当设备的位置移动时不会
ARFaceTrackingConfiguration

面部追踪配置根据设备的前置摄像头来检测用户的脸部。运行此配置时,AR会话将检测用户的脸部(如果在前置摄像机图像中可见),并将锚点列表添加到表示脸部的ARFaceAnchor对象。每个脸部锚点提供关于脸部的位置和方向,其拓扑结构和描述脸部表情的特征的信息

注意:

脸部追踪仅适用于带前置TrueDepth相机的iOS设备(iOS Device Compatibility Reference
)。在向用户提供需要脸部跟踪的任何功能之前,使用ARFaceTrackingConfiguration isSupported属性确定当前设备上是否有脸部跟踪.

ARFaceTrackingConfiguration类不提供方法或属性,但支持从它爹ARConfiguration继承的所有属性。另外,当启lightEstimationEnabled设置时,人脸跟踪配置将使用检测到的人脸作为光线探测器,并提供对方向或环境光照的估计

ARError

typedef NS_ERROR_ENUM(ARErrorDomain, ARErrorCode) {
    /** Unsupported configuration. */
    ARErrorCodeUnsupportedConfiguration   = 100,
    
    /** A sensor required to run the session is not available. */
    ARErrorCodeSensorUnavailable          = 101,
    
    /** A sensor failed to provide the required input. */
    ARErrorCodeSensorFailed               = 102,
    
    /** App does not have permission to use the camera. The user may change this in settings. */
    ARErrorCodeCameraUnauthorized         = 103,
    
    /** World tracking has encountered a fatal error. */
    ARErrorCodeWorldTrackingFailed        = 200,
};

ARFrame

视频图像和位置跟踪信息作为AR会话的一部分被捕获。

正在运行的AR会话不断捕捉设备摄像头的视频帧。对于每一帧,ARKit都会分析图像以及来自设备运动感应硬件的数据,以估计设备的实际位置。 ARKit以ARFrame对象的形式提供此跟踪信息和成像参数

当前帧的时间戳id
@property (nonatomic, readonly) NSTimeInterval timestamp;

当前帧捕获的图像
@property (nonatomic, readonly) CVPixelBufferRef capturedImage;

捕捉到的每一帧的depth data【只有在脸部追踪的时候,depth data才会捕捉】
@property (nonatomic, strong, readonly, nullable) AVDepthData *capturedDepthData;

depth data的时间戳id
@property (nonatomic, readonly) NSTimeInterval capturedDepthDataTimestamp;

相机提供帧的位置和方向信息
@property (nonatomic, copy, readonly) ARCamera *camera;

场景里一系列的锚点
@property (nonatomic, copy, readonly) NSArray<ARAnchor *> *anchors;

场景中灯光的光线估计值。当没有时返回nil
@property (nonatomic, strong, nullable, readonly) ARLightEstimate *lightEstimate;

相对于框架原点的场景中的特征点。仅仅当设置是world tracking的时候才会提供
@property (nonatomic, strong, nullable, readonly) ARPointCloud *rawFeaturePoints;
其他重要的东东

在帧中搜索与捕获图像中的点相对应的对象。
捕获图像的坐标空间中的2D点可以指沿着线段的任何点在三维坐标空间。命中测试是沿着这条线段查找世界上的对象的过程

参数1:点捕获图像的图像空间坐标系中的一个点。 值应该从(0,0 左上角到(1,1)右下角
参数2:要搜索的结果的类型。
返回值:从最近到最远排列的所有命中测试结果的数组。
- (NSArray<ARHitTestResult *> *)hitTest:(CGPoint)point types:(ARHitTestResultType)types;

其中搜索结果的类型

typedef NS_OPTIONS(NSUInteger, ARHitTestResultType) {
    /** Result type from intersecting the nearest feature point. */
    ARHitTestResultTypeFeaturePoint              = (1 << 0),
    
    /** Result type from intersecting a horizontal plane estimate, determined for the current frame. */
    ARHitTestResultTypeEstimatedHorizontalPlane  = (1 << 1),
    
    /** Result type from intersecting with an existing plane anchor. */
    ARHitTestResultTypeExistingPlane             = (1 << 3),
    
    /** Result type from intersecting with an existing plane anchor, taking into account the plane’s extent. */
    ARHitTestResultTypeExistingPlaneUsingExtent  = (1 << 4),
} NS_SWIFT_NAME(ARHitTestResult.ResultType);
上一篇下一篇

猜你喜欢

热点阅读