ARKit的理解與使用

AR概述
AR的意義:讓虛擬世界套與現實世界建立聯繫,並可以進行互動。
AR的技術實現:通過實時地計算攝影機輸出影像的位置及角度,並在內部通過算法識別將場景中的事物,然後在內部模擬的三維座標系中給識別到的事物建立座標,然後在特定的座標上添加相應的圖像、視頻、3D模型,最終通過手機屏幕合成一個AR效果圖展示給用戶。

建立一個AR場景的基本步驟爲:
1.AR相機打開攝像頭實時捕捉周圍的圖像,並傳遞到AR會話中。
2.AR會話通過算法識別這些圖像,再加上設置的ARWorldTrackingSessionConfiguration追蹤策略,然後使用周圍的環境和識別到的事物建立一個三維座標。
3.使用傳感器持續追蹤現實世界動態物體在三維座標中的變化。如X、Y、Z軸位移及旋轉,其中位移三軸決定物體的方位和大小,旋轉三週決定物體顯示的區域。
4.座標識別及轉換,系統最終需要把三維座標中的圖像轉換成二維的圖片在手機屏幕上展示:3D模型顯示在現實圖像中不是單純的frame座標點,而是一個三維的矩陣座標,這裏需要用到三維數學,如:向量,歐拉角,四元數等。
4.另外,AR還可以根據三維座標中事物的動態變化與虛擬物體進行一些交互。
 
ARKit概述及特點
1.ARKit是2017年6月6日,蘋果發佈iOS11系統所新增框架,它能夠幫助我們以最簡單快捷的方式實現AR技術功能。
2.ARKit框架提供了兩種AR技術,一種是基於3D場景(SceneKit)實現的增強現實,一種是基於2D場景(SpriktKit)實現的增強現實。
3.使用ARKit構建AR場景時,除了ARKit框架還需要依賴於蘋果的遊戲引擎框架(3D引擎SceneKit,2D引擎SpriktKit),ARKit不是一個獨立就能夠運行的框架,必須要SceneKit一起用纔可以創建AR場景。如果只有ARKit沒有SceneKit,那麼ARKit只是一個能夠輸出影像並實時計算攝像機在3D空間中的位置和角度的相機而已。
ARKit框架本身只包含相機追蹤,並不能加載3D模型爲場景中,這裏需要使用遊戲引擎的能力進行加載3D模型到三維座標中。
4.iOS端加載3d模型的方式有:蘋果ARKit框架,Unity3D,Mental,OpenGL。
 
ARKit工作原理
在相機捕捉到的現實世界的圖像中顯示一個虛擬的3D模型的步驟可以分爲兩步:
一:相機捕捉現實世界圖像
由ARKit來實現,通過ARKit中的ARCamera去捕捉攝像頭的畫面,構建3D場景。
二:在圖像中顯示虛擬3D模型
由SceneKit來實現,添加3D虛擬物體到由ARKit構建的3D場景中。
 
ARKit框架主要負責將真實世界畫面轉變爲一個3D場景。
這分爲兩個環節:1.由ARCamera負責捕捉攝像頭畫面,2.由ARSession通過圖像識別算法和ARWorldTrackingSessionConfiguration追蹤策略負責搭建3D場景。
SceneKit框架主要負責將虛擬物體顯示在3D場景中。每一個虛擬的物體都是一個節點SCNNode,多個節點共同構成了一個場景SCNScene,多個場景構成了3D世界。
 
ARScnView,ARSession,ARCamera的關係
ARKit提供兩種虛擬增強現實視圖,他們分別是3D效果的ARSCNView和2D效果的ARSKView,無論是使用哪一個視圖都是用了相機圖像作爲背景視圖,而這一個相機的圖像就是由ARKit框架中的相機類ARCamera來捕捉的。
ARSCNView與ARCamera兩者之間並沒有直接的關係,它們之間是通過AR會話ARSession來搭建溝通橋樑的。

 

要想運行一個ARSession會話,你必須要指定一個稱之爲會話追蹤配置的對象:ARSessionConfiguration,它的主要目的就是負責追蹤相機在3D世界中的位置以及一些特徵場景的捕捉(例如平面捕捉),這個類很重要。ARSessionConfiguration是一個父類,在開發中通常使用的是它的子類:ARWorldTrackingSessionConfiguration。
 
ARWorldTrackingSessionConfiguration的作用是跟蹤設備的方向和位置,以及檢測設備攝像頭看到的現實世界的表面。它的內部調用圖像識別算法並調用必要的傳感器來檢測手機的移動及旋轉甚至是翻滾。當ARWorldTrackingSessionConfiguration計算出相機在3D世界中的位置時,它本身並不持有這個位置數據,而是將其計算出的位置數據交給ARSession去管理,計算出的相機位置數據對應的類是ARFrame。
 
ARSession類一個屬性叫做currentFrame,維護的就是ARFrame這個對象。
 
ARCamera只負責捕捉圖像,不參與數據的處理。它屬於3D場景中的一個環節,每一個3D Scene都會有一個Camera,它決定了我們看物體的視野。

 

ARKit框架工作流程如下:
1.ARSCNView加載場景SCNScene。
2.SCNScene啓動相機ARCamera開始捕捉場景。
3.捕捉場景後ARSCNView開始將場景數據交給Session。
4.Session通過管理ARSessionConfiguration實現場景的追蹤並且返回一個ARFrame。
5.給ARSCNView的scene添加一個子節點(3D物體模型)。
ARSessionConfiguration捕捉相機3D位置的意義就在於能夠在添加3D物體模型的時候計算出3D物體模型相對於相機的真實的矩陣位置。
 
ARKit自定義實現主要邏輯
新建ARSCNViewController繼承自UIViewController, 添加相關屬性。
//AR容器視圖:展示3D界面,內部會自動創建screen場景和ARCarmer攝像頭
ARSCNView *arSCNView;
//AR會話:AR的開啓和關閉
ARSession *arSession;
//AR世界追蹤配置
ARConfiguration *arConfiguration;
創建流程
1.創建ARSession
_arSession = [ARSession new];
2.根據ARSession創建ARSCNView (AR容器視圖)
_arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
_arSCNView.session = self.arSession;
_arSCNView.automaticallyUpdatesLighting = YES;
3.創建ARConfiguration
ARWorldTrackingConfiguration *wtConfiguration = [ARWorldTrackingConfiguration new];
//平面追蹤
wtConfiguration.planeDetection = ARPlaneDetectionHorizontal;
//燈光自適應
wtConfiguration.lightEstimationEnabled = YES;
_arConfiguration = wtConfiguration;
 
使用方式
通過調用arSession的run方法啓動AR
[self.view addSubview:self.arSCNView];
//啓動AR會話,ARCarmer開始啓動
[self.arSession runWithConfiguration:self.arConfiguration];
 
ARKit的重要類
ARAnchor
ARAnchor表示一個物體在3D空間的位置和方向。
ARFrame主要是追蹤相機當前的狀態,表示的是AR相機的位置和方向以及追蹤相機的時間,還可以捕捉相機的幀圖片。
 
ARFrame
ARWorldTrackingSessionConfiguration通過調用圖像識別算法和調用手機傳感器,最終計算出相機在3D世界中的位置的某一個時刻的數據,就是一個ARFrame數據。
ARFrame中提供了一個座標探測方法。
- (NSArray<ARHitTestResult *> *)hitTest:(CGPoint)point types:(ARHitTestResultType)types;
這個方法的回調結果是一個ARHitTestResult類,這個類主要用於虛擬增強現實技術(AR技術)中現實世界與3D場景中虛擬物體的交互。 比如我們在相機中移動。拖拽3D虛擬物體,都可以通過這個類來獲取ARKit所捕捉的結果。
 
ARSession
ARSession是一個連接底層與AR視圖之間的橋樑,其實ARSCNView內部所有的代理方法都是由ARSession來提供的。
ARSession下面連接了ARCamera和ARWorldTrankingSessionConfiguration。用於從相機採集場景,從設備檢測相機的位置和朝向,最終構建出3D場景。
 
ARCamera
ARCamera是一個相機,它是連接虛擬場景與現實場景之間的樞紐。在ARKit中,它是捕捉現實圖像的相機,在SceneKit中它又是3D虛擬世界中的相機,它是我們看3D世界的眼睛。
一般我們無需去創建一個相機,因爲當我們初始化一個AR視圖時,他會爲我們默認創建一個相機,而且這個相機就是攝像頭的位置,同時也是3D世界中的原點所在(x=0,y=0,z=0)。
 
ARScnView
ARScnView是一個AR視圖容器,用於展示AR效果圖。
ARSCNView繼承於SceneKit框架中的SCNView,而SCNView又繼承於UIKit框架中的UIView。
 
SCNScence
SCNScene爲遊戲中的場景,它是遊戲元素(地圖,燈光,人物的遊戲元素)存在的地方,遊戲邏輯也是靠掛載在遊戲元素上面的腳本進行執行。
 
SCNNode
SCNNode節點,它是場景中游戲元素的抽象表示,一個大型的遊戲場景結構就是由無數個小的節點組成,它有自己的位置和自身座標系統,我們可以把幾何模型,燈光,攝像機的遊戲中的真實元素,吸附到SCNNode 節點上。
 
SCNAction
SCNAction 主要負責改變節點的屬性,比如我們要讓一個地球圍繞太陽旋轉,一個氣球從一個地方移動另外一個地方。
 
SCNGeometry
SCNGeometry 就是呈現三維模型的類,我們模型具體長什麼樣子,是個正方體還是長方體,都是它說了算。
 
SCNMaterial
SCNMaterial渲染器, 定義模型的外觀,好比一個球體,它渲染出來是紅色,還是綠色,會不會發光等.
 
 
 
Demo地址:
https://github.com/zhfei/ARBaseKnowledge 
 
參考文章:
https://www.jianshu.com/p/0492c7122d2f
https://toutiao.io/posts/1fxej0/preview
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章