简介
增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。
ARKit是基于AVFoundation框架和CoreMotion框架的
所需
- A9以上设备 (不支持模拟器)se 6s 6sp 7 7p
- xcode9 bates,iOS11,xcode9
特性
- 追踪:追踪现实和虚拟场景
- 全局追蹤:追踪现实场景和虚拟场景,就像真实的存在现实中
- 视觉惯性测距VIO:肉眼看到效果,远离所需,拉近放大
- 没有外部设置:不需要外部设备(投影仪等)
- 场景理解:
- 平面监测:现实世界都是有细小的平面构成
- 命中测试:两个物件发生接触,产生一些反应
- 光估计:用光照的方法,让物体更逼真。比如影子
- 渲染
- 简单集合:用xcode自带的可以实现渲染。SceneKit(iOS8出现、3d场景)、SpriteKit(iOS7出现,2d场景)2D、Metal(iOS7出现,不支持模拟器)
- AR视图:ARview,物件以arView的形式出现
- 自定义渲染:可以使用其他引擎渲染,支持(Unity、Unreal)
运行原理
相机捕捉显示世界->arkit
显示3D模型->SceneKit
通过AR回话->ARSession使两者交互
坐标
x,y,z
是以相机的位置为中心,所以轴的负值标识我们正前方,正值表示我们的后方(后脑勺)
单位是米
ARSession
- 使用之前设置一个追踪ARSessionConfiguration(来追踪设备方向的基本配置)
- 通过run方法启用
- 来处理是用来管理设备相机的共享对象(AVCaptureSession)和增强现实所需的处理(CMMotionmanager)
- 最终生成一个一个的frame展示
基本步骤
- ARSCNView加载场景SCNScene
- SCNScene启动相机ARCamera开始捕捉场景
- 捕捉场景后ARSCNView开始将场景数据交给Session
- Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
- 给ARSCNView的scene添加一个子节点(3D物体模型)
入门掌握四大基础点
- 几何
- 节点
- 渲染
- 手势
demo
- 用到的关键类:
- 场景视图(ARSCNView)
- 场景(SCNScene)
- 几何(SCNGeometry)
- 节点(SCNNode)
- 渲染器(SCNMaterial)
- 如何在空间中放一个平面
- 创建场景视图 ARSCNView,设置代理
- 创建一个场景 SCNScene,给场景视图绑定场景
- 创建一个平面几何形状 (box,plane)
- 基于几何形状创建一个节点SCNNode
- 创建一个渲染器SCNMaterial,用其对平面几何进行渲染
- 添加节点到场景的根节点中
demo1
-
打开Xcode9bete版本,新建一个工程,选择Augmented Reality APP(Xcode9新增),点击next
-
选择SceneKit
此时,Xcode会自动为我们生成一段极其简洁的AR代码
效果图后面补上
demo2
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
//1.设置场景代理
sceneView.delegate = self
// Show statistics such as fps and timing information
sceneView.showsStatistics = true
//2.创建场景
let scene = SCNScene()
//3.创建几何
let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
//4. 渲染 渲染器可以决定怎样渲染,这个 contents属性可以设置很多东西,UILabel, UIImage,甚至 AVPlayer都可以
let material = SCNMaterial() //
material.diffuse.contents = UIColor.red
// material.diffuse.contents = UIImage(named: "brick.png")
//5.对几何进行渲染
box.materials = [material]
// 6. 创建节点
let boxNode = SCNNode(geometry: box)
// 7.设置节点位置
boxNode.position = SCNVector3(0,0,-0.2)
// 8. 把节点放到根节点上
scene.rootNode.addChildNode(boxNode)
sceneView.scene = scene
}
这样就能我们面前就有一个红色的长宽高都是0.1m的正方体盒子