WWDC ARKit 初體驗(yàn)

圖1.png

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 如圖:

圖2.png

我們直接選擇 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 如圖:
圖3.png

我們打開 ViewController.m 可以看到建立 3D AR 場(chǎng)景使用的是 ARSCNView ,打開 ARSCNView 的頭文件可以看到:
圖4.png

ARSCNView 繼承 SCNView ,如果使用過 SceneKit 庫的同學(xué)使用那很容易理解 ARSCNView 使用。

  • ARSCNView A view for displaying AR experiences that augment the camera view with 3D SceneKit content. (3D場(chǎng)景下使用)
  • ARSKView A 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 后綴的模型

圖5.png

選擇添加 Asset Catalog 文件
圖6.png

將后綴改為 scnassets 將你創(chuàng)建的模型拖入到 scnassets 文件夾中可以發(fā)現(xiàn) DAE 后綴的文件是直接支持查看的。
圖7.png

創(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)了

效果.gif

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

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

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

繼續(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 下載地址

SceneKit 官方文檔

ARKit 官方文檔

Xcode9 下載

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

相關(guān)閱讀更多精彩內(nèi)容

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