前言
對ARKit感興趣的同學(xué),可以訂閱ARKit教程專題
源代碼地址在這里
正文
是時候使用 Xcode 的內(nèi)置 ARKit應(yīng)用程序模板創(chuàng)建第一個 ARKit應(yīng)用程序了。你還將了解如何修改應(yīng)用以適應(yīng)基本UI 元素(如標(biāo)簽和按鈕)以提供用戶反饋和接收用戶輸入。
開始
Xcode附帶幾種不同類型的應(yīng)用程序項目模板。
這些應(yīng)用程序模板本質(zhì)上是樣板應(yīng)用程序,旨在節(jié)省開發(fā)時間、精力,并讓你盡快啟動和運行。
創(chuàng)建一個ARKit應(yīng)用程序
打開 Xcode 并選擇File ? New ? Project 。或者使用鍵盤快捷鍵:Shift-Command-N。
選擇iOS ? Application ? Augmented Reality App然后選擇Next繼續(xù)。

現(xiàn)在,你需要提供有關(guān)項目的一些基本詳細(xì)信息。輸入產(chǎn)品名稱的 Chapter02,選擇Swift語言,Content Technology選擇SceneKit,取消選中單元測試,然后單擊Next:

最后一步是選擇保存項目的位置。選擇一個目錄并選擇
Create。Xcode就會生成你需要的項目了。
編譯ARKit應(yīng)用程序
這里需要注意的是,ARKit需要在A9以及以上的處理器上面才可以正常工作。如果你對這個概念不是很清楚的話,下面有一個可以支持的設(shè)備的列表:
| 支持ARKit的設(shè)備 |
|---|
| iPhone SE |
| iPhone 6s and 6s Plus |
| iPhone 7 and 7 Plus |
| iPad Pro (1st and 2nd generation, across all sizes: 9.7", 10.5" and 12.9") |
| iPad (The 2017+ models) |
| iPhone 8 and 8 Plus |
| iPhone X |
當(dāng)然,除了上面這些設(shè)備,2018年新出的iPhone和iPad都是支持ARKit的。
拿起你的符合條件的iPhone或者iPad并將其連接到Xcode。運行一下,不出意外的情況下,你可以看到一架飛機在你的前面。
注意:應(yīng)用程序首次啟動時,它會請求訪問攝像頭;這是所有增強現(xiàn)實應(yīng)用程序的要求。
花一點時間來測試一下。將相機對準(zhǔn)一個空曠的空間,然后四處走動,直到看到巨型宇宙飛船。嘗試查看該工藝的所有可能角度。你是否注意到宇宙飛船如何在現(xiàn)實世界中停留?這就是ARKit的神奇之處!
當(dāng)你啟動應(yīng)用程序時,ARKit會將設(shè)備在空間中的當(dāng)前位置用作其世界錨點。然后加載SceneKit場景并將場景放入增強空間;這是一種快速而骯臟的方式來獲取AR中顯示的任何內(nèi)容。
審查項目文件
因為這個AR效果是咱們創(chuàng)建應(yīng)用的時候自帶的效果,咱們需要了解一下該效果到底是怎么產(chǎn)生的。
Main storyboard

需要特別注意的是ARSCNView視圖類;它允許你在相機的實時背景圖像上疊加3D場景。它提供了ARKit和SceneKit之間的無縫集成。
還有一個專門用于ARKit和SpriteKit集成的視圖類:
ARSKView。如果你計劃使用2D SpriteKit內(nèi)容而不是3D SceneKit相關(guān)內(nèi)容,則可以使用此視圖類。
ViewController

我們需要引用的framework有:
- UIKit
- SceneKit
- ARKit
你的ViewController類直接從標(biāo)準(zhǔn)UIViewController繼承,該標(biāo)準(zhǔn)UIViewController提供用于管理基于UIKit的基本應(yīng)用程序的視圖的基礎(chǔ)結(jié)構(gòu)。
它還采用了ARKit的ARSCNViewDelegate協(xié)議,該協(xié)議包含可以實現(xiàn)的方法,以便將SceneKit內(nèi)容與AR會話同步。
SceneKit asset 列表
這是為SceneKit資產(chǎn)明確設(shè)計的特殊文件夾。 SceneKit是一個強大的高級圖形框架,能夠創(chuàng)建和管理應(yīng)用程序的所有圖形和音頻內(nèi)容;這是您存儲場景,紋理,3D模型,動畫,聲音效果和音樂等內(nèi)容的地方。
如果你雙擊art.scnassets / ship.scn,你會看到之前的酷太空船出現(xiàn)在Xcode中。 .scn文件被稱為場景,你所看到的是Xcode的內(nèi)置SceneKit編輯器。

注意:assets文件夾中的
texture.jpg文件;這是用于紋理3D模型飛船的圖像。后面的章節(jié)會對此有詳細(xì)的介紹。
項目設(shè)置
在項目導(dǎo)航器中選擇項目的根元素。然后,在TARGETS ? ARPokerDice ? Development Info,你可以像設(shè)置任何其他iOS應(yīng)用程序一樣設(shè)置選項:

繼續(xù),選中Hide status bar和Requires full screen。
Info.plist
還記得要求獲得訪問相機權(quán)限的初始彈出窗口嗎? ARKit應(yīng)用程序必須請求訪問設(shè)備攝像頭;否則,ARKit將無法做任何事情。你可以在Info.plist配置文件中找到該特定設(shè)置。
查找Privacy - Camera Usage Description,并將信息修改為你想要的任何內(nèi)容。此消息是請求訪問攝像機時向用戶顯示的消息。

因為你使用ARKit模板創(chuàng)建了應(yīng)用程序,所以Xcode會自動為您添加此設(shè)置。如果你使用其他模板從頭開始創(chuàng)建ARKit應(yīng)用程序,則必須在Info.plist配置文件中手動添加此設(shè)置。
創(chuàng)建Asset目錄
接下來需要為ARKit應(yīng)用程序創(chuàng)建一些SceneKit場景。在創(chuàng)建任何場景之前,你需要從新的Asset目錄開始;這是你存儲3D內(nèi)容的地方。
具體的操作步驟是:
在當(dāng)前項目目錄下鼠標(biāo)右鍵選擇Add Files to "xxx"

接下來選擇New Folder,選擇之后會出現(xiàn)一個彈框,你輸入文件夾的名字。需要注意的是,文件夾的擴展是.scnassets。命名完成之后點擊Create,最后點擊Add就可以了。


注意:.scnassets文件擴展名是一種特殊的類型擴展,它告訴Xcode文件夾的內(nèi)容將包含與SceneKit相關(guān)的assets。該文件夾及其內(nèi)容將成為應(yīng)用程序包的一部分,并將部署到設(shè)備中。
創(chuàng)建完成之后,檢查一下該文件夾是不是被選中的狀態(tài)。

創(chuàng)建一個新的SceneKit場景
選中你剛才創(chuàng)建的文件夾目錄,右鍵選擇New File。

創(chuàng)建SceneKit Scene.scn文件。將其重命名為SimpleScene.scn,然后選擇它以在Xcode中打開空白場景。

現(xiàn)在這個場景里面是空的;你會通過創(chuàng)造一個類似地球的小行星來改變它。在場景仍然打開的情況下,在對象庫下搜索Sphere。現(xiàn)在,將Sphere節(jié)點拖放到場景中。

現(xiàn)在你已經(jīng)在場景中有一個大的白色球體,點擊它以確保它仍然被選中。接下來,選擇Xcode右上角的Attributes Inspector并將球體Radius更改為0.15:

AR會話開始時,設(shè)備在現(xiàn)實世界中的位置定義了SceneKit空間中的(x:0,y:0,z:0)位置。為了確保用戶看到球體,你將它放置在場景中間一米處。在仍然選擇球體的情況下,選擇節(jié)點檢查器,然后將其位置更改為(x:0,y:0,z:-1):

至此,一個球體大小和位置都有了,不過為了讓我們創(chuàng)建的物體更加形象,我們可以試著把這個球做成一個地球。這時候,我們需要知道怎么給這個球體表面貼一層紋理。
選中ARResource.scnassets文件夾,點擊鼠標(biāo)右鍵,選擇Show in Finder,之后把對應(yīng)的紋理圖片添加到項目中。

添加完成之后,可以選中SceneKit Scene.scn文件,把你想要貼的紋理圖直接拖拽到你剛才添加的球體上面,或者按照下圖所示,通過Diffuse選擇紋理圖片。

到此為止,一個地球模型出現(xiàn)了。但是,問題是我們怎樣讓應(yīng)用程序中顯示這個地球模型呢?
加載SceneKit場景
打開ViewController.swift文件我們可以在ViewDidLoad()方法中發(fā)現(xiàn)以下代碼:
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
let scene = SCNScene(named: "art.scnassets/ship.scn")!
// Set the scene to the view
sceneView.scene = scene
}
let scene = SCNScene(named: "art.scnassets/ship.scn")!的作用是加載了一個art.scnassets目錄下的名字為ship.scn的場景文件。咱們可以把路徑和文件名改變一下:
let scene = SCNScene(named: "ARResource.scnassets/SceneKit Scene.scn")!
運行一下,在真機下顯示如下:

一個地球看上去太孤獨了,我們可以試著在地球旁邊添加一個月球。
做法跟創(chuàng)建地球模型是一樣的:


最終結(jié)果如下所示:

這個只是我們第一個ARKit應(yīng)用,后面的路還很漫長。同學(xué)們?nèi)绻\行我項目里面的demo的話,會發(fā)現(xiàn),其實這里面會有動畫存在,這個我們在后面會有相應(yīng)的講解。
| 上一章 | 目錄 | 下一章 |
|---|