首先说明下AR的本质:通过移动设备摄像头捕捉到实时画面,并在画面中插入3D虚拟图形,形成一种使得3D虚拟物体真实地展现在现实中的一种效果。比如,你可以拍摄一人在和一个动画人物在现实场景中战斗等。
苹果ARKit的本质是可以识别出摄像头捕捉到的画面中所包含的场景的坐标,重点就是坐标,在拿到场景坐标后就可以利用我们熟悉的渲染框架来插入虚拟3D物体,从而实现AR效果。需要说明的是苹果这次并不直接支持使用OpenGL渲染,下面会有详细说明。
首先,苹果是如何获取场景坐标的?虽然这个技术并不直接影响我们的开发,但了解一下总是好的。其实ARKit是利用了两个部分:手机设备的移动传感器+图片视觉分析。当手机拿在用户手中时,即使是很轻微的晃动,移动传感器也可以记录下差异,并生成数据,同时视觉图片分析算法会根据每帧图片之间的差异再结合之前移动传感器获取的数据,从而计算出场景坐标。
因此上述是ARKit解决的最本质问题,也是它的核心部分。同时它还提供了一些额外的辅助功能,其中最重要的是可以实现识别出“平面”,这里需要强调的是仅仅可以识别“水平平面”,暂不支持“垂直平面”。开发者可以利用获取到的平面坐标来将3D虚拟物体添加到平面上,比如将一个桌子变成了外星人战场!如下图是发布会上的演示:
事实上对于开发者来说,最重要的是拿到坐标后渲染你的3D图形,因此涉及到了渲染框架。首先苹果提供了3个框架:Scenekit、SpriteKit、Metal2。
Scenekit是在2012年首次推出,并仅限于macOS系统,直到2014年引入到了iOS中来,Scenekit是以OpenGL作为底层基础,将其封装成了面向对象的框架。使得开发更友好,效率也更高,使用过OpenGL的开发者都知道,虽然OpenGL很强大,可控制环节更多,但是它的本质是状态机的概念,面向开发者并不好上手,并且其中包含了大量地线性代数等数学概念,但是苹果SceneKit将其封装得非常友好,也足够使用了。但是SceneKit还是支持调用OpenGL的GLSL着色器的。
SpriteKit是一个2D的渲染框架,而SceneKit是三维的。其他在框架结构上和SceneKit完全相似,因此不多做介绍。
Metal 2是Metal的第二代升级版。他是相对于OpenGL/OpenGL ES的苹果自家提供的框架,它不是跨平台的,因此只用于苹果自家系统。Metal 2提供了和OpenGL同一级别的渲染功能,相比于SceneKit,Metal 2的可控环节更多,因此也更强大。另外,Metal 2最大的特点是可提供GPU编程,可以令你的程序利用GPU来执行机器学习相关代码。
因此总结下,对于开发者来说,若不是特别精细的、要求特别高的效果,SceneKit+SpriteKit的组合就可以完成大部分效果了,从时间成本上这也是很好的选择,而需要更精准的要求,那么可以采用Metal 2来完成渲染。
另外在这多说一句自己的感受,底层如此复杂的框架,封装的既是如此简单易用,苹果真是在不遗余力地弱化程序员的存在感啊。。。