ARKit從入門到精通三部曲之二

轉(zhuǎn)載文章:ARKit從入門到精通(2)-ARKit工作原理及流程介紹

1.1-寫在前面的話

1.2-ARKit與SceneKit的關(guān)系

1.3-ARKit工作原理

1.3.1-ARSCNView與ARSession

1.3.2-ARWorldTrackingSessionConfiguration與ARFrame

1.4-ARKit工作完整流程

1.1-寫在前面的話

初次接觸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.2-ARKit與SceneKit的關(guā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.3-ARKit工作原理

1.3.1-ARSCNView與ARSession

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

1.4-ARKit工作完整流程

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容