轉(zhuǎn)載文章:ARKit從入門到精通(2)-ARKit工作原理及流程介紹
1.3.2-ARWorldTrackingSessionConfiguration與ARFrame
初次接觸ARKit,很多人會(huì)為其復(fù)雜的架構(gòu)關(guān)系而感到畏懼。這里筆者將以最基礎(chǔ)簡介的方式帶領(lǐng)一下一睹蘋果原生AR(虛擬增強(qiáng)現(xiàn)實(shí))的風(fēng)采
ARKit并不是一個(gè)獨(dú)立就能夠運(yùn)行的框架,而是必須要SceneKit一起用才可以,換一句話說,如果只有,而沒有,那么ARKit和一般的相機(jī)沒有任何區(qū)別
由于筆者從事多年的iOS應(yīng)用開發(fā),并沒有從事過3D游戲的開發(fā)(只是業(yè)余愛好寫了一個(gè)3D打飛機(jī)的游戲),所以在本篇介紹ARKit的過程中,我們將以最小的篇幅來介紹SceneKit,畢竟如果沒有豐富的3D游戲開發(fā)經(jīng)驗(yàn),那么光是相機(jī)捕捉到的2D界面如果轉(zhuǎn)化為3D世界的矩陣都非常難以理解
關(guān)于3D系統(tǒng)X/Y/Z,與4x4矩陣等之間的轉(zhuǎn)換及關(guān)系,不會(huì)過多深入,筆者將保證每一個(gè)不懂3D游戲開發(fā)的人都可以學(xué)習(xí)如何使用ARKit
筆者認(rèn)為:ARKit最難的部分在于3D坐標(biāo)的矩陣轉(zhuǎn)換
筆者介紹ARKit的流程大概如下
1.介紹ARKit的工作原理及流程(本篇)
2.通過對(duì)ARKit的原理及流程的了解,我們自定義實(shí)現(xiàn)ARKit
3.介紹ARKit框架中的所有API,PS:是翻譯官方整個(gè)ARKit框架中所有的API………………~
4.介紹ARKit框架中幾個(gè)重量級(jí)的類ARScnView,ARSession,ARCamera
5.ARKit實(shí)現(xiàn)捕捉現(xiàn)實(shí)世界中的平地,并將虛擬物體添加到平地中
6.ARKit實(shí)現(xiàn)讓虛擬物體跟隨相機(jī)移動(dòng)
筆者沒有單獨(dú)的3D模型,這里主要以蘋果官方給出的參考3D模型(飛機(jī))來實(shí)現(xiàn)
7.ARKit實(shí)現(xiàn)讓虛擬物體圍繞攝像機(jī)(拿著iPhone的人)旋轉(zhuǎn)
1.在上一小節(jié)中介紹過,AR技術(shù)叫做虛擬增強(qiáng)現(xiàn)實(shí),也就是在相機(jī)捕捉到的現(xiàn)實(shí)世界的圖像中顯示一個(gè)虛擬的3D模型。這一過程可以分為兩個(gè)步驟:
一:相機(jī)捕捉現(xiàn)實(shí)世界圖像
由ARKit來實(shí)現(xiàn)
二:在圖像中顯示虛擬3D模型
由SceneKit來實(shí)現(xiàn)
2.下圖是一個(gè)與框架關(guān)系圖,通過下圖可以看出
繼承:子類擁有父類所有的屬性及方法
1.框架中中顯示3D虛擬增強(qiáng)現(xiàn)實(shí)的視圖ARSCNView繼承于框架中的SCNView,而SCNView又繼承于框架中的UIView
UIView的作用是將視圖顯示在iOS設(shè)備的window中,SCNView的作用是顯示一個(gè)3D場景,ARScnView的作用也是顯示一個(gè)3D場景,只不過這個(gè)3D場景是由攝像頭捕捉到的現(xiàn)實(shí)世界圖像構(gòu)成的
2.ARSCNView只是一個(gè)視圖容器,它的作用是管理一個(gè)ARSession,筆者稱之為AR會(huì)話。
ARSession的作用及原理將在本篇下一小節(jié)介紹
3.在一個(gè)完整的虛擬增強(qiáng)現(xiàn)實(shí)體驗(yàn)中,框架只負(fù)責(zé)將真實(shí)世界畫面轉(zhuǎn)變?yōu)橐粋€(gè)3D場景,這一個(gè)轉(zhuǎn)變的過程主要分為兩個(gè)環(huán)節(jié):由ARCamera負(fù)責(zé)捕捉攝像頭畫面,由ARSession負(fù)責(zé)搭建3D場景。
4.在一個(gè)完整的虛擬增強(qiáng)現(xiàn)實(shí)體驗(yàn)中,將虛擬物體現(xiàn)實(shí)在3D場景中是由框架來完成中:每一個(gè)虛擬的物體都是一個(gè)節(jié)點(diǎn)SCNNode,每一個(gè)節(jié)點(diǎn)構(gòu)成了一個(gè)場景SCNScene,無數(shù)個(gè)場景構(gòu)成了3D世界
5.綜上所述,ARKit捕捉3D現(xiàn)實(shí)世界使用的是自身的功能,這個(gè)功能是在iOS11新增的。而ARKit在3D現(xiàn)實(shí)場景中添加虛擬物體使用的是父類SCNView的功能,這個(gè)功能早在iOS8時(shí)就已經(jīng)添加(SceneKit是iOS8新增)
今后在介紹使用ARSCNView時(shí)將不再累述這一關(guān)系,可以簡單的理解為:ARSCNView所有跟場景和虛擬物體相關(guān)的屬性及方法都是自己父類SCNView的
0301.png
1.ARKit提供兩種虛擬增強(qiáng)現(xiàn)實(shí)視圖,他們分別是3D效果的ARSCNView和2D效果的ARSKView(關(guān)于3D效果和2D效果區(qū)別以及在上一小節(jié)介紹),無論是使用哪一個(gè)視圖都是用了相機(jī)圖像作為背景視圖(這里可以參考iOS自定義相機(jī)中的預(yù)覽圖層),而這一個(gè)相機(jī)的圖像就是由框架中的相機(jī)類ARCamera來捕捉的。
2.ARSCNView與ARCamera兩者之間并沒有直接的關(guān)系,它們之間是通過AR會(huì)話,也就是ARKit框架中非常重量級(jí)的一個(gè)類ARSession來搭建溝通橋梁的
在iOS框架中,凡是帶session或者context后綴的,這種類一般自己不干活,作用一般都是兩個(gè):1.管理其他類,幫助他們搭建溝通橋梁,好處就是解耦 2.負(fù)責(zé)幫助我們管理復(fù)雜環(huán)境下的內(nèi)存
context與session不同之處是:一般與硬件打交道,例如攝像頭捕捉ARSession,網(wǎng)卡的調(diào)用NSURLSession等使用的都是session后綴。沒有硬件參與,一般用context,如繪圖上下文,自定義轉(zhuǎn)場上下文等
3.要想運(yùn)行一個(gè)ARSession會(huì)話,你必須要指定一個(gè)稱之為會(huì)話追蹤配置的對(duì)象:ARSessionConfiguration,ARSessionConfiguration的主要目的就是負(fù)責(zé)追蹤相機(jī)在3D世界中的位置以及一些特征場景的捕捉(例如平面捕捉),這個(gè)類本身比較簡單卻作用巨大
ARSessionConfiguration是一個(gè)父類,為了更好的看到增強(qiáng)現(xiàn)實(shí)的效果,蘋果官方建議我們使用它的子類ARWorldTrackingSessionConfiguration,該類只支持A9芯片之后的機(jī)型,也就是iPhone6s之后的機(jī)型
0302.png
1.3.2-ARWorldTrackingSessionConfiguration與ARFrame
1.ARSession搭建溝通橋梁的參與者主要有兩個(gè)ARWorldTrackingSessionConfiguration與ARFrame
2.ARWorldTrackingSessionConfiguration(會(huì)話追蹤配置)的作用是跟蹤設(shè)備的方向和位置,以及檢測設(shè)備攝像頭看到的現(xiàn)實(shí)世界的表面。它的內(nèi)部實(shí)現(xiàn)了一系列非常龐大的算法計(jì)算以及調(diào)用了你的iPhone必要的傳感器來檢測手機(jī)的移動(dòng)及旋轉(zhuǎn)甚至是翻滾
我們無需關(guān)心內(nèi)部實(shí)現(xiàn),ARKit框架幫助我們封裝的非常完美,只需調(diào)用一兩個(gè)屬性即可
3.當(dāng)ARWorldTrackingSessionConfiguration計(jì)算出相機(jī)在3D世界中的位置時(shí),它本身并不持有這個(gè)位置數(shù)據(jù),而是將其計(jì)算出的位置數(shù)據(jù)交給ARSession去管理(與前面說的session管理內(nèi)存相呼應(yīng)),而相機(jī)的位置數(shù)據(jù)對(duì)應(yīng)的類就是ARFrame
ARSession類一個(gè)屬性叫做currentFrame,維護(hù)的就是ARFrame這個(gè)對(duì)象
4.ARCamera只負(fù)責(zé)捕捉圖像,不參與數(shù)據(jù)的處理。它屬于3D場景中的一個(gè)環(huán)節(jié),每一個(gè)3D Scene都會(huì)有一個(gè)Camera,它覺得了我們看物體的視野
它們?nèi)咧g的關(guān)系看起來如下圖:
0303.png
ARCamera在3D世界的位置看起來是這樣的
0304.png
ARKit框架工作流程可以參考下圖:
1.ARSCNView加載場景SCNScene
2.SCNScene啟動(dòng)相機(jī)ARCamera開始捕捉場景
3.捕捉場景后ARSCNView開始將場景數(shù)據(jù)交給Session
4.Session通過管理ARSessionConfiguration實(shí)現(xiàn)場景的追蹤并且返回一個(gè)ARFrame
5.給ARSCNView的scene添加一個(gè)子節(jié)點(diǎn)(3D物體模型)
ARSessionConfiguration捕捉相機(jī)3D位置的意義就在于能夠在添加3D物體模型的時(shí)候計(jì)算出3D物體模型相對(duì)于相機(jī)的真實(shí)的矩陣位置
在3D坐標(biāo)系統(tǒng)中,有一個(gè)世界坐標(biāo)系和一個(gè)本地坐標(biāo)系。類似于UIView的Frame和Bounds的區(qū)別,這種坐標(biāo)之間的轉(zhuǎn)換可以說是ARKit中最難的部分
0305.png