1. 程式人生 > >微信公眾號牌九棋牌開發ARKit初體驗

微信公眾號牌九棋牌開發ARKit初體驗

了解 背景 支持 src nsh soft 並且 world 而是

微信公眾號牌九棋牌開發(aqiulian.com)咨詢更多ARKit聯系QQ:212303635

1.1-寫在前面的話

  • 初次接觸ARKit,很多人會為其復雜的架構關系而感到畏懼。這裏筆者將以最基礎簡介的方式帶領一下一睹蘋果原生AR(虛擬增強現實)的風采

  • ARKit並不是一個獨立就能夠運行的框架,而是必須要SceneKit一起用才可以,換一句話說,如果只有<ARKit>,而沒有<SceneKit>,那麽ARKit和一般的相機沒有任何區別

  • 由於筆者從事多年的iOS應用開發,並沒有從事過3D遊戲的開發(只是業余愛好寫了一個3D打飛機的遊戲),所以在本篇介紹ARKit的過程中,我們將以最小的篇幅來介紹

    SceneKit,畢竟如果沒有豐富的3D遊戲開發經驗,那麽光是相機捕捉到的2D界面如果轉化為3D世界的矩陣都非常難以理解

    • 關於3D系統X/Y/Z,與4x4矩陣等之間的轉換及關系,不會過多深入,筆者將保證每一個不懂3D遊戲開發的人都可以學習如何使用ARKit
    • 筆者認為:ARKit最難的部分在於3D坐標的矩陣轉換
  • 筆者介紹ARKit的流程大概如下

    • 1.介紹ARKit的工作原理及流程(本篇)
    • 2.通過對ARKit的原理及流程的了解,我們自定義實現ARKit
    • 3.介紹ARKit框架中的所有API,PS:是翻譯官方整個ARKit框架中所有的API………………~
    • 4.介紹ARKit框架中幾個重量級的類ARScnView
      ,ARSession,ARCamera
    • 5.ARKit實現捕捉現實世界中的平地,並將虛擬物體添加到平地中
    • 6.ARKit實現讓虛擬物體跟隨相機移動
      • 筆者沒有單獨的3D模型,這裏主要以蘋果官方給出的參考3D模型(飛機)來實現
    • 7.ARKit實現讓虛擬物體圍繞攝像機(拿著iPhone的人)旋轉

1.2-ARKit與SceneKit的關系

  • 1.在上一小節中介紹過,AR技術叫做虛擬增強現實,也就是在相機捕捉到的現實世界的圖像中顯示一個虛擬的3D模型。這一過程可以分為兩個步驟:

    • 一:相機捕捉現實世界圖像
      • ARKit來實現
    • 二:在圖像中顯示虛擬3D模型
      • SceneKit來實現
  • 2.下圖是一個<ARKit><SceneKit>框架關系圖,通過下圖可以看出

    • 繼承:子類擁有父類所有的屬性及方法

    • 1.<ARKit>框架中中顯示3D虛擬增強現實的視圖ARSCNView繼承於<SceneKit>框架中的SCNView,而SCNView又繼承於<UIKit>框架中的UIView

      • UIView的作用是將視圖顯示在iOS設備的window中,SCNView的作用是顯示一個3D場景,ARScnView的作用也是顯示一個3D場景,只不過這個3D場景是由攝像頭捕捉到的現實世界圖像構成的
    • 2.ARSCNView只是一個視圖容器,它的作用是管理一個ARSession,筆者稱之為AR會話。
      • ARSession的作用及原理將在本篇下一小節介紹
    • 3.在一個完整的虛擬增強現實體驗中,<ARKit>框架只負責將真實世界畫面轉變為一個3D場景,這一個轉變的過程主要分為兩個環節:由ARCamera負責捕捉攝像頭畫面,由ARSession負責搭建3D場景。
    • 4.在一個完整的虛擬增強現實體驗中,將虛擬物體現實在3D場景中是由<SceneKit>框架來完成中:每一個虛擬的物體都是一個節點SCNNode,每一個節點構成了一個場景SCNScene,無數個場景構成了3D世界
    • 5.綜上所述,ARKit捕捉3D現實世界使用的是自身的功能,這個功能是在iOS11新增的。而ARKit在3D現實場景中添加虛擬物體使用的是父類SCNView的功能,這個功能早在iOS8時就已經添加(SceneKit是iOS8新增)
      • 今後在介紹使用ARSCNView時將不再累述這一關系,可以簡單的理解為:ARSCNView所有跟場景和虛擬物體相關的屬性及方法都是自己父類SCNView
技術分享圖片
0301.png

1.3-ARKit工作原理

1.3.1-ARSCNView與ARSession

  • 1.ARKit提供兩種虛擬增強現實視圖,他們分別是3D效果的ARSCNView和2D效果的ARSKView(關於3D效果和2D效果區別以及在上一小節介紹),無論是使用哪一個視圖都是用了相機圖像作為背景視圖(這裏可以參考iOS自定義相機中的預覽圖層),而這一個相機的圖像就是由<ARKit>框架中的相機類ARCamera來捕捉的。

  • 2.ARSCNViewARCamera兩者之間並沒有直接的關系,它們之間是通過AR會話,也就是ARKit框架中非常重量級的一個類ARSession來搭建溝通橋梁的

    • 在iOS框架中,凡是帶session或者context後綴的,這種類一般自己不幹活,作用一般都是兩個:1.管理其他類,幫助他們搭建溝通橋梁,好處就是解耦 2.負責幫助我們管理復雜環境下的內存
      • context與session不同之處是:一般與硬件打交道,例如攝像頭捕捉ARSession,網卡的調用NSURLSession等使用的都是session後綴。沒有硬件參與,一般用context,如繪圖上下文,自定義轉場上下文等
  • 3.要想運行一個ARSession會話,你必須要指定一個稱之為會話追蹤配置的對象:ARSessionConfiguration,ARSessionConfiguration的主要目的就是負責追蹤相機在3D世界中的位置以及一些特征場景的捕捉(例如平面捕捉),這個類本身比較簡單卻作用巨大

    • ARSessionConfiguration是一個父類,為了更好的看到增強現實的效果,蘋果官方建議我們使用它的子類ARWorldTrackingSessionConfiguration,該類只支持A9芯片之後的機型,也就是iPhone6s之後的機型
技術分享圖片
0302.png

1.3.2-ARWorldTrackingSessionConfiguration與ARFrame

  • 1.ARSession搭建溝通橋梁的參與者主要有兩個ARWorldTrackingSessionConfigurationARFrame

  • 2.ARWorldTrackingSessionConfiguration(會話追蹤配置)的作用是跟蹤設備的方向和位置,以及檢測設備攝像頭看到的現實世界的表面。它的內部實現了一系列非常龐大的算法計算以及調用了你的iPhone必要的傳感器來檢測手機的移動及旋轉甚至是翻滾

    • 我們無需關心內部實現,ARKit框架幫助我們封裝的非常完美,只需調用一兩個屬性即可
  • 3.當ARWorldTrackingSessionConfiguration計算出相機在3D世界中的位置時,它本身並不持有這個位置數據,而是將其計算出的位置數據交給ARSession去管理(與前面說的session管理內存相呼應),而相機的位置數據對應的類就是ARFrame

    • ARSession類一個屬性叫做currentFrame,維護的就是ARFrame這個對象
  • 4.ARCamera只負責捕捉圖像,不參與數據的處理。它屬於3D場景中的一個環節,每一個3D Scene都會有一個Camera,它覺得了我們看物體的視野

  • 它們三者之間的關系看起來如下圖:

技術分享圖片
0303.png
  • ARCamera在3D世界的位置看起來是這樣的
技術分享圖片
0304.png

1.4-ARKit工作完整流程

  • ARKit框架工作流程可以參考下圖:
    • 1.ARSCNView加載場景SCNScene
    • 2.SCNScene啟動相機ARCamera開始捕捉場景
    • 3.捕捉場景後ARSCNView開始將場景數據交給Session
    • 4.Session通過管理ARSessionConfiguration實現場景的追蹤並且返回一個ARFrame
    • 5.給ARSCNView的scene添加一個子節點(3D物體模型)
      • ARSessionConfiguration捕捉相機3D位置的意義就在於能夠在添加3D物體模型的時候計算出3D物體模型相對於相機的真實的矩陣位置
        • 在3D坐標系統中,有一個世界坐標系和一個本地坐標系。類似於UIView的Frame和Bounds的區別,這種坐標之間的轉換可以說是ARKit中最難的部分
技術分享圖片

微信公眾號牌九棋牌開發ARKit初體驗