ARKit框架阅读笔迹

ARKit框架下的类有:

  • ARAnchor
  • ARCamera
  • ARConfiguration
  • ARError
  • ARFaceAnchor
  • ARFaceGeomorey
  • ARFrame
  • ARHitTestResult
  • ARLightEstimate
  • ARPlaneAnchor
  • ARPointCloud
  • ARSCNView
  • ARSession
  • ARSKView

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);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容