轉(zhuǎn)自http://www.u3dc.com/archives/2790
這要從WWDC2017說起琴昆,概念有點多遥倦,我盡量精簡一些說明白碉考。
ARkit是什么挺身?
話說,蘋果在WWDC2017上發(fā)布的一套增強現(xiàn)實開發(fā)套件良蒸,然后IOS就成了世界上最大的AR平臺了伍玖,關(guān)鍵是實現(xiàn)的SLAM效果還是行業(yè)頂尖水準(zhǔn)的,也慶幸是IOS獨占串纺,不然讓那些第三方做AR SDK的團隊辛苦研究出來的SLAM就這樣被秒了,現(xiàn)在至少還可以拿支持多平臺說點什么榄笙〉或颍看過油管上有個小伙子測試ARkit,他在房間里放了一個3D物件巨朦,然后拿著手機在房間里轉(zhuǎn)了一大圈糊啡,那個3D物件巋然不動,還在原地呆著棚蓄,這定位效果真是~嘖嘖~
AR是什么梭依?
英文全稱:Augmented Reality,簡稱AR邪蛔,中文意思:增強現(xiàn)實扎狱。簡單點說,就是給已有的物體疊加顯示一些細(xì)節(jié)信息匠抗,最形象的就是龍珠里的史考特眼鏡污抬,一眼看穿你的戰(zhàn)斗力。目前在軍事矢腻、醫(yī)用射赛、商業(yè)運作均有重要應(yīng)用。
SLAM是什么竣灌?
全稱:simultaneous localization and mapping,中文意思:即時定位與地圖構(gòu)建及汉,最早于1988年由Smith屯烦、Self和Cheeseman提出,是計算機視覺研究領(lǐng)域的關(guān)鍵技術(shù)之一温眉,這兩年因為AR迅脐、MR概念的熱炒又一度進(jìn)入人們視線的熱度榜中豪嗽,簡單的說,這是一項讓虛擬的三維物體感知我們現(xiàn)實世界空間感的技術(shù)隐锭,比如我養(yǎng)了一直虛擬的小貓计贰,它能與我們現(xiàn)實的世界進(jìn)行交互,比如可以躲在我們的電腦桌下荞怒,或者跳到我們正在敲字的鍵盤上秧秉,細(xì)思極恐(可參考《電腦線圈》)。
Unity-ARKit-Plugin是什么荧嵌?
這是Unity官方在WWDC發(fā)布會當(dāng)天在bitbucket同步開源的插件型項目(Unreal也有對應(yīng)的項目砾淌,當(dāng)然今天先說這個)汪厨。插件的原理是把調(diào)用IOS原生的一些API功能進(jìn)行了中介封裝,這樣你就可以直接使用Unity推薦的C#進(jìn)行開發(fā)劫乱。
怎么用薄辅?
一般而言站楚,插件都是為了快速開發(fā)而整合的接口型模塊代碼搏嗡,一個陌生的插件到手上后,我們第一時間會先看它的測試場景樣例旧乞,這是熟悉新東西的捷徑磅氨,“Talk is cheap,show me the code."
當(dāng)然官方在項目的ReadMe文檔中也有詳細(xì)的說明(英文)延赌,我整理了一下叉橱,大意如下:
【配置需求】:
Unity版本需要5.6.1P1以上(補丁版本),IOS需要升級到最新的IOS11(現(xiàn)在問題還比較多掐松,不建議日常使用粪小,開發(fā)者自備開發(fā)機),Xcode也需要升級到beta 9(已包含ARkit)量没,最后還有個硬件需求:手機必須iPhone6s以上(A9以上CPU)突想,iPad必須是2017年款的。
插件中已經(jīng)包含了四個測試場景(最新版本袭灯,我fork了一份到我github上绑嘹,并同步了最新的代碼)。
插件的文件中姨丈,有兩個比較重要的代碼文件:ARSessionNative.mm和ARSessionNativeInterface.cs蟋恬,前者是Objective-C代碼,也是真正的ARkit SDK的接口代碼歼争,而后者則是膠水代碼沐绒,就是上面說的封裝原理,C#通過ARSessionNativeInterface.cs與IOS原生代碼進(jìn)行通訊乔遮。
接著介紹一些常用的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()
還有一些比較有用的委托(至于委托是什么蹋肮,我們上一篇已經(jīng)說過了,這里不贅述):
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的公有數(shù)據(jù)結(jié)構(gòu)巷蚪。
UnityARAnchorManager.cs這個腳本的用處是更新三維物件在追蹤時的錨點(錨就是定點濒翻,讓一個物體巋然不動的根本)啦膜,參閱GeneratePlanes.cs 這個腳本詳細(xì)了解具體的用法僧家。
UnityARBuildPostprocessor.cs是一個Editor腳本,打包IOS平臺時會調(diào)用八拱,核心的代碼如下,主要是做一些庫和文件添加操作:
string projPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
其他一些實用的組件:
UnityARCameraManager.cs清蚀,這個組件得放到一個Gameobject上爹谭,這樣才能通過ARkit來控制引用的攝像頭诺凡。(這個其實和其他的AR SDK是很類似的)践惑,主要用于初始化ARkit嘶卧,更新ARkit的位置、旋轉(zhuǎn)穷娱、投射矩陣等信息运沦。
ARVideo.cs 這個組件需要掛載到攝像機上,設(shè)置對應(yīng)的材質(zhì)用于傳輸數(shù)據(jù)到后備緩沖區(qū)嫁盲。
官方的說明就是以上這些了烈掠,當(dāng)然這個插件還在不斷迭代更新中,后續(xù)還會有更多的feature瘾蛋,是不是意猶未盡矫限?那就自己手動Clone下來研究一下唄。