前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初识ARKit iOS卷

初识ARKit iOS卷

原创
作者头像
发布2018-05-04 09:48:56
1.7K4
发布2018-05-04 09:48:56
举报
文章被收录于专栏:浅探ARKit

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

#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给去掉

具体代码如下

代码语言:txt
复制
//
//  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

代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档