iOS开发-AR初探

news/2024/7/8 4:20:54

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

工具

  • Xcode9
  • iOS 11

新建工程

到这里,你什么都不需要做,启动项目就可以看见一架飞机。

关键词和关键类

  • 关键词:场景视图,场景,几何,节点,渲染器(都是直译过来的,根据类名自行理解)
  • 关键类:ARSCNView 、 SCNScene、 SCNGeometry、 SCNNode 、 SCNMaterial

如何在空间中放一个平面?

  1. 创建场景视图 ARSCNView ,设置代理
  2. 创建一个场景 SCNScene,给场景视图绑定场景
  3. 创建一个平面几何形状 SCNPlane (继承于SCNGeometry )
  4. 基于几何形状创建一个节点SCNNode
  5. 创建一个渲染器SCNMaterial, 用其对平面几何进行渲染
  6. 添加节点到场景的根节点中 
    总之,将关键类进行组装,苹果 API 一贯的手法。

废话不多说,直接上代码

@interface ViewController () <ARSCNViewDelegate>
// 创建场景视图 这个控件默认已经添加好了,当然也可以手动添加
@property (nonatomic, strong) IBOutlet ARSCNView *sceneView;

@property (nonatomic, strong) AVPlayer *player;
@end

    
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.设置场景视图的代理
    self.sceneView.delegate = self;
    // 是否显示fps 或 timing等信息
    self.sceneView.showsStatistics = YES;
    //2. 创建场景
    SCNScene *scene = [SCNScene scene];
    //2.1  给场景视图绑定场景
    self.sceneView.scene = scene;
    //3.  创建一个平面几何图形,高为0.1米,宽为0.1米
    SCNPlane *plane = [SCNPlane planeWithWidth:0.1 height:0.1];
    //4.  基于几何图形创建节点
    SCNNode *node = [SCNNode nodeWithGeometry:plane]; //  节点的创建不仅仅是基于平面,根据SCNGeometry头文件里可见,长方体、圆球、圆锥、圆环、金字塔形 等等都可以创建。有兴趣的可以换着尝试一下。
    node.position = SCNVector3Make(0, 0, -0.3); // 节点设置位置
    //5.  创建渲染器
    SCNMaterial *material = [SCNMaterial material];
    // 注意,这里对渲染器做点事,渲染的不再是颜色,而是视频
//    NSURL *url = [NSURL URLWithString:@"mp4.mp4"];
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"mp4"];
    //  创建AVPlayer准备渲染
    AVPlayer *player = [AVPlayer playerWithURL:url];
    material.diffuse.contents = player;   //  渲染器可以决定怎样渲染,这个 contents 属性可以设置很多东西,UILabel, UIImage,甚至 AVPlayer 都可以
    node.position = SCNVector3Make(0, 0, -0.3);
    //5.5. 用渲染器对几何图形进行渲染
    plane.materials = @[material];
    //6. 为场景的根节点添加节点
    [scene.rootNode addChildNode:node];
    [player play];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    // Create a session configuration
    ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new];

    // Run the view's session
    [self.sceneView.session runWithConfiguration:configuration];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    // Pause the view's session
    [self.sceneView.session pause];
}

 

转载于:https://my.oschina.net/zsyzone/blog/1647682


http://www.niftyadmin.cn/n/4636562.html

相关文章

linux 不重启识别新添加的硬盘

1.fdisk -l 看有没有新的磁盘 oebiotechhadoop08:/media/nbc9$ sudo fdisk -l |grep sdl 2.查看主机总线 oebiotechhadoop08:/media/nbc9$ ls /sys/class/scsi_host/host0 3.重新扫描scsi总线发现设备 echo "- - -" > /sys/class/scsi_host/host0/scan 4.fdisk -l…

Android 实现边听边录音探究

为什么80%的码农都做不了架构师&#xff1f;>>> 你需要有一些关于音频的基本认识&#xff0c;如果你还不是很了解&#xff0c;建议先阅读前面两篇文章。 写给小白的音频认识基础Android上一种效果奇好的混音方法介绍场景描述 音乐中只有一种声音有时候很单薄的&…

vue.js除了动态路由,前端权限还可以这么玩

索引 概述基于指令基于组件权限的定义概述 关于动态路由的相关处理&#xff0c;请参考本人的另一篇文章vue.js前后端分离后台&#xff0c;该如何根据用户权限处理前端显示和后台接口访问&#xff0c;本文作为上一篇的续作有时候仅处理菜单&#xff0c;是不够的&#xff0c;很多…

如何根据页面高度让dropdown的方向自适应

根据需要&#xff0c;下拉框要根据距离底边的高度来决定&#xff0c;下拉框的方向 如图所示 正常显示 这是页面的高度不是足够高的时候改变方向显示 html代码&#xff1a; //用来点击显示dropdown的按钮<drop-box-anchor (click)"adjustPositionOfDropDown($event)&qu…

新建虚拟机相关操作

假设&#xff1a;磁盘为 /dev/xvda;创建分区为:/dev/xvda3;vg名称为vg_svr110一、修改主机名vi /etc/sysconfig/network修改hostname项&#xff0c;将XXX.wuhunews的前缀改为适当内容&#xff0c;保存退出二、修改IP地址vi /etc/sysconfig/network-scripts/ifcfg-eth0将IPADDR…

在react-native中使用redux

redux是什么? redux是一个用于管理js应用状态的容器。redux出现时间并不是很长&#xff0c;在它出现之前也有类似功能的模块出现&#xff0c;诸如flux等等。redux设计的理念很简单&#xff0c;似乎最初这个开发团队就有让redux可以方便融入在server, browser, mobile client端…

使用vue写的计算器demo

calculator 一个vue实现的简单计算器 技术栈 [x] vue[x] webpack[x] AlloyFinger[x] vue computed实现的效果 [x] 左右滑动切换主题[x] 整数位大于3位自动添加逗号[x] 输入加减乘除符号直接计算结果[x] 清除所有数据[x] 退格[ ] 按钮动画[x] 在输出结果之后不能退格bug [x] 在手…

【无标题】用C语言写一个学生成绩和信息管理系统,实现操作界面、清屏显示当前操作功能以及从文件读入和从键盘输入学生信息功能,并在操作结束后将学生信息写入文件,功能及代码展示如下:

学生成绩管理系统 功能介绍: 该程序可实现对学生学号以及多门成绩的记录&#xff1b;本程序以三门课为例. 进入程序后选择学生成绩和信息输入方式&#xff1a; 1.通过从student_file.txt文件读出&#xff0c;首先输入学生的科目&#xff0c;然后将学生信息读到结构体中&#…