ARKit上手 添加3D物體

創建項目
首先打開Xcode,選擇ARKit模板,如下所示:

clipboard.png

AR項目創建

之後,填寫完項目信息後,選擇Content Technology爲SceneKit,當然也可以選擇SpriteKit,不過在3D空間中就不是那麼立體了。
開發語言選擇Swift,Swift天然親和ARKit,很多網上的Demo都是用Swift寫的,這樣也方便移植和借鑑。

然後連接你的測試設備並運行,app就可以運行了。該模版APP會在實施攝像頭鏡頭中展示一架飛機的3D模型。如下圖所示:

clipboard.png

3D飛機

實際項目中,你也可以不使用該模版來創建項目,直接引入相關庫也可以進行開發。

在項目中可以看到viewWillAppear方法中已經初始化了ARWorldTrackingConfiguration實例。

override func viewWillAppear(_ animated: Bool) {

  super.viewWillAppear(animated)  

  // Create a session configuration
  let configuration = ARWorldTrackingConfiguration()

  // Run the view's session
  sceneView.session.run(configuration)

}
放置3D物體
SceneKit有一些基礎類,SCNScene是所有3D內容的容器,可以在其中添加多個3D物體。
要向scene中添加內容,要創建SCNGeometry,然後將其包裝爲SCNNode並添加到SCNScene中。

首先註釋掉let scene = SCNScene(named: "art.scnassets/ship.scn")! sceneView.scene = scene,然後添加代碼如下:

override func viewDidLoad() {

super.viewDidLoad()
// 存放所有3D幾何體的容器
let scene = SCNScene()

// 想要繪製的 3D 立方體
let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0.0)

// 將幾何體包裝爲node以便添加到scene
let boxNode = SCNNode(geometry: boxGeometry)

// 把box放在攝像頭正前方
boxNode.position = SCNVector3Make(0, 0, -0.5)

// rootNode是一個特殊的node,它是所有node的起始點
scene.rootNode.addChildNode(boxNode)

// 將 scene 賦給 view
sceneView.scene = scene

}
現在運行該項目,就會看到有3D立方體懸浮在空中,並且全方位無死角。

此外還可以增加一些調試信息

// ARKit統計信息例如fps等
sceneView.showsStatistics = YES;

sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints];
// 調整攝像頭屬性 當前攝像頭有效直徑在10m範圍內
if let camera = sceneView.pointOfView?.camera {

camera.wantsHDR = true
  camera.wantsExposureAdaptation = true
  camera.exposureOffset = -1
  camera.minimumExposure = -1
  camera.zFar = 10

}
之前簡單體驗了ARKit的功能,下面簡單介紹ARKit的工作原理:

ARKit工作原理
在ARKit中,創建虛擬3D模型其實可以分爲兩個步驟:

相機捕捉現實世界圖像–由ARKit實現
在圖像中顯示虛擬3D模型/2D模型–由SceneKit/SpriteKit實現
ARKit中ARSCNView用於顯示3D虛擬AR的視圖,它的作用是管理一個ARSession,一個ARSCNView實例默認持有一個ARSession。
在一個完整的AR體驗中,ARKit框架只負責將真實世界畫面轉變爲一個3D場景,這一個轉變的過程主要分爲兩個環節:由ARCamera負責捕捉攝像頭畫面,由ARSession負責搭建3D場景,而將虛擬物體顯示在3D場景中則是由SceneKit框架來完成,每個虛擬物體都是一個節點SCNNode,每個節點構成一個場景SCNScene。
ARCamera只負責捕捉圖像,不參與數據的處理。它屬於3D場景中的一個環節,每一個3D Scene都會有一個Camera,它決定了我們看物體的視野。
下圖是ARKit與SceneKit的框架關係圖:

clipboard.png

ARKit class結構

ARSessionConfiguration的主要目的就是負責追蹤相機在3D世界中的位置以及一些特徵場景的捕捉(例如平面捕捉),這個類本身比較簡單卻作用巨大。ARSessionConfiguration是一個父類,爲了更好的看到增強現實的效果,蘋果官方建議我們使用它的子類ARWorldTrackingSessionConfiguration,該類只支持A9芯片之後的機型,也就是iPhone6s之後的機型。

當ARWorldTrackingSessionConfiguration計算出相機在3D世界中的位置時,它本身並不持有這個位置數據,而是將其計算出的位置數據交給ARSession去管理,而相機的位置數據對應的類就是ARFrame。ARSession類一個屬性叫做currentFrame,維護的就是ARFrame這個對象。

clipboard.png

ARFrame

ARKit的完整運行流程可以參考下圖:

ARSCNView加載場景SCNScene
SCNScene啓動ARCamera開始捕捉圖像
ARSCNView開始將SCNScene的場景數據交給ARSession
ARSession通過管理ARSessionConfiguration實現場景的追蹤並且返回一個ARFrame(添加3D物體模型時計算3D模型相對於相機的真實矩陣位置時需要使用)
給ARSCNView的SCNScene添加一個子節點(SCNNode)
ARKit工作流程

clipboard.png
本文將會使用ARKit創建一個簡單的app,結束時就可以在AR世界裏放置3D物體,並且可以用iOS設備繞着它移動。雖然這是一個非常簡單的app,我們會在之後的文章中繼續爲其編寫更多功能,包括平面檢測、3D物理效果等其他東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章