美文网首页
初识ARKit iOS卷

初识ARKit iOS卷

作者: 小沛2016 | 来源:发表于2017-12-07 18:08 被阅读0次

首先介绍几个经常出现的类

ARSCNView

ARSession

ARWorldTrackingConfiguration

SCNScene

SCNNode


ARSCNView

用于显示虚拟(3D模型)与现实(相机采集回来的数据)结合起来的view,传统的UIView并不能直接显示3D模型。

3D模型常常是.scn .dae .fbx格式

如果你创建了AR的工程 那么工程里会有一个小飞机的3D模型 在art.scnassets文件夹,名为ship.scn


ARSession

是用于管理相机类和会话类的

里面有不少代理方法 比如检测平面的代理回调


ARWorldTrackingConfiguration

继承ARConfiguration,但其更加专业

他可以设置一些场景的灯光效果、扑抓平面功能等

现在水平平面和竖直平面都可以检测了


SCNScene

它相当于一个容器,容器里有很多的节点,其实每个节点可以存放一个3D模型。


SCNNode

节点,它可以是在美工拿过来的模型(不规则),也可以是你自己用代码创建的模型(常常是规则的)


ARKit

这个框架主要是管理相机和相机铺抓到的画面
给SceneKit提供坐标和角度


SceneKit

这个框架才是管理3D模型

如果你想用纯代码创建一个AR工程,那么你应该把系统自动在Main.storyboard创建的ARSCNView给去掉

具体代码如下

//
//  ViewController.m
//  第三次敲这个代码
//
//  Created by jp on 4/12/17.
//  Copyright © 2017年 poco. All rights reserved.
//

#import "ViewController.h"

//导入框架
#import <ARKit/ARKit.h>
#import <SceneKit/SceneKit.h>

@interface ViewController () <ARSCNViewDelegate>

//视图
@property(nonatomic, strong) ARSCNView * jpARSCNView;

//会话
@property(nonatomic, strong) ARSession * jpARSession;

//跟踪会话
@property(nonatomic, strong) ARWorldTrackingConfiguration * jpARWTkConfiguration;

@end

    
@implementation ViewController


#pragma mark - 生命周期

- (void)viewDidLoad {
    [super viewDidLoad];

}

- (void)viewWillAppear:(BOOL)animated {
    
    [super viewWillAppear:animated];
    
    [self.view addSubview:self.jpARSCNView];
    
    //场景运行并且设置跟踪会话
    [self.jpARSession runWithConfiguration:self.jpARWTkConfiguration];
    
    [self addNode];
    
}

- (void)viewWillDisappear:(BOOL)animated {
    
    [super viewWillDisappear:animated];
    
    self.jpARWTkConfiguration = nil;
    self.jpARSession = nil;
    self.jpARWTkConfiguration = nil;
    
}

#pragma mark - 私有方法

- (void)addNode{
    
    SCNScene * jpSCNScene1 = [SCNScene sceneNamed:@"cup.scnassets/candle/candle.scn"];
    SCNScene * jpSCNScene2 = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
    SCNScene * jpSCNScene3 = [SCNScene sceneNamed:@"AAA.scnassets/chair/chair.scn"];
    
    //创建容器的时候 自动创建了根节点
    SCNNode * planeNode1 = jpSCNScene1.rootNode.childNodes[0];
    SCNNode * planeNode2 = jpSCNScene2.rootNode.childNodes[0];
    SCNNode * planeNode3 = jpSCNScene3.rootNode.childNodes[0];

    //设置位置
    planeNode1.position = SCNVector3Make(-0.5, -1, -1);
    planeNode2.position = SCNVector3Make(0, -1, -1);
    planeNode3.position = SCNVector3Make(1, -1, -1);

    //设置节点
    [self.jpARSCNView.scene.rootNode addChildNode:planeNode1];
    [self.jpARSCNView.scene.rootNode addChildNode:planeNode2];
    [self.jpARSCNView.scene.rootNode addChildNode:planeNode3];
}


#pragma mark - 访问器方法

- (ARSCNView *)jpARSCNView {
    
    if (_jpARSCNView == nil) {
        _jpARSCNView = [[ARSCNView alloc]init];
        _jpARSCNView.frame = self.view.frame;
        _jpARSCNView.session = self.jpARSession;
        _jpARSCNView.automaticallyUpdatesLighting = YES;
        
    }
    
    return _jpARSCNView;
}

- (ARSession *)jpARSession {
    
    if (_jpARSession == nil) {
        _jpARSession = [[ARSession alloc]init];
    }
    
    return _jpARSession;
    
}

- (ARWorldTrackingConfiguration *)jpARWTkConfiguration {
    
    if (_jpARWTkConfiguration == nil) {
        _jpARWTkConfiguration = [[ARWorldTrackingConfiguration alloc]init];
        _jpARWTkConfiguration.planeDetection = ARPlaneDetectionHorizontal;
        _jpARWTkConfiguration.lightEstimationEnabled = YES;
    
    }
    
    return _jpARWTkConfiguration;
    
}

@end

代码

相关文章

网友评论

      本文标题:初识ARKit iOS卷

      本文链接:https://www.haomeiwen.com/subject/rwkjixtx.html