ARKit基本使用流程
来源:互联网 发布:c语言汉诺塔递归 编辑:程序博客网 时间:2024/06/05 05:31
1.准备工作,创建对象
@property (nonatomic, strong) ARSession *session;//ARSessionConfigutation AR会话跟踪配置@property (nonatomic, strong) ARSessionConfiguration *configuration;//ARSCNView AR视图@property (nonatomic, strong) ARSCNView *scnView;//SCNNode 一个节点(模型)@property (nonatomic, strong) SCNNode *planeNode;
这里通过懒加载分别创建前三个对象,节点在需要的时候再创建。
- (ARSession *)session { if (!_session) { _session = [[ARSession alloc] init]; _session.delegate = self; } return _session;}//创建会话追踪配置- (ARSessionConfiguration *)configuration { if (!_configuration) { ARWorldTrackingSessionConfiguration *worldConfiguration = [[ARWorldTrackingSessionConfiguration alloc] init]; //设置检测平面,不需要检测的话不用设置 worldConfiguration.planeDetection = ARPlaneDetectionHorizontal; _configuration = worldConfiguration; //设置自适应灯光 _configuration.lightEstimationEnabled = YES; } return _configuration;}//创建AR视图- (ARSCNView *)scnView { if (!_scnView) { _scnView = [[ARSCNView alloc] initWithFrame:self.view.bounds]; _scnView.delegate = self; //指定会话 _scnView.session = self.session; //自动调节灯光 _scnView.automaticallyUpdatesLighting = YES; //显示状态信息 _scnView.showsStatistics = YES; //设置debug选项, //ARSCNDebugOptionShowFeaturePoints 显示捕捉到的特征点(小黄点) //ARSCNDebugOptionShowWorldOrigin 显示世界坐标原点(相机位置,3D坐标系) _scnView.debugOptions = ARSCNDebugOptionShowFeaturePoints; } return _scnView;}
2.显示视图,开启AR会话
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //把AR视图添加到当前视图上 [self.view addSubview:self.scnView]; //运行AR会话,摄像头开始追踪现实场景 [self.session runWithConfiguration:self.configuration];}
3.添加节点
- (void)addNode { //通过场景来加载3D模型文件 SCNScene *scene = [SCNScene sceneNamed:@"Models.scnassets/ship.scn"]; //获取场景中的飞机节点 SCNNode *node = scene.rootNode.childNodes[0]; //设置节点的位置,单位是米 长宽高 node.position = SCNVector3Make(0.1, 0.1, 0.1); //缩放 node.scale = SCNVector3Make(0.5, 0.5, 0.5); self.planeNode = node; //添加到当前场景中 [self.scnView.scene.rootNode addChildNode:node];}
4.检测平面
AR会话追踪配置中的设置:worldConfiguration.planeDetection = ARPlaneDetectionHorizontal;就是用来开启检测平面的功能的,目前只支持水平面的检测,不支持垂直平面。平面检测是根据摄像头采集到的特征点来判断的,当采集到足够多的特征点并且在同一水平面上,ARSession就会获取到一个ARPlaneAnchor(水平锚点,ARAnchor的子类,保存着水平面的位置信息),然后在这个锚点处添加一个节点,但这个节点是看不到的。通过ARSCNViewDelegate代理可以捕获这一事件。
//添加节点时候调用(当开启平地捕捉模式之后,如果捕捉到平地,ARKit会自动添加一个平地节点)- (void)renderer:(id <SCNSceneRenderer>)renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{ if ([anchor isMemberOfClass:[ARPlaneAnchor class]]) { NSLog(@"捕捉到平地"); //添加一个3D平面模型,ARKit只有捕捉能力,锚点只是一个空间位置,要想更加清楚看到这个空间,我们需要给空间添加一个平地的3D模型来渲染他 //1.获取捕捉到的平地锚点 ARPlaneAnchor *planeAnchor = (ARPlaneAnchor *)anchor; //2.创建一个3D物体模型 (系统捕捉到的平地是一个不规则大小的长方形,这里笔者将其变成一个长方形,并且是否对平地做了一个缩放效果) //参数分别是长宽高和圆角 SCNBox *plane = [SCNBox boxWithWidth:planeAnchor.extent.x*0.3 height:0 length:planeAnchor.extent.x*0.3 chamferRadius:0]; //3.使用Material渲染3D模型(默认模型是白色的,这里笔者改成红色) plane.firstMaterial.diffuse.contents = [UIColor redColor]; //4.创建一个基于3D物体模型的节点 SCNNode *planeNode = [SCNNode nodeWithGeometry:plane]; //5.设置节点的位置为捕捉到的平地的锚点的中心位置 SceneKit框架中节点的位置position是一个基于3D坐标系的矢量坐标SCNVector3Make planeNode.position =SCNVector3Make(planeAnchor.center.x, 0, planeAnchor.center.z); //self.planeNode = planeNode; [node addChildNode:planeNode]; //2.当捕捉到平地时,2s之后开始在平地上添加一个3D模型 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //1.创建一个花瓶场景 SCNScene *scene = [SCNScene sceneNamed:@"Models.scnassets/vase/vase.scn"]; //2.获取花瓶节点(一个场景会有多个节点,此处我们只写,花瓶节点则默认是场景子节点的第一个) //所有的场景有且只有一个根节点,其他所有节点都是根节点的子节点 SCNNode *vaseNode = scene.rootNode.childNodes[0]; //4.设置花瓶节点的位置为捕捉到的平地的位置,如果不设置,则默认为原点位置,也就是相机位置 vaseNode.position = SCNVector3Make(planeAnchor.center.x, 0, planeAnchor.center.z); vaseNode.scale = SCNVector3Make(0.02, 0.02, 0.02); //5.将花瓶节点添加到当前屏幕中 //!!!此处一定要注意:花瓶节点是添加到代理捕捉到的节点中,而不是AR试图的根节点。因为捕捉到的平地锚点是一个本地坐标系,而不是世界坐标系 [node addChildNode:vaseNode]; }); }}
参考链接:http://www.chinaar.com/ARKit/5218.html
阅读全文
0 0
- ARKit基本使用流程
- 2.ARKit 的工作流程
- NUnit基本使用流程
- git使用基本流程
- OpenAL 使用基本流程
- FFmepg基本使用流程
- Git基本使用流程
- ARKit
- ARKit
- ARKit之SpriteKit2D简单使用
- unity使用苹果ARKit-01:Unity-ARKit-Plugin unity使用苹果ARKit
- 使用OpenFOAM的基本流程
- 使用ALM的基本流程
- Fragment使用的基本流程
- 使用 ssm 框架,基本流程
- Eclipse使用Git基本流程
- SurfaceView的基本使用流程
- git的基本使用流程
- WUST OJ 1276: 峰峰不搞G
- 并发模型(二)——Master-Worker模式
- pygal输出png问题:dlopen() failed to load a library: cairo / cairo-2
- Android Recyclerview判断是否已经到底部或者顶部
- Android 客户端 MVP+Dagger2+Databinding+Rxjava+Retrofit+Okhttp3
- ARKit基本使用流程
- netty hello world
- SQL循环语句的几种方式
- HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结
- curses
- java 位运算
- xml之DOM解析
- 修改终端的hostName
- os_cpu.h