這篇第一篇文章將使用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物理和更多有趣的東西峭火。
要求
截至撰寫(xiě)本文時(shí)毁习,您需要一臺(tái)帶有A9 / A10處理器的iOS設(shè)備來(lái)支持ARKit。這意味著iPhone 6S或更好卖丸,或iPad 2017或更好纺且。
對(duì)于sfotware,您需要安裝:
- iOS 11 Beta:https://developer.apple.com/download/
- XCode 9 Beta:https://developer.apple.com/download/
安裝好后稍浆,您就可以開(kāi)始了载碌。
創(chuàng)建項(xiàng)目
首先打開(kāi)XCode,選擇ARKit項(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”弦撩。
運(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ī)也是如此:
示例項(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)系如下所示:
正如您在上面的代碼中所看到的那樣晶密,攝像機(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