明天凌晨苹果17年秋季发布会就开始了,相信大家都已经知道了发布会的一大亮点-AR,本文就介绍一下iOS AR开发,(第一次写文章,有什么问题大家多担待)
一、认识AR
首先让我们了解一下AR,VR以及MR的含义。
1、VR(Virtual Reality 虚拟现实),是近年来出现的高新技术。虚拟现实是利用电脑模拟产生一个三维空间的虚拟世界,提供视觉、听觉、触觉的感官模拟,让使用者如身临其境。
2、AR(Augmented Reality 增强现实),它通过电脑技术,将虚拟的信息应用到真实世界,真实的环境和虚拟的物体实时地叠加到了同一个画面或空间同时存在。 之后的文章主要介绍的就是学习在iOS手机端上如何开发AR效果的app。
3、MR(Mix reality 混合现实)通过全息图,将现实环境与虚拟环境相互混合,也可以看成是VR与AR的混合。
这里的AR技术就是在摄像机里把虚拟世界的产物与现实世界进行交互。
二、一个最最简单的AR项目
项目准备
Xcode9可以直接创建AR项目,如下图选中项:
这里语言用的是swift,content technology用的SceneKit
SceneKit 是 iOS中的一个3D引擎框架,代码中的一些类都是这个框架里面的。
此时,Xcode会自动为我们生成一段极其简洁的AR代码 代码如下:
设置场景
@IBOutlet var sceneView: ARSCNView!//这个是AR场景类
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self //设置代理
// Show statistics such as fps and timing information
sceneView.showsStatistics = true//是否显示底部的fps
// Create a new scene
let scene = SCNScene(named: "art.scnassets/ship.scn")!//场景赋予一张图片
// Set the scene to the view
sceneView.scene = scene//给场景视图添加场景
}
AR场景跑起来
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
//创建一个追踪设备配置(ARWorldTrackingSessionConfiguration主要负责传感器追踪手机的移动和旋转)
let configuration = ARWorldTrackingConfiguration()
// 开始启动ARSession会话(启动AR)
// Run the view's session
sceneView.session.run(configuration)
}
最简单的AR效果的demo就出来了
扩展一下
UIImageView *imgView = [UIImageView new];
imgView.image = [UIImage imageNamed:@"one"];//声明一张图片
创建一个平面几何图形,高为0.1米,宽为0.1米
SCNPlane *plane = [SCNPlane planeWithWidth:0.1 height:0.1];// 基于几何图形创建节点
SCNNode *node = [SCNNode nodeWithGeometry:plane]; // 节点的创建不仅仅是基于平面,根据SCNGeometry头文件里可见,长方体、圆球、圆锥、圆环、金字塔形 等等都可以创建。有兴趣的可以换着尝试一下。
node.position = SCNVector3Make(0, 0, -0.3); // 节点设置位置
创建渲染器
SCNMaterial *material = [SCNMaterial material];
material.diffuse.contents = imgView.image; // contents 属性可以设置很多东西,UILabel, UIImage,AVPlayer
node.position = SCNVector3Make(0, 0, -0.2);//设置图形的位置
plane.materials = @[material];//用渲染器对几何图形进行渲染
[scene.rootNode addChildNode:node];//添加节点
一个小猫的图片就在你的面前了
弄个球体视频怎么样?
SCNSphere *sphere = [SCNSphere sphereWithRadius:0.1];//创建半径为10cm的球体
NSURL *url = [NSURL URLWithString:@"http://images.apple.com/media/cn/apple-events/2016/5102cb6c_73fd_4209_960a_6201fdb29e6e/keynote/apple-event-keynote-tft-cn-20160908_1536x640h.mp4"];
AVPlayer *avplayer = [[AVPlayer alloc]initWithURL:url];
material.diffuse.contents = sphere
[avplayer play];
最后提醒一下大家,设置模型的位置要注意,为了让模型在我们面前显示,坐标z要设置为负的(单位是米)
node.position = SCNVector3Make(0, 0, -0.4);
三、介绍一下AR效果实现、ARKit相关
基础技术视觉惯性测量计
ARKit 使用视觉惯性测量计 (Visual Inertial Odometry, VIO) 来精准追踪周围的世界。VIO将摄像头的传感器数据同 Core Motion 数据进行融合。这两种数据允许设备能够高精度地感测设备在房间内的动作,而且无需额外校准。
场景识别与光亮估量
借助 ARKit,iPhone 和 iPad 可以分析相机界main中所呈现的场景,并在房间当中寻找水平面。 ARKit 不仅可以检测诸如桌面和地板之类的水平面,还可以在较宵特征点 (feature points) 上追踪和放置对象。ARKit 还利用摄像头传感器来估算场景当中的可见光总亮度,并为虚拟对象添加符合环境照明量的光量。
高性能硬件与渲染优化
ARKit 运 在 Apple A9 和 A10 处 器上。这些处理器能够为 ARKit 提供突破性的性能,从而可以实现快速场景识别,并且还可以让您基于现实世界场景,来构建详细并引人注目的虚拟内容。 您可以 Metal、Scenekit 以及诸如 Unity、虚幻引擎之类的第三方工具,来对 ARKit 进行优化。
ARKit的主要类别
1. ARSession类
这是一个单例,是ARKit的核心类,用于控制设备摄像头,处理传感器数据,对捕捉的图像进行分析等。
2. ARSessionConfiguration类
跟踪设备方向的一个基本配置, 在运行时,需要指定AR运行的配置
3. ARWorldTrackingSessionConfiguration类
配置跟踪设备的 向和位置,以及检测设备摄像头所看到的现实世界的表
4. ARSCNView类
用来增强相机通过 3D SceneKit 所捕捉到的内容并展示 AR 效果的一个 view
5. ARSKView类
来增强相机通过 2D SpriteKit 所捕捉到的内容并展 AR 效果的一个 view
6. ARAnchor类
真实世界的位置和方向, 用于在一个AR场景中放置一个物体
7. ARPlaneAnchor类
在一个AR Session 会话中检测一个真实世界中平面的位置和方向的相关信息
8. ARHitTestResult类
在一个AR Session会话中通过检测相机视图中的一个点来获取真实世界中表面的相关信息
9. ARFrame类
捕获一个视频图像和位置追踪信息作为一个AR 会话的一部分。
10. ARCamera类
在一个AR会话中摄像机的位置和成像特征信息为捕获视频帧
11. ARLightEstimate类
在一个AR会话中估计场景照明信息关联到一个捕获的视频帧
ARKit工作完整流程
(以下转自http://blog.csdn.net/u013263917/article/details/73038519)
1.ARSCNView加载场景SCNScene
2.SCNScene启动相机ARCamera开始捕捉场景
3.捕捉场景后ARSCNView开始将场景数据交给Session
4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
5.给ARSCNView的scene添加一个子节点(3D物体模型)
ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置
在3D坐标系统中,有一个世界坐标系和一个本地坐标系。类似于UIView的Frame和Bounds的区别,这种坐标之间的转换可以说是ARKit中最难的部分
ARKit框架工作流程可以参考下图:
下一篇预告 简易太阳系