ARkit技術及整體API框架簡介

一、AR簡介:

     增強現(xiàn)實技術(Augmented Reality,簡稱 AR),是一種實時地計算攝影機影像的位置及角度并加上相應圖像、視頻、3D模型的技術,這種技術的目標是在屏幕上把虛擬世界套在現(xiàn)實世界并進行互動. 
    一個最簡單地AR場景實現(xiàn)所需要的技術以及步驟包含如下:
  1. 多媒體捕捉現(xiàn)實圖像:如攝像頭
  2. 三維建模:3D立體模型
  3. 傳感器追蹤:主要追蹤現(xiàn)實世界動態(tài)物體的六軸變化,這六軸分別是X、Y、Z軸位移及旋轉。其中位移三軸決定物體的方位和大小,旋轉三周決定物體顯示的區(qū)域。
  4. 坐標識別及轉換:3D模型顯示在現(xiàn)實圖像中不是單純的frame坐標點,而是一個三維的矩陣坐標。這基本上也是學習AR最難的部分,好在ARKit幫助我們大大簡化了這一過程。
  5. 除此之外,AR還可以與虛擬物體進行一些交互。

二、 ARKit概述及特點介紹:

  1. ARKit是2017年6月6日,蘋果發(fā)布iOS11系統(tǒng)所新增框架,它能夠幫助我們以最簡單快捷的方式實現(xiàn)AR技術功能。
  2. ARKit框架提供了兩種AR技術:
  3. 基于3D場景(SceneKit)實現(xiàn)的增強現(xiàn)實,
  4. 基于2D場景(SpriktKit)實現(xiàn)的增強現(xiàn)實
  5. AR效果必須要依賴于蘋果的游戲引擎框架(3D引擎SceneKit,2D引擎SpriktKit),主要原因是游戲引擎才可以加載物體模型。
  6. 雖然ARKit框架中視圖對象繼承于UIView,但是由于目前ARKit框架本身只包含相機追蹤,不能直接加載物體模型,所以只能依賴于游戲引擎加載ARKit

開發(fā)環(huán)境:

  1. Xcode版本:Xcode9及以上
  2. iOS系統(tǒng):iOS11及以上
  3. iOS設備要求:處理器A9及以上(iPhone6s 、iPhone6sPlus、iPhone7 iPhone7Plus、iPhoneSE、iPad Pro(9.7、10.5、12.9)、iPad(2017))
  4. MacOS系統(tǒng):10.12.4及以上 (安裝Xcode9對Mac系統(tǒng)版本有要求)

三、ARKit框架簡介:

    ARKit并不是一個獨立就能夠運行的框架,而是必須要SceneKit一起用才可以,換一句話說,如果只有ARKit,而沒有SceneKit,那么ARKit和一般的相機沒有任何區(qū)別。
    相機捕捉現(xiàn)實世界圖像,由ARKit來實現(xiàn);在圖像中顯示虛擬3D模型,由SceneKit來實現(xiàn)。
    繼承關系:ARKit框架中中顯示3D虛擬增強現(xiàn)實的視圖ARSCNView繼承于SceneKit框架中的SCNView,而SCNView又繼承于UIKit框架中的UIView; 
    UIView的作用是將視圖顯示在iOS設備的window中,SCNView的作用是顯示一個3D場景,ARScnView的作用也是顯示一個3D場景,只不過這個3D場景是由攝像頭捕捉到的現(xiàn)實世界圖像構成
    ARSCNView只是一個視圖容器,它的作用是管理一個ARSession
    在一個完整的虛擬增強現(xiàn)實體驗中,ARKit框架只負責將真實世界畫面轉變?yōu)橐粋€3D場景,這一個轉變的過程主要分為兩個環(huán)節(jié):由ARCamera負責捕捉攝像頭畫面,由ARSession負責搭建3D場景。
    ARKit在3D現(xiàn)實場景中添加虛擬物體使用的是父類SCNView的功能,這個功能早在iOS8時就已經(jīng)添加(SceneKit是iOS8新增),ARSCNView所有跟場景和虛擬物體相關的屬性及方法都是自己父類SCNView的。

四、ARKit工作原理及工作流程

     ARKit提供兩種虛擬增強現(xiàn)實視圖,他們分別是3D效果的ARSCNView和2D效果的ARSKView。無論是使用哪一個視圖都是用了相機圖像作為背景視圖,而這一個相機的圖像就是由<ARKit>框架中的相機類ARCamera來捕捉的。
     ARSCNView與ARCamera兩者之間并沒有直接的關系,它們之間是通過AR會話,也就是ARKit框架中非常重量級的一個類ARSession來搭建溝通橋梁的。
    要想運行一個ARSession會話,你必須要指定一個稱之為ARSessionConfiguration(會話追蹤配置)的對象,ARSessionConfiguration的主要目的就是負責追蹤相機在3D世界中的位置以及一些特征場景的捕捉(例如平面捕捉)。
     ARSessionConfiguration是一個父類,為了更好的看到增強現(xiàn)實的效果,蘋果官方建議我們使用它的子類ARWorldTrackingSessionConfiguration,該類只支持A9芯片之后的機型,也就是iPhone6s之后的機型。
     ARSession搭建溝通橋梁的參與者主要有兩個ARWorldTrackingSessionConfiguration與ARFrame。

     ARWorldTrackingSessionConfiguration(會話追蹤配置)的作用是跟蹤設備的方向和位置,以及檢測設備攝像頭看到的現(xiàn)實世界的表面。它的內部實現(xiàn)了一系列非常龐大的算法計算以及調用了你的iPhone必要的傳感器來檢測手機的移動及旋轉甚至是翻滾。
     當ARWorldTrackingSessionConfiguration計算出相機在3D世界中的位置時,它本身并不持有這個位置數(shù)據(jù),而是將其計算出的位置數(shù)據(jù)交給ARSession去管理,而相機的位置數(shù)據(jù)對應的類就是ARFrame。

     ARSession類一個屬性叫做currentFrame,維護的就是ARFrame這個對象。
     ARCamera只負責捕捉圖像,不參與數(shù)據(jù)的處理。它屬于3D場景中的一個環(huán)節(jié),每一個3D Scene都會有一個Camera,它覺得了我們看物體的視野。

ARKit框架工作流程:

  1. ARSCNView加載場景SCNScene

  2. SCNScene啟動相機ARCamera開始捕捉場景

  3. 捕捉場景后ARSCNView開始將場景數(shù)據(jù)交給Session

  4. Session通過管理ARSessionConfiguration實現(xiàn)場景的追蹤并且返回一個ARFrame

  5. 給ARSCNView的scene添加一個子節(jié)點(3D物體模型)

      ARSessionConfiguration捕捉相機3D位置的意義就在于能夠在添加3D物體模型的時候計算出3D物體模型相對于相機的真實的矩陣位置,在3D坐標系統(tǒng)中,有一個世界坐標系和一個本地坐標系。類似于UIView的Frame和Bounds的區(qū)別。
    

五、ARKit全框架API類圖介紹:

<ARKit>框架中所有的API

5.1、ARAnchor
    ARAnchor表示一個物體在3D空間的位置和方向(ARAnchor通常稱為物體的3D錨點,有點像UIKit框架中CALayer的Anchor), ARFrame表示的也是物體的位置和方向,但是ARFrame通常表示的是AR相機的位置和方向以及追蹤相機的時間,還可以捕捉相機的幀圖片。也就是說ARFrame用于捕捉相機的移動,其他虛擬物體用ARAnchor
5.2、ARCamera
    ARCamera是一個相機,它是連接虛擬場景與現(xiàn)實場景之間的樞紐。在ARKit中,它是捕捉現(xiàn)實圖像的相機,在SceneKit中它又是3D虛擬世界中的相機。
    一般我們無需去創(chuàng)建一個相機,因為當我們初始化一個AR試圖時,他會為我們默認創(chuàng)建一個相機,而且這個相機就是攝像頭的位置,同時也是3D世界中的原點所在(x=0,y=0,z=0)
5.3、ARError
    ARError是一個描述ARKit錯誤的類,這個錯誤來源于幾個方面,例如設備不支持,或者當相機常駐后臺時ARSession會斷開等問題
5.4、ARFrame
    ARFrame主要是追蹤相機當前的狀態(tài),這個狀態(tài)不僅僅只是位置,還有圖像幀及時間等參數(shù)
5.5、ARHitTestResult
    ARHitTestResult:點擊回調結果,這個類主要用于虛擬增強現(xiàn)實技術(AR技術)中現(xiàn)實世界與3D場景中虛擬物體的交互。 比如我們在相機中移動。拖拽3D虛擬物體,都可以通過這個類來獲取ARKit所捕捉的結果。
5.6、ARLightEstimate
   ARLightEstimate是一個燈光效果,它可以讓你的AR場景看起來更加的好
5.7、ARPlaneAnchor
    ARPlaneAnchor是ARAnchor的子類,筆者稱之為平地錨點。ARKit能夠自動識別平地,并且會默認添加一個錨點到場景中,當然要想看到真實世界中的平地效果,需要我們自己使用SCNNode來渲染這個錨點,錨點只是一個位置。
5.8、ARPointCloud
    ARPointCloud:點狀渲染云,主要用于渲染場景
5.9、 ARSCNView
    AR視圖, ARKit支持3D的AR場景和2D的AR場景,ARSCNView是3D的AR場景視圖,該類是整個ARKit框架中唯一兩個有代理的類其中之一。該類非常重要,且API較多,將在后續(xù)小節(jié)介紹
5.10、 ARSession
    ARSession是一個連接底層與AR視圖之間的橋梁,其實ARSCNView內部所有的代理方法都是由ARSession來提供的。

ARSession獲取相機位置數(shù)據(jù)主要有兩種方式

  1. push。 實時不斷的獲取相機位置,由ARSession主動告知用戶。通過實現(xiàn)ARSession的代理- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame來獲取
  2. pull。 用戶想要時,主動去獲取。ARSession的屬性currentFrame來獲取
5.11、ARSessionConfiguration
    ARSessionConfiguration會話追蹤配置,主要就是追蹤相機的配置。注意:該類還有一個子類:ARWorldTrackingSessionConfiguration,它們在同一個API文件中

追蹤對其方式,這個決定了參考坐標系(參照物)

typedef NS_ENUM(NSInteger, ARWorldAlignment) {
      /* 相機位置 vector (0, -1, 0) /
      ARWorldAlignmentGravity,
      /** 相機位置及方向. vector (0, -1, 0)    heading :(0, 0, -1) */
      ARWorldAlignmentGravityAndHeading,
      /** 相機方向. */
      ARWorldAlignmentCamera
} 
/平面檢測類型*/
typedef NS_OPTIONS(NSUInteger, ARPlaneDetection) {
    / 不檢測. */
    ARPlaneDetectionNone = 0,
    /** 平地檢測 */
    ARPlaneDetectionHorizontal  = (1 << 0),
} 

六、技術要點

6.1、技術要點
6.1、技術難點
  1. ARKit只能沒有圖片識別的功能的,或者他這能識別相機的平面,如果要實現(xiàn)圖片識別被動觸發(fā)arkit,需要用其他的frame(比如CoreML 的圖片識別的技術),于是Arkit跟CoreML,如何交互,是需要思考的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容