
WWDC 2017全球開發(fā)者大會(huì)上,蘋果公布了其第一款具有AR功能平臺(tái)的iOS操作系統(tǒng)iOS11。ARKit 是一個(gè)全新的增強(qiáng)現(xiàn)實(shí)平臺(tái),Apple 對(duì)其的描述是 Integrate iOS device camera and motion features to produce augmented reality experiences in your app or game. (集成iOS設(shè)備的攝像頭和移動(dòng)特性,可以在你的應(yīng)用或游戲中產(chǎn)生增強(qiáng)現(xiàn)實(shí)體驗(yàn)。)
這里來初次體驗(yàn)下 ARKit吧,但是有一點(diǎn)是要注意,想要運(yùn)行 ARKit 項(xiàng)目,運(yùn)行環(huán)境必須是 iphone 6s 及以上設(shè)備,系統(tǒng)是 iOS 11。 因?yàn)?ARKit是運(yùn)行在 A9 和 A10 處理器上,具體的可以參照 Apple 給出描述 點(diǎn)擊這里
打開 Xcode9 新建項(xiàng)目發(fā)現(xiàn)多了一個(gè) Augmented Reality App 如圖:

我們直接選擇 Augmented Reality App 創(chuàng)建一個(gè)項(xiàng)目。打開項(xiàng)目可以發(fā)現(xiàn)選擇 Augmented Reality App 已經(jīng)幫我們集成了
<SceneKit/SceneKit.h> 和 <ARKit/ARKit.h> 兩個(gè)庫,存放模型資源的文件夾 art.scnassets 如圖:
我們打開
ViewController.m 可以看到建立 3D AR 場(chǎng)景使用的是 ARSCNView ,打開 ARSCNView 的頭文件可以看到:
ARSCNView 繼承 SCNView ,如果使用過 SceneKit 庫的同學(xué)使用那很容易理解 ARSCNView 使用。
-
ARSCNViewA view for displaying AR experiences that augment the camera view with 3D SceneKit content. (3D場(chǎng)景下使用) -
ARSKViewA view for displaying AR experiences that augment the camera view with 2D SpriteKit content. (2D場(chǎng)景下使用)
總體來說要想顯示AR效果,必須要依賴于 Apple 的游戲引擎框架( 3D 引擎 SceneKit ,2D 引擎 SpriktKit )。
SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"]; 創(chuàng)建一個(gè)場(chǎng)景,場(chǎng)景加載的資源在art.scnassets 文件夾中,這里是官方提供的 SCN 格式的文件,并且附帶一張 png 的圖片。當(dāng)然我們也可以使用 DAE 格式的文件,使用 3DMax 設(shè)計(jì)好模型導(dǎo)出 DAE 格式的模型直接可以使用,使用的方式和官方的 SCN 模式一樣。來看看如何載入一個(gè) DAE 后綴的模型

選擇添加
Asset Catalog 文件
將后綴改為
scnassets 將你創(chuàng)建的模型拖入到 scnassets 文件夾中可以發(fā)現(xiàn) DAE 后綴的文件是直接支持查看的。
創(chuàng)建場(chǎng)景的方式和 SCN 后綴一樣
SCNScene *cupScene = [SCNScene sceneNamed:@"horse.scnassets/file.dae"];然后將場(chǎng)景賦值到
ARSCNView 上就可以顯示了 self.sceneView.scene = scene;
接下來我做一個(gè)在地上或者桌子上放一個(gè)杯子,效果沒有 Apple 演示的好,基本算是實(shí)現(xiàn)了

這里的杯子模型從網(wǎng)上下載的 SCN 文件后綴,如果你下載 DAE 后綴的文件有的模型可能是沒有貼圖像這樣

這里順便告訴大家如何貼圖吧,左邊的側(cè)邊欄有一個(gè)_3dxy 一般是模型的名稱,展開后有一個(gè)個(gè)小的模塊,選中一個(gè)摸塊后如圖選中你要貼的圖

一個(gè)一個(gè)的貼上對(duì)應(yīng)的圖后,如果你想把 DAE 后綴的文件轉(zhuǎn)換成 SCN 的文件后綴一步就可以完成。如下圖操作

繼續(xù)我們的如何在平面上面放一個(gè)杯子的項(xiàng)目吧。要讓相機(jī)識(shí)別到平地首先我們要設(shè)置
ARWorldTrackingSessionConfiguration 的屬性 planeDetection
ARWorldTrackingSessionConfiguration :的作用是跟蹤設(shè)備的方向和位置,以及檢測(cè)設(shè)備攝像頭看到的現(xiàn)實(shí)世界的表面。這里我們將 planeDetection 設(shè)置為 ARPlaneDetectionHorizontal
- (ARWorldTrackingSessionConfiguration *)arSessionConfiguration {
if (!_arSessionConfiguration) {
_arSessionConfiguration = [[ARWorldTrackingSessionConfiguration alloc] init];
_arSessionConfiguration.lightEstimationEnabled = YES;
_arSessionConfiguration.planeDetection = ARPlaneDetectionHorizontal;
}
return _arSessionConfiguration;
}
設(shè)置好平面追蹤后在監(jiān)聽 ARSCNView 的代理方法
- (void)renderer:(id <SCNSceneRenderer>)renderer
didAddNode:(SCNNode *)node
forAnchor:(ARAnchor *)anchor {
if ([anchor isMemberOfClass:[ARPlaneAnchor class]]) {
NSLog(@"捕捉到");
ARPlaneAnchor *planeAnchor = (ARPlaneAnchor *)anchor;
SCNBox *planeBox = [SCNBox boxWithWidth:planeAnchor.extent.x*0.2
height:0
length:planeAnchor.extent.x*0.2
chamferRadius:0];
SCNNode *planeNode = [SCNNode nodeWithGeometry:planeBox];
planeNode.position = SCNVector3Make(planeAnchor.center.x, 0, planeAnchor.center.z);
[node addChildNode:planeNode];
//添加場(chǎng)景
SCNScene *scene = [SCNScene sceneNamed:@"air.scnassets/cup/cup.scn"];
SCNNode *cupNode = scene.rootNode.childNodes[0];
cupNode.position = SCNVector3Make(planeAnchor.center.x, 0, planeAnchor.center.z);
[node addChildNode:cupNode];
}
}
當(dāng)捕捉到平地的錨點(diǎn)后我們就知道該把這個(gè)杯子放在哪里了,根據(jù)平地創(chuàng)建 3D 模型,然后加載場(chǎng)景就可以了。代碼沒有多少一個(gè)很簡(jiǎn)單的例子,可以看出 Apple 對(duì) ARKit 封裝的很完美了,對(duì)于開發(fā)者使用起來很簡(jiǎn)單。最后附上 Demo 和相關(guān)文檔查考。
Demo 下載地址