ARKit入門(一)

1.什么是增強現實(Augmented Reality,簡稱AR)?

是一種實時地計算攝影機影像的位置及角度并加上相應圖像、視頻、3D模型的技術,這種技術的目標是在屏幕上把虛擬世界套在現實世界并進行互動。

增強現實創造了虛擬物體被放置在物理世界的錯覺。它是用你的iPhone或iPad作為一個鏡頭,根據你的相機所看到的,創建一些虛擬的3D模型放在相機所看到的物理世界。

2.ARKit的介紹

(1)蘋果在2017年6月6日發布的iOS11系統所新增框架,其中就包括ARKit,它能夠幫助我們以最簡單快捷的方式實現AR技術功能。

(2)ARKit框架作用就在于將相機捕捉的界面作為3D場景,然后展示在ARSceneView上。ARKit框架是基于`AVFoundation`和`CoreMotion`這兩個框架上開發的

3.ARKit的特性

(1)追蹤

* 全局跟蹤:是ARKit的核心功能。它是能夠實時跟蹤你的設備的能力。通過全局追蹤,我們提供了在物理環境中獲得設備相對位置的能力。我們使用視覺慣性的odometry,它使用相機圖像,以及來自你的設備的運動數據,以得到你的設備所在位置的精確視圖,以及它的方向。

* 視覺慣性測距:使用相機圖像,以及來自你的設備的運動數據,以得到你的設備所在位置的精確視圖,以及它的方向。

* 沒有外部設備:沒有預先存在的關于環境的知識,也沒有在設備上沒有的額外傳感器。

(2)場景理解

* 平面檢測:是指在物理環境中確定平面或平面的能力。

* 命中測試:得到了一個與現實世界拓撲的交集,這樣你就可以把虛擬物體放到物理世界中。

* 光估計:是用來渲染或正確地照亮你的虛擬幾何,以與物理世界相匹配。使用所有這些,我們可以無縫地將虛擬內容集成到您的物理環境中。

(3)渲染

* 簡單集合:通過一個數組來組合不同的渲染功能集成到虛擬的模型上

* AR視圖:使用SceneKit(3D)和SpriteKit(2D)來呈現大部分的AR視圖

* 自定義渲染:通過Unity和UnReal來支持AR的全套渲染功能

4.開發環境介紹

1.Xcode版本:Xcode9及以上

2.iOS系統:iOS11及以上

3.iOS設備:處理器A9及以上(6S機型及以上)

4.MacOS系統:10.12.4及以上(安裝Xcode9對Mac系統版本有要求)

5.鏈接地址:https://developer.apple.com/download/

6.注意點:ARKit雖然是iOS11新出的框架,但并不是所有的iOS11系統都可以使用,而是必須要是處理器A9及以上才能夠使用,蘋果從iPhone6s開始使用A9處理器,也就是iPhone6及以前的機型無法使用ARKit。

5.ARKit初體驗之3D效果

* 1.打開Xcode9版本,新建一個工程,選擇`Augmented Reality APP`(Xcode9新增),點擊next

* 2.在包含技術選項中選擇SceneKit

* 3.創建完成項目以后點擊 art.scnassets->ship.scn 中,然后就會出現蘋果自帶了3D的飛機模型

* 4.然后我們在`ViewController.swift`里面可以看到以下代碼

```

import UIKit

import SceneKit

import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

// ARKit框架中用于3D顯示的預覽視圖

@IBOutlet var sceneView: ARSCNView!

override func viewDidLoad() {

super.viewDidLoad()

// Set the view's delegate

// 設置代理

sceneView.delegate = self

// Show statistics such as fps and timing information

// 顯示幀率信息的屬性

sceneView.showsStatistics = true

// Create a new scene

// 使用模型創建一個新的場景(這里使用系統自帶的3D飛機模型創建的場景)

let scene = SCNScene(named: "art.scnassets/ship.scn")!

// Set the scene to the view

// 讀取上面所創建的場景(也就是把場景丟到sceneView上,就可以呈現出來)

sceneView.scene = scene

}

override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(animated)

// Create a session configuration

// 設置一個追蹤,任何一個AR都要設置追蹤

let configuration = ARWorldTrackingConfiguration()

// Run the view's session

// 通過run方法啟動追蹤

sceneView.session.run(configuration)

}

override func viewWillDisappear(_ animated: Bool) {

super.viewWillDisappear(animated)

// Pause the view's session

// 暫停追蹤(暫停追蹤后,可以通過run方法重新啟動追蹤)

sceneView.session.pause()

}

}

```

* 5.在iOS11的設備上直接運行以上代碼,就會在相機上面出現一個3D的小飛機,然后可以看看3D的真實效果。

* 6.體驗過3D效果之后,接下來介紹一下ARKit的幾個類


(1) ARSession類

? ? 這是一個單例類,是ARKit的核心類,用于控制設備攝像頭,處理傳感器數據,對捕獲的圖像進行分析等等。

? ? 每個使用ARKit創建的AR工程必須要有一個ARSession單例對象,如果你使用ARSCNView或者ARSKView來更容易的創建AR工程的一部分,這個View已經包含了一個ARSession實例,如果你使用自己編寫的渲染器來渲染AR內容,你必須實例化和持有一個ARSession對象。

? ? ARSession使用之前需要對它進行一個追蹤,設置ARSessionConfiguration的一個追蹤,然后通過run方法啟動追蹤,當你啟動追蹤的時候,就真正的啟動了ARSession,ARSession處理AVFoundation(看得見,聽得到的東西)和CoreMotion(動作處理),處理完之后就生成一個一個ARFrame,也就是幀數再展現出來。

(2)SCNScene

? ? SCNScene:具有連接的幾何圖形,燈光,照相機和其他屬性的節點的層次結構,其一起形成可顯示的3D場景。

? ? ARScnView顯示先要創建一個場景,也就是SCNScene,可以從使用外部3D創作工具創建的文件中獲取場景。如果在應用程序的資源管理資源目錄中包含場景文件,則Xcode會壓縮它們以獲得最佳的SceneKit加載性能。要加載場景文件,使用init(named:),或方法或實例的類。init(named:inDirectory:options:)?or?init(url:options:)SCNSceneSource

? ? 在使用AR之前,先看看下面這張圖,會對AR里面節點位置的理解有一定的幫助

* 7.說了這么多,接下來我們就來玩一玩AR

在viewDidLoad里面創建一個空場景

```

// 創建一個空場景

let scene = SCNScene()

/**

創建模型(這里可以創建多種模型)

SCNPlane? ? ? 飛機模型

SCNBox? ? ? ? 盒子

SCNPyramid? ? 金字塔

SCNSphere? ? 球體

SCNCylinder? 圓柱體

SCNCone? ? ? 圓錐

SCNTube? ? ? 管

SCNCapsule? ? 膠囊

SCNTorus? ? ? 環形半徑和管半徑

SCNFloor? ? ? 平面幾何

SCNText? ? ? 文本塊

SCNShape? ? ? 二維形狀

*/

// 創建一個盒子的模型,并設置它的長寬高和圓角

let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)

// 創建節點

// 節點的解釋:通俗的來說就是在AR場景里面,一個3D物件就代表一個節點

let boxNode = SCNNode(geometry: box)

// 設置節點的位置, x,y,z軸位置(可以根據上面的3D圖理解)

boxNode.position = SCNVector3(0,0,-0.2)

// 把節點放到根節點上去

scene.rootNode.addChildNode(boxNode)

// 顯示場景

sceneView.scene = scene

```

以上代碼,就是我使用SCNBox創建的盒子3D模型,效果圖如下


但是現在的盒子還是白色的,接下來我就為它上點顏色,也就是使用SceneKit里面的渲染功能

``````

// 創建渲染器

let material = SCNMaterial()

// 設置渲染屬性

material.diffuse.contents = UIColor.blue

// 在這里不僅可以設置顏色,還可以設置圖片和gif圖等

// material.diffuse.contents = UIImage(named: "brick.png")

// 將渲染添加到盒子上

box.materials = [material]

``````

暫時寫到著,稍后有時間再繼續更新,大家對本文有什么意見歡迎提出來,我也會及時改善,也希望大家多多關注。謝謝。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 筆者在上篇文章中對ARKit進行了簡單介紹,在本篇文章中主要介紹ARKit中經常用到的API及使用方法。了解這些A...
    未明一二閱讀 1,227評論 1 7
  • ARKit ARKit框架通過集成iOS設備攝像頭和運動功能,在您的應用程序或游戲中產生增強現實體驗。 概述 增強...
    暗夜夜夜行路閱讀 5,845評論 0 17
  • ARkit Introducing ARKit iOS 11引入ARKit,這是 個全新的框架,允許開發者輕松地為...
    坤哥愛卿閱讀 1,398評論 0 1
  • 我要入睡, 安置疲憊的身體, 放靈魂升空, 入幽蘭的星海里, 腐敗、糜爛, 沉降入夜色, 點亮迷路的人。
    H3190閱讀 80評論 0 0
  • 琴音 那一縷 總會飄進 深更夢境 濕枕 喚醒啼眼 咯吱咯吱 在床上輾轉 就要 到冬至 云急著往南搬家 呼嘯 從高處...
    冷眼加白眼閱讀 286評論 2 3