U3DC.COM | 优三帝研究院

Menu

【开源20170621期】Unity-​ARKit-Plugin插件及样例教程

这要从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<ARHitTestResult> 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";

		UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject();
		proj.ReadFromString(File.ReadAllText(projPath));
        proj.AddFrameworkToProject(proj.TargetGuidByName("Unity-iPhone"), "ARKit.framework", false);
		string target = proj.TargetGuidByName("Unity-iPhone");
		Directory.CreateDirectory(Path.Combine(pathToBuiltProject, "Libraries/Unity"));

		string[] filesToCopy = new string[]
		{
			
		};

		for(int i = 0 ; i < filesToCopy.Length ; ++i)
		{
			var srcPath = Path.Combine("../PluginSource/source", filesToCopy[i]);
			var dstLocalPath = "Libraries/" + filesToCopy[i];
			var dstPath = Path.Combine(pathToBuiltProject, dstLocalPath);
			File.Copy(srcPath, dstPath, true);
			proj.AddFileToBuild(target, proj.AddFile(dstLocalPath, dstLocalPath));
		}

		File.WriteAllText(projPath, proj.WriteToString());

其他一些实用的组件:

UnityARCameraManager.cs,这个组件得放到一个Gameobject上,这样才能通过ARkit来控制引用的摄像头。(这个其实和其他的AR SDK是很类似的),主要用于初始化ARkit,更新ARkit的位置、旋转、投射矩阵等信息。

ARVideo.cs 这个组件需要挂载到摄像机上,设置对应的材质用于传输数据到后备缓冲区。


官方的说明就是以上这些了,当然这个插件还在不断迭代更新中,后续还会有更多的feature,是不是意犹未尽?那就自己手动Clone下来研究一下呗。

github链接:https://github.com/U3DC/Unity-ARKit-Plugin


 

关注公众号获取更新内容

打赏
— 于 共写了3341个字
— 文内使用到的标签:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据