前言
蘋果于9月20日推出了iOS 11框产,帶來了AR(虛擬增強現(xiàn)實)功能。更新到Xcode 9之后就可以進行開發(fā)错洁,我也迫不急待地去搜索一翻秉宿,然后好好體驗一翻。
起初在網(wǎng)上找了一個代碼屯碴,直接打開就提示錯誤Unknown type name 'ARSessionConfiguration'描睦。ARSessionConfiguration 無法識別(未定義的類),其實只是Xcode 9正式發(fā)后就直接用ARConfiguration來實現(xiàn)的导而,把它替換了就OK忱叭。
簡單理解
SpriteKit(iOS 7新增))和SceneKit(iOS 8新增)都是基于游戲開發(fā)的框架,SpriteKit是類似于類似cocos2d今艺,而SceneKit就是3D游戲開發(fā)韵丑,AR(虛擬增強現(xiàn)實)就需要靠它來實現(xiàn)。ARKit用來實現(xiàn)相機捕捉現(xiàn)實世界圖像虚缎,SceneKit則將圖像顯示成虛擬3D模型撵彻。
ARKit 和SceneKit的一些關(guān)系: 1.視圖類存在繼承關(guān)系。ARKit框架中3D虛擬增強現(xiàn)實的視圖ARSCNView是繼承于SceneKit中的SCNView,當然最終都繼承于UIVIiew的陌僵。UIView是將視圖簡單地顯示轴合,而且SCNView就將顯示以3D場景顯示出來,相當于SCNView存在視圖渲染和增加效果碗短。2.ARKit負責將真實世界畫面轉(zhuǎn)變?yōu)橐粋€3D場景值桩,其中ARCamera負責捕捉實現(xiàn)的畫面,ARSesson負責搭建3D場景豪椿,將3D場景和實現(xiàn)畫面統(tǒng)一顯示就是依靠繼承于具有顯示3D視圖顯示能力視圖SCNView的ARSCNView來實現(xiàn)。3.現(xiàn)實在3D場景的SceneKit中的虛擬物體携栋,每一個都是一個節(jié)點SCNNode,每一個節(jié)點構(gòu)成了一個場景SCNScene,無數(shù)個場景構(gòu)成了3D世界搭盾。4.總之,ARKit和SceneKit是不可分割的婉支,ARKit算是為了實現(xiàn)相機的3D虛擬增強現(xiàn)實功能而提煉出來的鸯隅。獲取3D虛擬現(xiàn)實的原料完全是靠ARKit,而實現(xiàn)3D虛擬現(xiàn)實視圖的顯示功能向挖,還是靠SceneKit蝌以,只不過用了繼承關(guān)系來依賴和使用的。
在圖片中搜索到的關(guān)系圖可以很好地說明ARKit 和SceneKit的關(guān)系
簡單使用
1.導入框架
#import <SceneKit/SceneKit.h>
#import <ARKit/ARKit.h>
2. 定義屬性
//AR視圖何之,展示3D頁面
@property(nonatomic,strong)ARSCNView *arSCNView;
//AR會話跟畅,負責管理相機追蹤配置及3D相機坐標
@property(nonatomic,strong)ARSession *arSession;
//會話追蹤配置:負責追蹤相機的運動
@property(nonatomic,strong)ARConfiguration *arConfiguration;
3. 我用懶加載的方法進行初始化
//MARK: -- 懶加載AR視圖
- (ARSCNView *)arSCNView{
? if (!_arSCNView) {
//1.創(chuàng)建AR視圖
_arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
//2.設(shè)置視圖會話
_arSCNView.session = self.arSession;
//3.自動刷新燈光(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.自適應燈光(相機從暗到強光快速過渡效果會平緩一些)
_arConfiguration.lightEstimationEnabled = YES;
}
return _arConfiguration;
}
4. 將ARSCNView加載到視圖并運行
[self.view addSubview:self.arSCNView];
[self.arSession runWithConfiguration:self.arConfiguration];
5. 點擊屏幕添加3D場景節(jié)點
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
//1.使用場景加載scn文件(scn格式文件是一個基于3D建模的文件,使用3DMax軟件可以創(chuàng)建蒜危,這里系統(tǒng)有一個默認的3D飛機)
SCNScene *scene = [SCNScene sceneNamed:@"Models.scnassets/ship.scn"];
//2.獲取飛機節(jié)點
//所有的場景有且只有一個根節(jié)點虱痕,其他所有節(jié)點都是根節(jié)點的子節(jié)點
SCNNode *shipNode = scene.rootNode.childNodes[0];
shipNode.position = SCNVector3Make(0, 0, 0 );//x/y/z/坐標相對于世界原點,也就是相機位置
//3.將飛機節(jié)點添加到當前屏幕中
[self.arSCNView.scene.rootNode addChildNode:shipNode];
}
6. ARCamera在3D世界的位置辐赞,以此來調(diào)整加入的場景節(jié)點位置坐標
7. 運行部翘,就可以實現(xiàn)效果了。而且ARSCNView還有ARSCNViewDelegate的代理方法响委,實現(xiàn)代理方法新思,可以實現(xiàn)更好的交互體驗,這里我沒有更多地去深究晃酒。
注意
在網(wǎng)上搜索的一些代碼中會話追蹤配置用的是ARSessionConfiguration類表牢,而且在Xcode 9正式發(fā)布后直接用ARConfiguration來代替的。
最后
這里我只是做了一個簡單的償試贝次,并沒有更多的深究崔兴。
從ARKit可以看到未來將是3D的世界,多姿多彩的3D生活將帶慢慢開來。