前言
前面一節(jié)學(xué)習(xí)ARKit(一)簡(jiǎn)單的介紹了AR與ARKit的相關(guān)概念,下面將深入到ARKit中來(lái)了解一下ARKit的工作原理與流程。
在介紹ARKit之前,先了解一下SpriteKit和SceneKit。
SpriteKit
SpriteKit——使用優(yōu)化的動(dòng)畫系統(tǒng),物理模擬和事件處理支持創(chuàng)建基于2D游戲。
SpriteKit是一種圖形渲染和動(dòng)畫的框架,你可以使用它將任意紋理圖像動(dòng)畫化。 SpriteKit提供了一個(gè)傳統(tǒng)的渲染循環(huán),可以在確定內(nèi)容和渲染幀之間進(jìn)行交替。你可以決定框架的內(nèi)容以及這些內(nèi)容如何更改。 SpriteKit會(huì)使用圖形硬件有效地渲染該框架。 SpriteKit針對(duì)你的內(nèi)容使用任意動(dòng)畫或更改內(nèi)容進(jìn)行了優(yōu)化。這種設(shè)計(jì)使SpriteKit更適合需要靈活處理動(dòng)畫的游戲和應(yīng)用程序。
SceneKit
SceneKit——使用高級(jí)場(chǎng)景描述創(chuàng)建3D游戲并向應(yīng)用添加3D內(nèi)容。輕松地添加動(dòng)畫、物理模擬、粒子效果和逼真的物理渲染。
SceneKit將高性能渲染引擎與用于導(dǎo)入、處理和渲染3D素材的描述性API相結(jié)合。與Metal和OpenGL的低級(jí)API不同,他們需要你精確地實(shí)現(xiàn)顯示場(chǎng)景的渲染算法,而SceneKit只需要描述場(chǎng)景內(nèi)容以及你希望執(zhí)行的動(dòng)作或動(dòng)畫即可。
兩者特點(diǎn)
SpriteKit使用主機(jī)設(shè)備提供的圖形硬件來(lái)高幀速率合成2D圖片,同時(shí)還支持很多不同的內(nèi)容,比如文本、視頻等。SpriteKit支持豐富的渲染結(jié)構(gòu)并接管了所有向OpenGL發(fā)出繪畫指令的的底層工作,所以你可以將你的重心放在解決高層次的設(shè)計(jì)問(wèn)題以及偉大的游戲交互設(shè)計(jì)上。
SceneKit是用來(lái)構(gòu)建3D場(chǎng)景的框架,且可以與Core Animation和SpriteKit無(wú)縫交互。在SceneKit中可以直接引入COLLADA行業(yè)標(biāo)準(zhǔn)文件制作好的3D模型或場(chǎng)景。與SpriteKit一樣,SceneKit通過(guò)場(chǎng)景來(lái)顯示物體,場(chǎng)景包含在SCNView。場(chǎng)景內(nèi)同樣是以節(jié)點(diǎn)的結(jié)構(gòu)來(lái)呈現(xiàn)物體。
ARKit框架
ARKit框架提供了兩種AR技術(shù),一種是基于3D場(chǎng)景(SceneKit)實(shí)現(xiàn)的增強(qiáng)現(xiàn)實(shí),一種是基于2D場(chǎng)景(SpriktKit)實(shí)現(xiàn)的增強(qiáng)現(xiàn)實(shí)。
我們主要介紹一下3D場(chǎng)景的AR的框架與實(shí)現(xiàn)。
通俗的講,AR就是我們攝像頭捕捉到現(xiàn)實(shí)世界中的圖像后,在圖像上顯示虛擬的3D模型,這就是最簡(jiǎn)單的增強(qiáng)現(xiàn)實(shí)。其過(guò)程就是上面的兩步:
- 攝像頭捕捉現(xiàn)實(shí)世界的圖像(ARKit實(shí)現(xiàn))
- 在圖像上現(xiàn)實(shí)虛擬的3D模型(SceneKit實(shí)現(xiàn))
下面展示一下ARKit框架關(guān)系圖(摘自ARKit從入門到精通(2)-ARKit工作原理及流程介紹)

注釋:
圖中我們可以看到,ARKit是通過(guò)ARScnView來(lái)展示3D場(chǎng)景的,這個(gè)3D場(chǎng)景是攝像頭通過(guò)拍攝將現(xiàn)實(shí)世界的圖像與虛擬的3D模型結(jié)合所構(gòu)成的。ARScnView繼承自SceneKit中的SCNView,而SCNView則繼承自我們非常熟悉的UIView。
在AR中,ARKit負(fù)責(zé)將現(xiàn)實(shí)世界轉(zhuǎn)換成3D場(chǎng)景,而SceneKit則是在3D場(chǎng)景中添加自己的場(chǎng)景與虛擬3D模型。
ARKit的工作原理
在上圖中,我們可以看到ARKit中比較重要的幾個(gè)類:ARSCNView、ARSession、ARCamera,此外還有ARConfiguration、ARFrame等。
- ARCamera是通過(guò)相機(jī)來(lái)捕捉真實(shí)世界的圖像,ARScnView則是展示將相機(jī)捕捉的畫面作為3D場(chǎng)景,它們兩個(gè)之前是通過(guò)ARSession來(lái)建立聯(lián)系的。
- ARSession與iOS中其他的session一樣,就是會(huì)話的意思。創(chuàng)建一個(gè)AR的場(chǎng)景,首先要?jiǎng)?chuàng)建一個(gè)AR會(huì)話。一個(gè)ARSession對(duì)象協(xié)調(diào)ARKit來(lái)代表執(zhí)行的主要過(guò)程,這些過(guò)程包括從設(shè)備的運(yùn)動(dòng)感測(cè)硬件讀取數(shù)據(jù),控制設(shè)備的內(nèi)置相機(jī),以及對(duì)捕獲的相機(jī)圖像執(zhí)行圖像分析。會(huì)話綜合了所有這些結(jié)果,以建立設(shè)備所在的真實(shí)世界空間與模擬AR內(nèi)容的虛擬空間之間的對(duì)應(yīng)關(guān)系。
- 運(yùn)行會(huì)話需要會(huì)話配置:ARConfiguration類的實(shí)例或其子類。
這些類確定ARKit如何跟蹤設(shè)備相對(duì)于現(xiàn)實(shí)世界的位置和運(yùn)動(dòng),從而影響您可以創(chuàng)建的AR體驗(yàn)的種類。
ARConfiguration的子類主要有以下三種:
ARWorldTrackingConfiguration:提供高品質(zhì)的AR體驗(yàn),使用后置攝像頭精確跟蹤設(shè)備的位置和方向,并允許平面檢測(cè)和點(diǎn)擊測(cè)試。
AROrientationTrackingConfiguration:提供使用后置攝像頭并僅跟蹤設(shè)備方向的基本AR體驗(yàn)。
ARFaceTrackingConfiguration:提供使用前置攝像頭并跟蹤用戶臉部的移動(dòng)和表情的AR體驗(yàn)。 - ARFrame作為ARSession的一部分用來(lái)捕獲視頻圖像和位置跟蹤信息。ARCamera會(huì)連續(xù)地捕獲視頻幀,傳到ARSession。對(duì)于每一幀,ARKit將圖像與設(shè)備運(yùn)動(dòng)感應(yīng)硬件所得的數(shù)據(jù)(數(shù)據(jù)由ARConfiguration中封裝了復(fù)雜的算法來(lái)計(jì)算得出的)一起進(jìn)行分析,以估計(jì)設(shè)備在現(xiàn)實(shí)世界的位置。ARKit傳輸跟蹤信息和圖像參數(shù)就是以ARFrame為對(duì)象來(lái)傳輸?shù)摹?/li>
大概的工作流程是這樣的:
- 打開(kāi)應(yīng)用,開(kāi)啟攝像頭,通過(guò)ARSCNView來(lái)加載AR 3D場(chǎng)景SCNScene
- SCNScene通過(guò)ARCamera捕捉場(chǎng)景
- 捕捉場(chǎng)景后,ARCamera會(huì)將視頻幀傳到ARSession,然后再傳到ARSCNView展示場(chǎng)景。
- ARSCNView將場(chǎng)景數(shù)據(jù)交給ARSession。
- ARSession通過(guò)管理ARConfiguration實(shí)現(xiàn)場(chǎng)景的追蹤并返回一個(gè)ARFrame。
- 再ARSCNView的場(chǎng)景中添加3D模型(即ARSCNNode)
ARConfiguration捕捉相機(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)換可以說(shuō)是ARKit中最難的部分。
流程圖如下:(摘自ARKit從入門到精通(2)-ARKit工作原理及流程介紹)

下一節(jié)學(xué)習(xí)ARKit(三)