微信公眾號牌九棋牌開發ARKit初體驗
微信公眾號牌九棋牌開發(aqiulian.com)咨詢更多ARKit聯系QQ:212303635
1.1-寫在前面的話
-
初次接觸
ARKit
,很多人會為其復雜的架構關系而感到畏懼。這裏筆者將以最基礎簡介的方式帶領一下一睹蘋果原生AR(虛擬增強現實)的風采 -
ARKit並不是一個獨立就能夠運行的框架,而是必須要SceneKit一起用才可以,換一句話說,如果只有
<ARKit>
,而沒有<SceneKit>
,那麽ARKit和一般的相機沒有任何區別 -
由於筆者從事多年的iOS應用開發,並沒有從事過3D遊戲的開發(只是業余愛好寫了一個3D打飛機的遊戲),所以在本篇介紹
ARKit的過程中,我們將以最小的篇幅來介紹
,畢竟如果沒有豐富的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.
ARSCNView
與ARCamera
兩者之間並沒有直接的關系,它們之間是通過AR會話,也就是ARKit框架中非常重量級的一個類ARSession
來搭建溝通橋梁的- 在iOS框架中,凡是帶session或者context後綴的,這種類一般自己不幹活,作用一般都是兩個:1.管理其他類,幫助他們搭建溝通橋梁,好處就是解耦 2.負責幫助我們管理復雜環境下的內存
- context與session不同之處是:一般與硬件打交道,例如攝像頭捕捉ARSession,網卡的調用NSURLSession等使用的都是session後綴。沒有硬件參與,一般用context,如繪圖上下文,自定義轉場上下文等
- 在iOS框架中,凡是帶session或者context後綴的,這種類一般自己不幹活,作用一般都是兩個:1.管理其他類,幫助他們搭建溝通橋梁,好處就是解耦 2.負責幫助我們管理復雜環境下的內存
-
3.要想運行一個
ARSession
會話,你必須要指定一個稱之為會話追蹤配置
的對象:ARSessionConfiguration
,ARSessionConfiguration
的主要目的就是負責追蹤相機在3D世界中的位置以及一些特征場景的捕捉(例如平面捕捉),這個類本身比較簡單卻作用巨大ARSessionConfiguration
是一個父類,為了更好的看到增強現實的效果,蘋果官方建議我們使用它的子類ARWorldTrackingSessionConfiguration
,該類只支持A9
芯片之後的機型,也就是iPhone6s之後的機型
0302.png
1.3.2-ARWorldTrackingSessionConfiguration與ARFrame
-
1.ARSession搭建溝通橋梁的參與者主要有兩個
ARWorldTrackingSessionConfiguration
與ARFrame
-
2.
ARWorldTrackingSessionConfiguration
(會話追蹤配置)的作用是跟蹤設備的方向和位置,以及檢測設備攝像頭看到的現實世界的表面。它的內部實現了一系列非常龐大的算法計算以及調用了你的iPhone必要的傳感器來檢測手機的移動及旋轉甚至是翻滾- 我們無需關心內部實現,
ARKit
框架幫助我們封裝的非常完美,只需調用一兩個屬性即可
- 我們無需關心內部實現,
-
3.當
ARWorldTrackingSessionConfiguration
計算出相機在3D世界中的位置時,它本身並不持有這個位置數據,而是將其計算出的位置數據交給ARSession
去管理(與前面說的session管理內存相呼應),而相機的位置數據對應的類就是ARFrame
- ARSession類一個屬性叫做currentFrame,維護的就是
ARFrame
這個對象
- ARSession類一個屬性叫做currentFrame,維護的就是
-
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中最難的部分
- ARSessionConfiguration捕捉相機3D位置的意義就在於能夠在添加3D物體模型的時候計算出3D物體模型相對於相機的真實的矩陣位置
微信公眾號牌九棋牌開發ARKit初體驗