带你快速了解 ARKit

998 阅读7分钟
带你快速了解 ARKit

swift 发布于 2017年07月20日
关于 ARKit

说到 AR,大家可能会想到 Pokemon Go 这款风靡一时的游戏,也可能会对 AR 在技术上如何实现做一些思考。 而今年的 WWDC 苹果开发者大会上,苹果官方为我们提供了它对 AR 的实现,也就是 ARKit。这样,在 iOS 设备上,我们不需要处理复杂的 AR 实现细节,也可以将 AR 能力引入到我们自己的 APP 中了。

ARKit 简要介绍

WWDC 的一段视频对 ARKit 做了一个整体的概述,我看过后,最简单的概括总结起来就是这样 — ARKit 不仅是简单的在摄像头屏幕上显示一些增强内容,它还提供你了一整套追踪和定位能力,比如你在 AR 场景中放置一个虚拟桌子,它不仅能将这个桌子显示在你的屏幕上,还能够随着你手机的移动,显示桌子的各个角度,如下所示:

上面这个动图是 WWDC 官方的一段演示,手机屏幕中的桌子和椅子是 ARKit 虚拟出来的,拿着手机四处移动,屏幕中的桌椅就像真实的物品一样,也会展现出各个角度,如果不仔细看,恐怕都很难分辨出来它们是虚拟物品。

快速上手

怎么样,看了这个简短的效果演示后,是不是激起了你对 ARKit 的一些兴趣呢? 那么咱们闲言少叙开始快速上手。 在使用 ARKit 前需要安装 XCode 9, 以及一台 iOS 11 的设备。

XCode 9 为 ARKit 内置了项目模板,创建项目的时候选择 Augmented Reailty App:

创建项目要填写的内容和我们以前没什么区别,唯一一点不同就是需要多选择一个 Content Technology,这里我们不过多展开,选择 SenseKit 即可:

ARKit 项目的文件结构和我们平常熟悉的项目也并没有太多差别,除了多出一个 art.scnassets 文件夹:

这里面存放的是 AR 场景中用到的模型文件,比如这里的 ship.scn 打开它之后我们可以看到一个小飞船的模型:

文件结构大体上就是这样,下面来看看 ViewController.swift

class ViewController: UIViewController, ARSCNViewDelegate {
}

第一个不同点是,它实现了 ARSCNViewDelegate 这个 Delegate,它是 ARKit 中用于监听各种回调事件的。我们再往下看:

class ViewController: UIViewController, ARSCNViewDelegate {

@IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set the view's delegate
        sceneView.delegate = self

        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true

        // Create a new scene
        let scene = SCNScene(named: "art.scnassets/ship.scn")!

        // Set the scene to the view
        sceneView.scene = scene
    }

}

它有一个属性 ARSCNView, 这个类的实例用于显示 AR 的整体场景,之所以 viewDidLoad 方法中没有初始化和添加它到 view 中,是因为项目模板已经在 storyboard 中设置好了,这里面我们直接用就可以了。

viewDidLoad 做的事情也很简单,首先设置好 delegate 属性,然后打开 showsStatistics 属性。 这个是用来在界面上显示一些统计信息的,比如帧率之类的。

紧接着,初始化一个 SCNScene 实例,传入的就是我们刚才在项目文件中看到的 ship.scn 文件,也就是那个小飞船。 然后这个 SCNScene 属性关系设置好。

接下来,还需要在 viewWillAppearviewWillDisappear 方法中做一些操作:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // Create a session configuration
        let configuration = ARWorldTrackingSessionConfiguration()

        // Run the view's session
        sceneView.session.run(configuration)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        // Pause the view's session
        sceneView.session.pause()
    }

viewWillAppear 我们创建了一个 ARWorldTrackingSessionConfiguration 实例,然后调用 sceneView.session.run() 运行它。这样我们的 AR 会话就跑起来了。 这里多说一句,为什么要传入类似于 Configuration 的对象。这是因为 ARKit 有一个 Session 的概念,而每一个 Session 都需要一个特定的 Configuration 实例来配置它。

比如这里用到的 ARWorldTrackingSessionConfiguration,它表示这次运行的 Session 可以追踪手机的位移等信息,利用这些信息在 AR 场景中拟合出真实立体空间。

目前 ARKit SDK 中可用的默认实现 Configuration 就两种,一个是 ARWorldTrackingSessionConfiguration, 另一个是 ARSessionConfiguration

  • ARSessionConfiguration: 只能追踪设备的方向,不能识别设备的位移,以及平面识别等更细节的信息。
  • ARWorldTrackingSessionConfiguration: 可以识别设备的位移,表面识别,更好的模拟 AR 场景。

我相信上面这些介绍,如果大家是第一次看的话,可能也不会吸收太多内容。 我们只需要记得使用 ARKit 时,如果没有其他特别需求的话,首选 ARWorldTrackingSessionConfiguration 即可。

最后,我们再看一下 viewWillDisappear 方法,它也只不过是简单的调用 sceneView.session.pause() 方法,暂停了 AR Session。

那么到此为止,我们 XCode 9 为我们创建的模板项目所有的内容就都介绍完了。 如果你 Run 起来这个项目的话,你就可以从你的手机屏幕中看到那个小飞船悬浮在你身边了:

如果试着环绕这个小飞船走动,你还能看到它的各个角度,还是挺有意思的。

ARKit 的基本结构

对 ARKit 进行了一些基本了解后,确实刷新了我对 AR 的观念。首先, ARKit 不是简单的摄像头贴片,把一些 2D 或者 3D 的模型贴到你的摄像头屏幕上。如果让我用一句话来描述,它更像是对两个空间的拟合。一个是你所处的真实空间,另一个是 AR 的虚拟空间。ARKit 通过对手机上各个传感器的追踪分析,让这两个空间从逻辑上高度整合,然后再通过手机屏幕展现到你面前。

ARKit 主要用到的类其实并不多,如下:

  • ARSession:这是 ARKit 核心组件,所有的 AR 过程都是基于一个 ARSession,包括虚拟空间的计算,利用手机传感器和现实空间进行拟合等操作,都在这里面进行。
  • ARSessionConfiguration:这个是咱们上面提到过的,用于配置 ARSession 的交互方式。
  • ARSCNViewARSKView: 用于将 ARSession 渲染出来的内容展现出来,应该不难理解。
  • ARAnchor:用于标识现实空间的锚点,这些锚点在整个 ARSession 期间都有效。如果你开启了 Plane Detection(用于检测真实场景中的物理表面),则会自动填充这些锚点。

这样列出来 ARkit 类的介绍,第一时间不能完全理解清除很正常,这里只给大家做一个初步印象,在实践中遇到它们时再去深入了解。

ARKit 还有几个核心的工作组件:

  • World Tracking:通过对设备上的运动传感器,以及摄像头照片的分析,定位出当前设备相对于起始点和真实物理空间的位置。
  • Plane Detection:通过对摄像头照片的分析,找到物理空间中的表面区域,比如桌面,地面等。
  • Hit Testing:找到和指定点最近的一个表面位置,这个依赖于 Plane Detection 所分析出的数据,比如我们要在现实空间的桌面上放一个虚拟茶杯,就要先检测出放置的点。
  • Light Estimation:用于光感的模拟,比如现实空间室内的光线比较昏暗,那么你的虚拟内容的光线也要和室内保持一致,Light Estimation 就是提供这个能力的。

在进行 ARKit 相关开发的时候,对上面这几个组件的了解一定会很有用处。

结束

到此,给大家关于 ARKit 的快速了解就完成了,通过开始的演示,你应该对 ARKit 有了一个感官的认识,并且通过一个简单的实践也算是上手了。而这个领域更丰富的内容,就要靠大家的聪明才智来发掘了,也欢迎大家留言一起交流。


如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。