ARKit Beta Document 部分翻译复述. 2017.06.07.
ARSession
ARSession 是一个通过管理设备摄像头与运动处理从而提供AR功能的共享对象。
ARSession协调AR众多的处理过程,其中包括从设备运动传感器中获取数据,控制內建camera,canmera获取图像的处理分析。
Session通过综合所有的结果来建立现实空间和虚拟坐标系空间之间的联系,从而实现AR效果(具体论述后文有)。
每个AR体验都需要ARSession对象。如果我们使用ARSCNView or ARSKView,则不用自己管理Session,因为它们自带并自己管理着,如果我们要创建自定义的渲染结果,我们需要自己手动维护ARSession对象。
运行ARSession需要相关的配置对象,也就是下面的ARSessionConfiguration与ARWorldTrackingSessionConfiguration。这些配置对象的作用见下文,主要实现ARSession处理策略选择。
属性与方法见SDK。
Configurations-0-ARSessionConfiguration
ARSessionConfiguration 是设置session需要使用的配置对象,父类是NSObject。作用是决定运动和场景追踪方案。
ARSessionConfiguration是ARWorldTrackingSessionConfiguration的父类。
ARSessionConfiguration是一个基本配置,仅探测设备的姿态,不追踪设备的空间位置。仅提供三个自由度,即空间坐标系三个轴旋转,不可平动。
这种局限性导致与ARWorldTrackingSessionConfiguration相比,我们无法通过移动来观察物体的背部。
效果如下图:
虽然这样会有局限性,但是可以适配更多支持ARKit的iOS设备。
属性:
/**
Determines whether this device supports the ARSessionConfiguration.
确定当前设备是否支持。
*/
@property(class, nonatomic, readonly) BOOL isSupported;
/**
Determines how the session's coordinate system should be aligned with the world.
确定虚拟坐标系如何与现实世界对齐
对齐方式见下一段代码
@discussion The default is ARWorldAlignmentGravity.
*/
@property (nonatomic, readwrite) ARWorldAlignment worldAlignment;
/**
Enable or disable light estimation.
@discussion Enabled by default.
*/
现实中光线预估融合进计算的开关
@property (nonatomic, readwrite, getter=isLightEstimationEnabled) BOOL lightEstimationEnabled;
对齐方式
/** Aligns the world with gravity that is defined by vector (0, -1, 0). */
ARWorldAlignmentGravity,
/** Aligns the world with gravity that is defined by the vector (0, -1, 0)
and heading (w.r.t. True North) that is given by the vector (0, 0, -1). */
ARWorldAlignmentGravityAndHeading,
/** Aligns the world with the camera's orientation. */
ARWorldAlignmentCamera
Configurations-1-ARWorldTrackingSessionConfiguration
ARWorldTrackingSessionConfiguration可以追踪设备姿态和位置,通过设备的摄像头可以探测到真实世界的表面。
所有的 AR 配置项的最终目为在设备所在的真实世界空间和供我们放置内容的虚拟3D坐标空间之间建立联系(当然是依赖ARSession实现)。当你将要展示的内容和设备的摄像头捕捉的内容相结合并展示给用户的时候,可以给用户制造一个虚拟内容存在于现实中的幻觉。
虚拟和现实内容之间联系的创建和维护需要我们追踪设备的运动状。ARWorldTrackingSessionConfiguration可以帮我们实现。它可以实现六自由度追踪:Six degrees of freedom。https://en.wikipedia.org/wiki/Six_degrees_of_freedom。
简单来说就是可以追踪空间坐标系三个轴的平动和绕轴的转动。
六自由度追踪可以实现沉浸式AR体验。
虚拟物体可以出现在现实中的固定位置,我们甚至可以倾斜、移动设备来全方位观看虚拟物体。效果如下图
此外,如果我们打开 planeDetection 设置,ARKit就会分析寻找现实中的平面。每当检测到一个平面,Kit会自动添加 ARPlaneAnchor 对象到场景中。
属性部分,除了父类的属性,再加:
/**
Type of planes to detect in the scene.
@discussion If set, new planes will continue to be detected and updated over time. Detected planes will be added to the session as
ARPlaneAnchor objects. In the event that two planes are merged, the newer plane will be removed. Defaults to ARPlaneDetectionNone.
*/
探测平面的类型。类型见下段代码
@property (nonatomic, readwrite) ARPlaneDetection planeDetection;
/**
Option set indicating the type of planes to detect.
*/
API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos)
typedef NS_OPTIONS(NSUInteger, ARPlaneDetection) {
/** No plane detection is run. */
ARPlaneDetectionNone = 0,
/** Plane detection determines horizontal planes in the scene. */
ARPlaneDetectionHorizontal = (1 << 0),
} NS_SWIFT_NAME(ARWorldTrackingSessionConfiguration.PlaneDetection);
Building a Basic AR Experience
上文已经明确表达过如下内容:
尽管 ARSCNView 和 ARSKView 已经内建了ATSession对象并自行管理,在run之前,我们还是需要提供配置对象来决定AR体验的质量的。
设置规则如下:
· A9处理器及以后的设备,我们直接使用更强大的ARWorldTrackingSessionConfiguration配置;
· A9以前的设备就歇歇吧,ARWorldTrackingSessionConfiguration的父类才是合适的选择。
使用方法如下
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal
// Run the view's session
sceneView.session.run(configuration)
}
需要注意的是,run的步骤一定要在will display步骤执行。
截止目前,我们已经设置好了ARSession,下面我们需要放置内容。