1. 程式人生 > >[Xcode10 實際操作]七、檔案與資料-(21)ARKit增強現實框架的使用

[Xcode10 實際操作]七、檔案與資料-(21)ARKit增強現實框架的使用

本文將演示ARKit增強現實框架的使用。

建立一個新的專案:【Create a new Xcode project】

->在開啟的模板選擇中,選擇增強現實應用模板【Augmented Reality App】

->【Next】->【Product Name】:ARDemo 。保持其他引數不變

->【Next】->選擇專案存放目錄->【Create】

在左側的文件框架區,點選檢視模板自帶的場景資源【art.scnassets】

在右側的屬性面板,可以看出場景的Y軸朝上,X軸朝右,Z軸向內。

並且三維模型優先使用同名的、壓縮後的貼圖。

在資源【art.scnassets】資料夾下,包含一個三維場景【ship.scn】,和一個貼圖檔案【texture.png】

點選開啟三維場景【ship.scn】。

當前的三維場景擁有一駕噴氣式飛機的三維模型,場景在預設情況下處於轉盤模式。

點選右下角第一個圖示,彈出操作列表,選擇【Fly】

滑鼠按下並向下方拖動,觀察飛機模型的位置變化。

點選右下角第一個圖示,彈出操作列表,選擇【Arcball】軌跡球選項

滑鼠按下並向下方拖動,觀察飛機模型的位置變化。

點選右下角第一個圖示,彈出操作列表,選擇【Pan】平移選項

滑鼠按下並向下方拖動,觀察飛機模型的位置變化。

點選右下角第一個圖示,彈出操作列表,選擇【Truck】轉向選項

滑鼠按下並向右側拖動,觀察飛機模型的位置變化。

接著修改三維場景的【顯示模式列表】,點選右下角第四個圖示,

勾選列表中的【Wireframe】線框選項:使三維模型處於線框的顯示狀態。

勾選列表中的【Grid】網格選項:可以在三維場景中顯示輔助的網格線。

在列表外部點選,關閉【顯示模式列表】

接著修改三維場景的【檢視型別】,點選左下角第四個圖示,彈出【檢視型別】列表

【Top】:頂檢視,模擬攝像機從頂部向下看的效果。

【Bottom】:底檢視

【Left】:左檢視

【Right】:右檢視

【Front】:前檢視

【Back】:後檢視

接著點選三維物體的貼圖檔案【texture.png】

在貼圖檔案中,包含了三維飛機模型在多個檢視中的投影所對應的貼圖。

接著點選故事版檔案【Main.storyboard】

在故事版中包含了一個三維場景檢視,點選選擇該檢視物件

開啟右側的屬性設定面板。

三維場景檢視同樣擁有一些屬性,可以設定它的名稱、行為、渲染引數和動畫引數等。

在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】

在檢視載入完成的方法中,分別設定了:

1.三維場景檢視的代理物件

2.統計狀態

3.需要載入的三維場景

在檢視即將顯示或消失的方法中,對三維場景檢視的會話週期,進行了不同方式的呼叫。

接著開啟模擬器列表【ARDDemo>Generic iOS Device】

在列表裡選擇一款真機裝置,將在真機裝置上執行該應用程式。

執行程式後,點選允許應用程式訪問裝置。

此時在螢幕上顯示了一個三維的飛機模型。

可以移動手機,在各個角度檢視飛機的狀態。

點選手機螢幕左下角開啟狀態面板。

在狀態面板中顯示了重新整理率、面數等資訊。

使用【Command】+【Tab】切換並開啟瀏覽器軟體

輸入蘋果提供的三維場景包的下載地址:

https://developer.apple.com/documentation/arkit/building_your_first_ar_experience

壓縮包下載後,將自動解壓並開啟解壓後的資料夾。

找到三維場景模型的資原始檔Resources->Models.scnassets

將三維場景模型的資原始檔夾拖動到自己的專案中

點選【Finish】確認資料夾的匯入

在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】

重新修改一下三維場景的程式碼

 1 import UIKit
 2 import SceneKit
 3 import ARKit
 4 
 5 class ViewController: UIViewController, ARSCNViewDelegate {
 6 
 7     @IBOutlet var sceneView: ARSCNView!
 8     
 9     override func viewDidLoad() {
10         super.viewDidLoad()
11         
12         // Set the view's delegate
13         //三維場景檢視的代理物件
14         sceneView.delegate = self
15         
16         // Show statistics such as fps and timing information
17         //統計狀態
18         sceneView.showsStatistics = true
19         
20         // Create a new scene
21         //需要載入的三維場景
22         //載入三維場景的程式碼,修改為已新增的三維場景模型的資原始檔
23         let scene = SCNScene(named: "Models.scnassets/chair/chair.scn")!
24         
25         // Set the scene to the view
26         sceneView.scene = scene
27     }
28 
29     override func viewWillAppear(_ animated: Bool) {
30         super.viewWillAppear(animated)
31         
32         // Create a session configuration
33         let configuration = ARWorldTrackingConfiguration()
34         // Run the view's session
35         sceneView.session.run(configuration)
36     }
37     
38     override func viewWillDisappear(_ animated: Bool) {
39         super.viewWillDisappear(animated)
40         
41         // Pause the view's session
42         sceneView.session.pause()
43     }
44     
45     override func didReceiveMemoryWarning() {
46         super.didReceiveMemoryWarning()
47         // Release any cached data, images, etc that aren't in use.
48     }
49 
50     //在檢視即將顯示或消失的方法中,對三維場景檢視的會話週期,進行了不同方式的呼叫。
51     
52     func session(_ session: ARSession, didFailWithError error: Error) {
53         // Present an error message to the user
54         
55     }
56     
57     func sessionWasInterrupted(_ session: ARSession) {
58         // Inform the user that the session has been interrupted, for example, by presenting an overlay
59         
60     }
61     
62     func sessionInterruptionEnded(_ session: ARSession) {
63         // Reset tracking and/or remove existing anchors if consistent tracking is required
64         
65     }
66 }