前言
苹果于9月20日推出了iOS 11,带来了AR(虚拟增强现实)功能。更新到Xcode 9之后就可以进行开发,我也迫不急待地去搜索一翻,然后好好体验一翻。
起初在网上找了一个代码,直接打开就提示错误Unknown type name 'ARSessionConfiguration'。ARSessionConfiguration 无法识别(未定义的类),其实只是Xcode 9正式发后就直接用ARConfiguration来实现的,把它替换了就OK。
简单理解
SpriteKit(iOS 7新增))和SceneKit(iOS 8新增)都是基于游戏开发的框架,SpriteKit是类似于类似cocos2d,而SceneKit就是3D游戏开发,AR(虚拟增强现实)就需要靠它来实现。ARKit用来实现相机捕捉现实世界图像,SceneKit则将图像显示成虚拟3D模型。
ARKit 和SceneKit的一些关系: 1.视图类存在继承关系。ARKit框架中3D虚拟增强现实的视图ARSCNView是继承于SceneKit中的SCNView,当然最终都继承于UIVIiew的。UIView是将视图简单地显示,而且SCNView就将显示以3D场景显示出来,相当于SCNView存在视图渲染和增加效果。2.ARKit负责将真实世界画面转变为一个3D场景,其中ARCamera负责捕捉实现的画面,ARSesson负责搭建3D场景,将3D场景和实现画面统一显示就是依靠继承于具有显示3D视图显示能力视图SCNView的ARSCNView来实现。3.现实在3D场景的SceneKit中的虚拟物体,每一个都是一个节点SCNNode,每一个节点构成了一个场景SCNScene,无数个场景构成了3D世界。4.总之,ARKit和SceneKit是不可分割的,ARKit算是为了实现相机的3D虚拟增强现实功能而提炼出来的。获取3D虚拟现实的原料完全是靠ARKit,而实现3D虚拟现实视图的显示功能,还是靠SceneKit,只不过用了继承关系来依赖和使用的。
在图片中搜索到的关系图可以很好地说明ARKit 和SceneKit的关系
简单使用
1.导入框架
#import
#import
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.创建AR视图
_arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
//2.设置视图会话
_arSCNView.session = self.arSession;
//3.自动刷新灯光(3D游戏用到,此处可忽略)
_arSCNView.automaticallyUpdatesLighting = YES;
}
return _arSCNView;
}
//MARK: -- 懒加载Session
- (ARSession *)arSession{
if (!_arSession) {
//1.创建会话
_arSession = [[ARSession alloc] init];
}
return _arSession ;
}
//MARK: -- 懒加载会话追踪器
- (ARConfiguration *)arConfiguration{
if (!_arConfiguration) {
//1.创建世界追踪会话配置(使用ARWorldTrackingSessionConfiguration效果更加好),需要A9芯片支持(6S以上)
ARWorldTrackingConfiguration *configuration =[[ARWorldTrackingConfiguration alloc] init];
configuration.planeDetection =ARPlaneDetectionHorizontal;
//2.设置追踪方向(追踪平面,后面会用到)
_arConfiguration = configuration;
//3.自适应灯光(相机从暗到强光快速过渡效果会平缓一些)
_arConfiguration.lightEstimationEnabled = YES;
}
return _arConfiguration;
}
4. 将ARSCNView加载到视图并运行
[self.view addSubview:self.arSCNView];
[self.arSession runWithConfiguration:self.arConfiguration];
5. 点击屏幕添加3D场景节点
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
//1.使用场景加载scn文件(scn格式文件是一个基于3D建模的文件,使用3DMax软件可以创建,这里系统有一个默认的3D飞机)
SCNScene *scene = [SCNScene sceneNamed:@"Models.scnassets/ship.scn"];
//2.获取飞机节点
//所有的场景有且只有一个根节点,其他所有节点都是根节点的子节点
SCNNode *shipNode = scene.rootNode.childNodes[0];
shipNode.position = SCNVector3Make(0, 0, 0 );//x/y/z/坐标相对于世界原点,也就是相机位置
//3.将飞机节点添加到当前屏幕中
[self.arSCNView.scene.rootNode addChildNode:shipNode];
}
6. ARCamera在3D世界的位置,以此来调整加入的场景节点位置坐标
7. 运行,就可以实现效果了。而且ARSCNView还有ARSCNViewDelegate的代理方法,实现代理方法,可以实现更好的交互体验,这里我没有更多地去深究。
注意
在网上搜索的一些代码中会话追踪配置用的是ARSessionConfiguration类,而且在Xcode 9正式发布后直接用ARConfiguration来代替的。
最后
这里我只是做了一个简单的偿试,并没有更多的深究。
从ARKit可以看到未来将是3D的世界,多姿多彩的3D生活将带慢慢开来。
Demo下载