ARKit教程04_第二章:你的第一個ARKit應(yīng)用

前言

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

Main.storyboard

需要特別注意的是ARSCNView視圖類;它允許你在相機的實時背景圖像上疊加3D場景。它提供了ARKit和SceneKit之間的無縫集成。

還有一個專門用于ARKit和SpriteKit集成的視圖類:ARSKView。如果你計劃使用2D SpriteKit內(nèi)容而不是3D SceneKit相關(guān)內(nèi)容,則可以使用此視圖類。

ViewController

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 barRequires 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)的講解。

上一章 目錄 下一章
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容