ARKit 初體驗(yàn)

前言

蘋果于9月20日推出了iOS 11,帶來了AR(虛擬增強(qiáng)現(xiàn)實(shí))功能。更新到Xcode 9之后就可以進(jìn)行開發(fā),我也迫不急待地去搜索一翻,然后好好體驗(yàn)一翻。

起初在網(wǎng)上找了一個(gè)代碼,直接打開就提示錯(cuò)誤Unknown type name 'ARSessionConfiguration'。ARSessionConfiguration 無法識別(未定義的類),其實(shí)只是Xcode 9正式發(fā)后就直接用ARConfiguration來實(shí)現(xiàn)的,把它替換了就OK。

簡單理解

SpriteKit(iOS 7新增))和SceneKit(iOS 8新增)都是基于游戲開發(fā)的框架,SpriteKit是類似于類似cocos2d,而SceneKit就是3D游戲開發(fā),AR(虛擬增強(qiáng)現(xiàn)實(shí))就需要靠它來實(shí)現(xiàn)。ARKit用來實(shí)現(xiàn)相機(jī)捕捉現(xiàn)實(shí)世界圖像,SceneKit則將圖像顯示成虛擬3D模型。

ARKit 和SceneKit的一些關(guān)系: 1.視圖類存在繼承關(guān)系。ARKit框架中3D虛擬增強(qiáng)現(xiàn)實(shí)的視圖ARSCNView是繼承于SceneKit中的SCNView,當(dāng)然最終都繼承于UIVIiew的。UIView是將視圖簡單地顯示,而且SCNView就將顯示以3D場景顯示出來,相當(dāng)于SCNView存在視圖渲染和增加效果。2.ARKit負(fù)責(zé)將真實(shí)世界畫面轉(zhuǎn)變?yōu)橐粋€(gè)3D場景,其中ARCamera負(fù)責(zé)捕捉實(shí)現(xiàn)的畫面,ARSesson負(fù)責(zé)搭建3D場景,將3D場景和實(shí)現(xiàn)畫面統(tǒng)一顯示就是依靠繼承于具有顯示3D視圖顯示能力視圖SCNView的ARSCNView來實(shí)現(xiàn)。3.現(xiàn)實(shí)在3D場景的SceneKit中的虛擬物體,每一個(gè)都是一個(gè)節(jié)點(diǎn)SCNNode,每一個(gè)節(jié)點(diǎn)構(gòu)成了一個(gè)場景SCNScene,無數(shù)個(gè)場景構(gòu)成了3D世界。4.總之,ARKit和SceneKit是不可分割的,ARKit算是為了實(shí)現(xiàn)相機(jī)的3D虛擬增強(qiáng)現(xiàn)實(shí)功能而提煉出來的。獲取3D虛擬現(xiàn)實(shí)的原料完全是靠ARKit,而實(shí)現(xiàn)3D虛擬現(xiàn)實(shí)視圖的顯示功能,還是靠SceneKit,只不過用了繼承關(guān)系來依賴和使用的。

在圖片中搜索到的關(guān)系圖可以很好地說明ARKit 和SceneKit的關(guān)系


ARKit 和SceneKit的關(guān)系

簡單使用

1.導(dǎo)入框架

#import <SceneKit/SceneKit.h>

#import <ARKit/ARKit.h>

2. 定義屬性

//AR視圖,展示3D頁面

@property(nonatomic,strong)ARSCNView *arSCNView;

//AR會話,負(fù)責(zé)管理相機(jī)追蹤配置及3D相機(jī)坐標(biāo)

@property(nonatomic,strong)ARSession *arSession;

//會話追蹤配置:負(fù)責(zé)追蹤相機(jī)的運(yùn)動(dòng)

@property(nonatomic,strong)ARConfiguration *arConfiguration;

3. 我用懶加載的方法進(jìn)行初始化

//MARK: -- 懶加載AR視圖

- (ARSCNView *)arSCNView{

? if (!_arSCNView) {

//1.創(chuàng)建AR視圖

_arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];

//2.設(shè)置視圖會話

_arSCNView.session = self.arSession;

//3.自動(dòng)刷新燈光(3D游戲用到,此處可忽略)

_arSCNView.automaticallyUpdatesLighting = YES;

}

return _arSCNView;

}

//MARK: -- 懶加載Session

- (ARSession *)arSession{

if (!_arSession) {

//1.創(chuàng)建會話

_arSession = [[ARSession alloc] init];

}

return _arSession ;

}

//MARK: -- 懶加載會話追蹤器

- (ARConfiguration *)arConfiguration{

if (!_arConfiguration) {

//1.創(chuàng)建世界追蹤會話配置(使用ARWorldTrackingSessionConfiguration效果更加好),需要A9芯片支持(6S以上)

ARWorldTrackingConfiguration *configuration =[[ARWorldTrackingConfiguration alloc] init];

configuration.planeDetection =ARPlaneDetectionHorizontal;

//2.設(shè)置追蹤方向(追蹤平面,后面會用到)

_arConfiguration = configuration;

//3.自適應(yīng)燈光(相機(jī)從暗到強(qiáng)光快速過渡效果會平緩一些)

_arConfiguration.lightEstimationEnabled = YES;

}

return _arConfiguration;

}

4. 將ARSCNView加載到視圖并運(yùn)行

[self.view addSubview:self.arSCNView];

[self.arSession runWithConfiguration:self.arConfiguration];


5. 點(diǎn)擊屏幕添加3D場景節(jié)點(diǎn)

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event

{

//1.使用場景加載scn文件(scn格式文件是一個(gè)基于3D建模的文件,使用3DMax軟件可以創(chuàng)建,這里系統(tǒng)有一個(gè)默認(rèn)的3D飛機(jī))

SCNScene *scene = [SCNScene sceneNamed:@"Models.scnassets/ship.scn"];

//2.獲取飛機(jī)節(jié)點(diǎn)

//所有的場景有且只有一個(gè)根節(jié)點(diǎn),其他所有節(jié)點(diǎn)都是根節(jié)點(diǎn)的子節(jié)點(diǎn)

SCNNode *shipNode = scene.rootNode.childNodes[0];

shipNode.position = SCNVector3Make(0, 0, 0 );//x/y/z/坐標(biāo)相對于世界原點(diǎn),也就是相機(jī)位置

//3.將飛機(jī)節(jié)點(diǎn)添加到當(dāng)前屏幕中

[self.arSCNView.scene.rootNode addChildNode:shipNode];

}

6. ARCamera在3D世界的位置,以此來調(diào)整加入的場景節(jié)點(diǎn)位置坐標(biāo)


位置坐標(biāo)示意圖

7. 運(yùn)行,就可以實(shí)現(xiàn)效果了。而且ARSCNView還有ARSCNViewDelegate的代理方法,實(shí)現(xiàn)代理方法,可以實(shí)現(xiàn)更好的交互體驗(yàn),這里我沒有更多地去深究。

注意

在網(wǎng)上搜索的一些代碼中會話追蹤配置用的是ARSessionConfiguration類,而且在Xcode 9正式發(fā)布后直接用ARConfiguration來代替的。


最后

這里我只是做了一個(gè)簡單的償試,并沒有更多的深究。

從ARKit可以看到未來將是3D的世界,多姿多彩的3D生活將帶慢慢開來。

Demo下載

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

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

  • 轉(zhuǎn)載請標(biāo)注出處:http://blog.csdn.net/u013263917/article/details/7...
    Jonath閱讀 563評論 0 1
  • 第一:什么是AR 增強(qiáng)現(xiàn)實(shí)AR, 將2D或者3D的元素添加到相機(jī)的實(shí)時(shí)視圖中, 就好像 這些元素居住在現(xiàn)實(shí)世界中...
    一朝風(fēng)月閱讀 678評論 0 0
  • ARKit ARKit框架通過集成iOS設(shè)備攝像頭和運(yùn)動(dòng)功能,在您的應(yīng)用程序或游戲中產(chǎn)生增強(qiáng)現(xiàn)實(shí)體驗(yàn)。 概述 增強(qiáng)...
    暗夜夜夜行路閱讀 5,994評論 0 17
  • 當(dāng)媽后,會慢慢覺得整個(gè)生活都變了。 醫(yī)院里 當(dāng)我像打了勝仗的將軍般凱旋回了病房后,感覺終于熬過了那漫長的疼痛,終于...
    冷血喵閱讀 225評論 0 0
  • 她坐在搖椅上,兩眼無神的看著前方,耳旁不時(shí)傳來悲傷的爆竹聲。就在一刻鐘以前,與她廝守了幾十年的老伴就這樣先她而...
    竹鴻初閱讀 533評論 2 8

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