ARKit by Example - 第1部分:AR立方體

這篇第一篇文章將使用ARKit創(chuàng)建一個(gè)非常簡(jiǎn)單的hello world AR應(yīng)用程序聂受。最后扮饶,我們將能夠在增強(qiáng)的世界中定位3D立方體逗鸣,并使用我們的iOS設(shè)備移動(dòng)它枝嘶。

要在ARKit中呈現(xiàn)3D內(nèi)容帘饶,我們將使用SceneKit:https//developer.apple.com/scenekit/這是一個(gè)在iOS設(shè)備上渲染3D圖形的框架。如果您熟悉基本的3D概念躬络,那將非常簡(jiǎn)單尖奔。

如果你不能等到文章結(jié)尾,這里有一個(gè)應(yīng)用程序的視頻穷当。正如您在使用ARKit時(shí)所看到的提茁,我們可以將虛擬對(duì)象放置在現(xiàn)實(shí)世界中,并在我們移動(dòng)相機(jī)時(shí)將它們固定到位馁菜。

即使這是一個(gè)非常簡(jiǎn)單的應(yīng)用程序茴扁,我們將通過(guò)這些系列文章繼續(xù)構(gòu)建越來(lái)越多的功能,包括幾何檢測(cè)汪疮,3D物理和更多有趣的東西峭火。

Youtube

要求

截至撰寫(xiě)本文時(shí)毁习,您需要一臺(tái)帶有A9 / A10處理器的iOS設(shè)備來(lái)支持ARKit。這意味著iPhone 6S或更好卖丸,或iPad 2017或更好纺且。

對(duì)于sfotware,您需要安裝:

安裝好后稍浆,您就可以開(kāi)始了载碌。

創(chuàng)建項(xiàng)目

首先打開(kāi)XCode,選擇ARKit項(xiàng)目模板:

XCode 9 Beta - 新項(xiàng)目模板選擇器

填寫(xiě)項(xiàng)目詳細(xì)信息衅枫,確保選擇“Scene Kit”作為“內(nèi)容技術(shù)”選項(xiàng)嫁艇。默認(rèn)情況下可能會(huì)說(shuō)“Sprite Kit”用于2D渲染,但我們想要用于渲染3D內(nèi)容的“Scene Kit”弦撩。

image.png

運(yùn)行項(xiàng)目步咪,如果設(shè)備上的所有內(nèi)容都按預(yù)期工作,您應(yīng)該會(huì)看到一個(gè)應(yīng)用程序益楼,其中顯示了實(shí)時(shí)攝像頭源和位于物理空間中的飛機(jī)的3D模型猾漫。

移動(dòng)并觀察飛機(jī)在現(xiàn)實(shí)世界中保持的位置,即使您移動(dòng)相機(jī)也是如此:

image.png

示例項(xiàng)目中的上述示例實(shí)際上比我們要?jiǎng)?chuàng)建的更高級(jí)偏形,但這里的重點(diǎn)是學(xué)習(xí)如何從頭開(kāi)始編寫(xiě)這些項(xiàng)目静袖,以便打開(kāi)項(xiàng)目,并從viewDidLoad方法中刪除所有代碼(除了超級(jí)電話(huà))俊扭。

ARKit核心課程

ARSCNView ?- 輔助視圖,有助于使用SceneKit渲染的3D內(nèi)容增強(qiáng)實(shí)時(shí)攝像機(jī)視圖坠陈。這堂課有幾件事:

  • 從視圖中的設(shè)備相機(jī)渲染實(shí)時(shí)視頻流萨惑,作為3D場(chǎng)景的背景
  • ARKit的3D坐標(biāo)系與SceneKit的3D坐標(biāo)系匹配,因此在此視圖中渲染的對(duì)象將自動(dòng)匹配增強(qiáng)的ARKit世界視圖
  • 自動(dòng)移動(dòng)虛擬SceneKit 3D相機(jī)以匹配ARKit跟蹤的3D位置仇矾,因此不需要額外的代碼來(lái)連接ARKit移動(dòng)事件以映射到SceneKit 3D渲染庸蔼。

ARSession ?- 每個(gè)增強(qiáng)現(xiàn)實(shí)會(huì)話(huà)都需要一個(gè)ARSession實(shí)例。它負(fù)責(zé)控制攝像機(jī)贮匕,從設(shè)備中收集所有傳感器數(shù)據(jù)等姐仅,以構(gòu)建這種無(wú)縫體驗(yàn)。ARSCNView實(shí)例已經(jīng)有一個(gè)ARSession實(shí)例刻盐,您只需要在啟動(dòng)時(shí)配置它掏膏。

ARWorldTrackingSessionConfiguration ?- 此類(lèi)向ARSession指示我們想要使用六個(gè)自由度來(lái)跟蹤現(xiàn)實(shí)世界中的用戶(hù),滾動(dòng)敦锌,俯仰馒疹,偏航和X,Y和Z中的平移乙墙。這使我們可以在您可以創(chuàng)建AR體驗(yàn)不僅可以在同一個(gè)位置旋轉(zhuǎn)以查看增強(qiáng)內(nèi)容颖变,還可以在3D空間中移動(dòng)對(duì)象生均。如果您不需要翻譯部分,并且用戶(hù)在項(xiàng)目擴(kuò)充內(nèi)容時(shí)保持靜止腥刹,則可以使用ARSessionConfiguration類(lèi)來(lái)初始化ARSession實(shí)例马胧。

對(duì)于本系列的第1部分,我們只需要這些類(lèi)衔峰,還有更多佩脊,但這是一個(gè)很好的起點(diǎn)⌒嗌回到我們的項(xiàng)目邻吞,我們可以在viewWillAppear方法中看到初始化ARSession實(shí)例,self.sceneView引用ARSCNView實(shí)例葫男。

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  // Create a session configuration
  ARWorldTrackingSessionConfiguration *configuration = [ARWorldTrackingSessionConfiguration new];
  // Run the view's session
  [self.sceneView.session runWithConfiguration:configuration];
}

繪制立方體

我們將使用SceneKit繪制3D立方體抱冷。SceneKit有幾個(gè)基本類(lèi),SCNScene是所有3D內(nèi)容的容器梢褐,您可以在場(chǎng)景中添加多個(gè)3D幾何體旺遮,包括各種位置,旋轉(zhuǎn)盈咳,比例等耿眉。

要向場(chǎng)景添加內(nèi)容,首先要?jiǎng)?chuàng)建一些幾何體鱼响,幾何體可以是復(fù)雜的形狀鸣剪,或簡(jiǎn)單的形狀,如球體丈积,立方體筐骇,平面等。然后將幾何體包裹在場(chǎng)景節(jié)點(diǎn)中并將其添加到場(chǎng)景中江滨。然后SceneKit將遍歷場(chǎng)景圖并渲染內(nèi)容铛纬。

要添加場(chǎng)景并繪制立方體,我們將在viewDidLoad方法中添加以下代碼:

- (void)viewDidLoad {
  [super viewDidLoad];
  // Container to hold all of the 3D geometry  
  SCNScene *scene = [SCNScene new];
  // The 3D cube geometry we want to draw
  SCNBox *boxGeometry = [SCNBox 
                          boxWithWidth:0.1 
                          height:0.1 
                          length:0.1 
                          chamferRadius:0.0];
  // The node that wraps the geometry so we can add it to the scene
  SCNNode *boxNode = [SCNNode nodeWithGeometry:boxGeometry];
  // Position the box just in front of the camera
  boxNode.position = SCNVector3Make(0, 0, -0.5);
  // rootNode is a special node, it is the starting point of all
  // the items in the 3D scene
  [scene.rootNode addChildNode: boxNode];
  // Set the scene to the view
  self.sceneView.scene = scene;
}

ARKit中的坐標(biāo)大致對(duì)應(yīng)于米唬滑,因此在這種情況下告唆,我們創(chuàng)建一個(gè)10x10x10厘米的盒子。

ARKit和SceneKit的坐標(biāo)系如下所示:

image.png

正如您在上面的代碼中所看到的那樣晶密,攝像機(jī)前面的攝像機(jī)位置為-0.5擒悬,因?yàn)閿z像機(jī)面向負(fù)Z方向。

當(dāng)ARSession啟動(dòng)時(shí)惹挟,計(jì)算出的攝像機(jī)位置最初設(shè)置為X = 0茄螃,Y = 0,Z = 0连锯。

如果您現(xiàn)在運(yùn)行該示例归苍,您應(yīng)該會(huì)看到一個(gè)漂浮在空間中的小型立方體用狱,當(dāng)您四處移動(dòng)時(shí),它可以保持它的位置拼弃,您應(yīng)該能夠一直走動(dòng)夏伊,向下看,在它上面吻氧。

我們想要做的一個(gè)快速調(diào)整是在3D場(chǎng)景中添加一些默認(rèn)光照溺忧,這樣我們就可以看到立方體的兩側(cè),我們可以稍后添加一些更高級(jí)的光照但是現(xiàn)在我們可以在SCNScene實(shí)例上設(shè)置autoenablesDefaultLighting :

self.sceneView.autoenablesDefaultLighting = YES;

下一篇文章

在下一篇文章中盯孙,我們將開(kāi)始使我們的應(yīng)用程序更有趣鲁森,添加一些更復(fù)雜的對(duì)象,檢測(cè)場(chǎng)景中的平面以及與場(chǎng)景中的幾何體交互振惰,敬請(qǐng)期待...

原文:?https://blog.markdaws.net/arkit-by-example-part1-7830677ef84d
作者:Mark Dawson

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歌溉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骑晶,更是在濱河造成了極大的恐慌痛垛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桶蛔,死亡現(xiàn)場(chǎng)離奇詭異匙头,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)仔雷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)蹂析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碟婆,你說(shuō)我怎么就攤上這事识窿。” “怎么了脑融?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵朴下,是天一觀的道長(zhǎng)评疗。 經(jīng)常有香客問(wèn)我舌缤,道長(zhǎng)汽煮,這世上最難降的妖魔是什么倘要? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任卦尊,我火速辦了婚禮堡掏,結(jié)果婚禮上呻纹,老公的妹妹穿的比我還像新娘宋梧。我一直安慰自己匣沼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布捂龄。 她就那樣靜靜地躺著释涛,像睡著了一般加叁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唇撬,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天它匕,我揣著相機(jī)與錄音,去河邊找鬼窖认。 笑死豫柬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扑浸。 我是一名探鬼主播烧给,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼喝噪!你這毒婦竟也來(lái)了础嫡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仙逻,失蹤者是張志新(化名)和其女友劉穎驰吓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體系奉,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檬贰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缺亮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翁涤。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萌踱,靈堂內(nèi)的尸體忽然破棺而出葵礼,到底是詐尸還是另有隱情,我是刑警寧澤并鸵,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布鸳粉,位于F島的核電站,受9級(jí)特大地震影響园担,放射性物質(zhì)發(fā)生泄漏届谈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一弯汰、第九天 我趴在偏房一處隱蔽的房頂上張望艰山。 院中可真熱鬧,春花似錦咏闪、人聲如沸曙搬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纵装。三九已至征讲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搂擦,已是汗流浹背稳诚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瀑踢,地道東北人扳还。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像橱夭,于是被迫代替她去往敵國(guó)和親氨距。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容