iOS ARKit体验自定义

/ 0评 / 0

测试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

这样就可以直接使用了,来看一下效果~

评论已关闭。