首先介绍几个经常出现的类
#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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。