转自http://www.u3dc.com/archives/2790
这要从WWDC2017说起,概念有点多,我尽量精简一些说明白。
ARkit是什么?
话说,苹果在WWDC2017上发布的一套增强现实开发套件,然后IOS就成了世界上最大的AR平台了,关键是实现的SLAM效果还是行业顶尖水准的,也庆幸是IOS独占,不然让那些第三方做AR SDK的团队辛苦研究出来的SLAM就这样被秒了,现在至少还可以拿支持多平台说点什么。看过油管上有个小伙子测试ARkit,他在房间里放了一个3D物件,然后拿着手机在房间里转了一大圈,那个3D物件岿然不动,还在原地呆着,这定位效果真是~啧啧~
AR是什么?
英文全称:Augmented Reality,简称AR,中文意思:增强现实。简单点说,就是给已有的物体叠加显示一些细节信息,最形象的就是龙珠里的史考特眼镜,一眼看穿你的战斗力。目前在军事、医用、商业运作均有重要应用。
SLAM是什么?
全称:simultaneous localization and mapping,中文意思:即时定位与地图构建,最早于1988年由Smith、Self和Cheeseman提出,是计算机视觉研究领域的关键技术之一,这两年因为AR、MR概念的热炒又一度进入人们视线的热度榜中,简单的说,这是一项让虚拟的三维物体感知我们现实世界空间感的技术,比如我养了一直虚拟的小猫,它能与我们现实的世界进行交互,比如可以躲在我们的电脑桌下,或者跳到我们正在敲字的键盘上,细思极恐(可参考《电脑线圈》)。
Unity-ARKit-Plugin是什么?
这是Unity官方在WWDC发布会当天在bitbucket同步开源的插件型项目(Unreal也有对应的项目,当然今天先说这个)。插件的原理是把调用IOS原生的一些API功能进行了中介封装,这样你就可以直接使用Unity推荐的C#进行开发。
怎么用?
一般而言,插件都是为了快速开发而整合的接口型模块代码,一个陌生的插件到手上后,我们第一时间会先看它的测试场景样例,这是熟悉新东西的捷径,“Talk is cheap,show me the code."
当然官方在项目的ReadMe文档中也有详细的说明(英文),我整理了一下,大意如下:
【配置需求】:
Unity版本需要5.6.1P1以上(补丁版本),IOS需要升级到最新的IOS11(现在问题还比较多,不建议日常使用,开发者自备开发机),Xcode也需要升级到beta 9(已包含ARkit),最后还有个硬件需求:手机必须iPhone6s以上(A9以上CPU),iPad必须是2017年款的。
插件中已经包含了四个测试场景(最新版本,我fork了一份到我github上,并同步了最新的代码)。
插件的文件中,有两个比较重要的代码文件:ARSessionNative.mm和ARSessionNativeInterface.cs,前者是Objective-C代码,也是真正的ARkit SDK的接口代码,而后者则是胶水代码,就是上面说的封装原理,C#通过ARSessionNativeInterface.cs与IOS原生代码进行通讯。
接着介绍一些常用的API:
public void RunWithConfigAndOptions(ARKitWorldTackingSessionConfiguration config, UnityARSessionRunOption runOptions)
public void RunWithConfig(ARKitWorldTackingSessionConfiguration config)
public void Pause()
public List HitTest(ARPoint point, ARHitTestResultType types)
public ARTextureHandles GetARVideoTextureHandles()
public float GetARAmbientIntensity()
public int GetARTrackingQuality()
还有一些比较有用的委托(至于委托是什么,我们上一篇已经说过了,这里不赘述):
public delegate void ARFrameUpdate(UnityARCamera camera)
public delegate void ARAnchorAdded(ARPlaneAnchor anchorData)
public delegate void ARAnchorUpdated(ARPlaneAnchor anchorData)
public delegate void ARAnchorRemoved(ARPlaneAnchor anchorData)
public delegate void ARSessionFailed(string error)
在/Assets/Plugins/iOS/UnityARKit/NativeInterface/目录下以AR开头的.cs脚本所提供的API等价于原生ARkit的公有数据结构。
UnityARAnchorManager.cs这个脚本的用处是更新三维物件在追踪时的锚点(锚就是定点,让一个物体岿然不动的根本),参阅GeneratePlanes.cs 这个脚本详细了解具体的用法。
UnityARBuildPostprocessor.cs是一个Editor脚本,打包IOS平台时会调用,核心的代码如下,主要是做一些库和文件添加操作:
string projPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
其他一些实用的组件:
UnityARCameraManager.cs,这个组件得放到一个Gameobject上,这样才能通过ARkit来控制引用的摄像头。(这个其实和其他的AR SDK是很类似的),主要用于初始化ARkit,更新ARkit的位置、旋转、投射矩阵等信息。
ARVideo.cs 这个组件需要挂载到摄像机上,设置对应的材质用于传输数据到后备缓冲区。
官方的说明就是以上这些了,当然这个插件还在不断迭代更新中,后续还会有更多的feature,是不是意犹未尽?那就自己手动Clone下来研究一下呗。
github链接:https://github.com/U3DC/Unity-ARKit-Plugin