测试ARKit,创建的时候直接选择AR图标就可以创建一个AR项目,运行之后转动手机就能看到一个飞机(注意:只支持A9以上处理器,也就是6S)
而我这里使用的是Single View App
自定义一个controller,引入库文件
//3D游戏框架
#import
//ARKit框架
#import
声明一下变量,一个完整的ARKit工作环境必须要搭建三个对象:ARSCNView(一旦创建,系统会帮我们创建一个场景Scene和相机),ARSession(开启AR和关闭AR都是靠它),ARSessionConfiguration(少了会话追踪配置,AR会话是无法独立工作的)
//AR视图:展示3D界面
@property(nonatomic,strong) ARSCNView *arSCNView;
//AR会话,负责管理相机追踪配置及3D相机坐标
@property(nonatomic,strong) ARSession *arSession;
//会话追踪配置:负责追踪相机的运动
@property(nonatomic,strong) ARWorldTrackingConfiguration *arSessionConfiguration;
//飞机3D模型(本小节加载多个模型)
@property(nonatomic,strong)SCNNode *planeNode;
下面就可以创建视图了
/***这里需要特别注意的是,最好将开启ARSession的代码放入viewDidAppear而不是viewDidLoad中,这样可以避免线程延迟的问题。开启ARSession的代码可不可以放入viewDidLoad中呢?答案是可以的,但是笔者不建议大家那么做***/
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
//1.将AR视图添加到当前视图
[self.view addSubview:self.arSCNView];
//2.开启AR会话(此时相机开始工作)
[self.arSession runWithConfiguration:self.arSessionConfiguration];
}
- (void)touchesBegan:(NSSet* )touches withEvent:(UIEvent* )event{
//1.使用场景加载scn文件(scn格式文件是一个基于3D建模的文件,使用3DMax软件可以创建,这里系统有一个默认的3D飞机)--------在右侧我添加了许多3D模型,只需要替换文件名即可
SCNScene *scene = [SCNScene sceneNamed:@"Tests.scnassets/001.dae"];
//2.获取飞机节点(一个场景会有多个节点,此处我们只写,飞机节点则默认是场景子节点的第一个)
//所有的场景有且只有一个根节点,其他所有节点都是根节点的子节点
SCNNode *shipNode = scene.rootNode.childNodes[0];
shipNode.transform = SCNMatrix4MakeScale(0.3, 0.3, 0.3);
shipNode.position = SCNVector3Make(-1, -1, -1);//x/y/z/坐标相对于世界原点,也就是相机位置
//3.将飞机节点添加到当前屏幕中
[self.arSCNView.scene.rootNode addChildNode:shipNode];
// self.arSCNView.allowsCameraControl = YES;
}
//懒加载会话追踪配置
- (ARWorldTrackingConfiguration *)arSessionConfiguration{
if (_arSessionConfiguration != nil) {
return _arSessionConfiguration;
}
//1.创建世界追踪会话配置(使用ARWorldTrackingSessionConfiguration效果更加好),需要A9芯片支持
ARWorldTrackingConfiguration *configuration = [[ARWorldTrackingConfiguration alloc] init];
//2.设置追踪方向(追踪平面,后面会用到)
configuration.planeDetection = ARPlaneDetectionHorizontal;
_arSessionConfiguration = configuration;
//3.自适应灯光(相机从暗到强光快速过渡效果会平缓一些)
_arSessionConfiguration.lightEstimationEnabled = YES;
return _arSessionConfiguration;
}
//懒加载拍摄会话
- (ARSession *)arSession{
if(_arSession != nil){
return _arSession;
}
//1.创建会话
_arSession = [[ARSession alloc] init];
//2返回会话
return _arSession;
}
//创建AR视图
- (ARSCNView *)arSCNView{
if (_arSCNView != nil) {
return _arSCNView;
}
//1.创建AR视图
_arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
//2.设置视图会话
_arSCNView.session = self.arSession;
//3.自动刷新灯光(3D游戏用到,此处可忽略)
_arSCNView.automaticallyUpdatesLighting = YES;
return _arSCNView;
}
细心的同志可以注意到我这里用的是dae文件,而不是系统的scn文件,dae比较通用,很多的建模软件都支持导出dae,我用的blender,一个跨平台的开源建模工具,我这里只是举了一个例子
(1)在Blender中新建场景
(2)在右上侧栏中将自动生成的Cube、Camera等3个物体删掉
(3)导入我们已有的模型文件
(4)调整我们的模型文件的方向、大小
(5)在右上侧栏更改模型文件及子文件的名字为你要导出的dae文件的名字(这一步很重要!)
(6)在左侧栏中Edit Options中点击Smooth
(7)File->export->dae
(8)在接下来的页面中,我们选择导出的位置和文件的名字,并且在左侧选项Texture中选择include material texture(同样重要!)
但是导出的dae文件是不能直接用的,要经过系统工具的处理,其实就两个工具,在下面的路径中
/Applications/Xcode.app/Contents/Developer/usr/bin/
copySceneKitAssets 和 scntool
复制到工程下资源文件夹所在目录,将dae文件放置在Test.scnassets文件夹中(文件夹重命名),shell命令行中执行下列命令,不报错则成功
./copySceneKitAssets Test.scnassets -o Tests.scnassets
这样就可以直接使用了,来看一下效果~