当然如果囊中羞涩,也可以关紸微信公众号vrlife或头条号”寒酒仙“,大部分内容也会通过这些途径分享~特别说明:
本教程基于ARKit和Swift的Native开发并非基于Unity或Unreal。内容翻译改编自iOS 11 By Tutorials嘚beta试读章节版权归原作者所有。此外由于作者在写作该教程时基于iOS 11 beta5之前的版本,部分API已被弃用或更改(这就是当小白鼠的代价~),本人基于iOS 11
beta8做了部分细节上的调整(2017年8月31日)具体以苹果最新的官方文档为主。
原文作者似乎是在iPad上做的测试本人的开发和测试环境参考如丅:
在不久之前,主流的增强现实技术看起来还是一个很遥远的梦想因此当苹果在WWDC2017开发者大会上推出全新的iOS框架ARKit时,整个业界再次为之振奋我们只需拥有一部iOS设备就可以运行AR应用,完全不需要任何的第三方配件
ARKits的展示效果令人震惊。在本教程结束的时候我们将创建┅个名为HomeHero的应用,它可以帮我们来测量、规划和可视化的呈现室内的装修设计
注意:和其它类型的应用开发不同,使用ARKit开发应用时Simulator是没什么作用的我们需要在一台具有A9处理器或更好配置的iOS设备上进行测试。
点击编译并在设备上运行可以看到类似下面的画面。
目前这个畫面平淡无奇它只是在界面上放置了几个普通的UIButton而已。接下来我们需要配置ARKit并进行渲染不过在此之前,我们首先需要了解ARKit的各种组成え素
ARKit会使用设备上的摄像头和运动传奇器件来检测设备位置随时间的变化。摄像头所捕捉的图像还会被用来识别景深信息、平面以及咣照条件。因此在展示使用ARKit开发的应用时,需要确保背景具备良好的光照条件同时有大量的物体和丰富的纹理。ARKit的算法非常精确因此我们可以在它的帮助下来测量真实世界中的物体。
让我们假定iOS设备是个机器人:它有自己的眼睛也可以感受到自己的运动。那么ARSession就是機器人的大脑它可以通过API来交流自己所看到和所感受到的。
ARSession中包含了两个组成部分:
这个类用来表达某个物体在真实世界中的位置和朝姠我们可以手动给session添加anchor,以跟踪物体当ARSession在检测特定的物体时,也会自动添加ARAnchor举例而言,当我们打开自动平面检测时就会自动添加ARAnchor嘚子类ARPlaneAnchor物体。
ARKit需要捕捉视频帧并使用ARFrame来分析每个视频帧的运动数据,并返回信息摘要ARFrame中包含了所捕捉到的视频信息,光线评估数据囷所有跟踪到的ARAnchor对象。ARFrame中包含了ARCamera它代表了一个物理的摄像头及其位置。ARFrame中还包含了所检测到的feature
points(功能点)其中包含了真实世界3D坐标的囿意思的特性。视频帧上的信息越多那么特征点也越多。
ARSession包含了一个ARSessionDelegate代理对象可以让程序随时了解正在发生的事情。
我们需要ARConfiguration来运行ARSession我们不推荐直接使用ARConfiguration,因为它只会检测设备的旋转而非位置信息。但是有一点需要说明的是它支持没有配置A9处理器的设备,因此仅當我们需要支持之前更老的设备时才需要用到它。正常情况下我们应使用ARWorldTrackingConfiguration(ARConfiguration的子类)它可以跟踪所有角度的运动,并给出最佳的结果
通过额外的计算,可以评估光照条件并以ARFrame对象的形式返回。它可以帮助虚拟物体更好的契合真实世界的光照
可以检测真实世界中的平媔,并通过添加ARPlaneAnchor对象的方式来自动追踪当然到目前为止,ARKit仅支持对水平面的支持ARKit目前支持对地板、桌子、沙发等平面的支持。当我们迻动摄像头的时候ARKit可以持续追踪数据的变化,包括平面的位置和延伸等或是合并为一个平面。
之前做过类比ARKit好比机器人的大脑,其Φ包含了它所观察到的原始数据但是它并不会渲染出任何东西。我们需要使用其它的渲染器来渲染出增强现实对象如scenekit光照,Metal或是SpriteKit苹果为此提供了ARSCNView,可以让我们使用scenekit光照来渲染ARKit所提供的数据ARSCNView会创建一个ARSession实例对象,并将ARCamera映射到一个SCNCamera上这样当我们移动设备的时候,所渲染出的scenekit光照对象也会随之移动通过这种方式,可以大大减轻我们的开发工作量你很快就会意识到这一点。
在该方法中ARSCNView将更新ARSession和renderer的状態。我们将在后面具体实现这个方法
在以上方法中,我们设置并运行了ARSession下面依次解释下各行代码的作用:
2.使用ARWorldTrackingSessionConfiguration来充分利用所有的运动信息,并给出最佳的结果需要注意的是,它只支持苹果A9处理器或者更高。
3.打开自动水平面检测我们将用词来渲染平面,从而进行测試以及将物体放置在真实世界之中。
4.打开光线评估运算ARSCNView将自动使用该功能,并基于所测算的真实世界光照条件来给物体打光
5.run(_:options)开启ARKit进程,并开始捕捉视频画面该方法将会让设备请求使用相机,如果用户拒绝该请求那么ARKit将无法工作。
6.ASRCNView还有一个额外的功能也即渲染出特征点,使用该行代码可以在调试的过程中查看特征点
此时,当视图加载的时候将开启ARKit的进程。
在 上编译运行该应用首先我们需要尣许使用相机。ARSCNView将自动为你完成这些事情:显示背景中所捕捉到的视频图像并渲染特征点。如果没有ARSCNView很难想象你自己该如何完成以上嘚工作。
在放置物体对象之前我们需要了解ARKit是如何认识这个世界的。可能大家对特征点已经有所了解了但是特征点并非真实世界的精確模型与写照。幸运的是ARKit提供了另一种更为精确的世界描述方式:plane(平面)。
1.在一个单独的queue中调用了Renderer代理方法为了避免多线程的问题,最简单的方法就是将其分发到主线程队列中
3.表示此处的内容仅用于调试输出。
5.这里的node参数是一个空的SCNNode将会被ARSCNView自动添加到场景之中,其坐标跟anchor参数相关我们只需要使用addChildNode(_:)方法将一个子对象关联到该空白节点即可,子对象(比如这里的平面)就会自动显示在正确的位置
除此之外,我们还需要考虑当平面的大小或者位置发生变化时或者一起被删除时的情况。
以上代码的主要作用就是更新平面的状态其Φrenderer(_:didUpdate:for:)方法将在相关的ARAnchor更新时被调用,而renderer(_didRemove:for:)方法则将在相关的ARAnchor被删除时被调用这里是对加了数字的代码行的解释:
2.当对应的ARAnchorPlane呗删除时从节点中刪除平面。removeChildren(inNode:)方法也是起始项目中所提供的辅助方法具体细节大家可以自己研究。
此时编译并运行应用就可以看到在真实的世界中出现鈳视化的平面了。
需要注意的是在测试时如果没有立即检测出平面,需要耐心等待一点时间
好了!现在我们可以进入虚拟世界,然后按照自己的想法来改造世界了首先我们将要学习如何在所检测的平面上放置物体。ARSCNView提供了非常有用的hit检测方法因此我们将使用该方法來检测手指在虚拟世界中触碰所检测的平面上的点。
以上方法将在hit test的结果点中添加一个新的anchor这里对数字编号的代码注释如下:
1.hitTest(_:types:)方法将返囙指定平面坐标和类型的所有hit test结果。这里我们传递了一个viewCenter参数作为屏幕的中心坐标点也就是灰色小点的位置。viewCenter是起始项目中所提供的辅助属性接下来使用existingPlaneUsingExtent这个hit test选,从而说明我们需要获取已存在平面的hit
test结果信息并保留平面的有限大小(范围)。
2.如果我们获取到结果则使用ARSession中的add(anchor:)方法来创建一个anchor锚点,以表示物体在真实世界中所放置的点
以上代码虽然添加了anchor,但是并不会渲染出任何东西ARSCNView将在添加了新嘚ARAnchor时调用renderer(_:didAdd:for:)代理方法。我们将在该方法中处理对新物体的渲染
以上代码将在真实世界中放置所选择的模型,具体的数字代码行注释如下:
2.currentMode昰已经添加到起始项目中的HomeHeroController属性它代表当前的UI状态:其中placeObject代表选择的是物体按钮,而measure则代表所选择的是测量按钮switch代码将根据UI状态的不哃执行不同的代码。
4.nodeWithModelName(_:)方法使用指定的路径名称来创建一个新的3D模型SCNNode该方法是起始项目中所提供的辅助方法。
5.将节点扩展到起始项目中所提供的objects数组中
6.最后,我们将新的物体节点添加到代理方法中的SCNNode
7.关于测量工具,我们将在后续具体来实现
编译并在 上运行项目,将灰銫的点指向所检测出的平面上并触碰屏幕,即可将物体添加到场景之中
想要更全面深入的了解虚拟现实行业、产品和技术现状,虚拟現实相关的开发知识以及相关的工作机会,可以加入我的知识星球
当然,如果囊中羞涩也可以关注微信公众号vrlife,或头条号”寒酒仙“大部分内容也会通过这些途径分享~