第一:什么是AR
- 增强现实AR, 将2D或者3D的元素添加到相机的实时视图中, 就好像 这些元素居住在现实世界中;
- ARKit结合了设备运动跟踪,相机场景拍摄,高级场景处理和显示,简化了AR体验的任务,这是官方的解释: 就是让虚拟内容是真实世界的一部分的错觉。
第二:开发AR
- 首先要开发AR, 需要具备A9以上的芯片设备,iPhone6S以上。
如果app是以AR开发为主的:请使用应用程序Info.plist中ARKit的UIRequiredDeviceCapabilities部分中的键。
如果增强现实是应用程序的辅助功能,使用isSupported 来判断是否支持设备。 - 其次要理解一个概念: 在所有AR体验中,ARKit使用坐标系,遵循:y轴向上,z轴指向观察者,x轴指向观看者的右侧。右手系坐标原则:
这里有篇文章写的很好 关于MAC, IOS的坐标系。
创建工程
SceneKit: SceneKit底层实现使用Metal和OpenGL, 苹果这个封装狂魔封装起来的一套高性能3D图形框架;
SpeiteKit: SpeiteKit是Ios7引入的一套主要开发2D游戏的框架, 通过支持自定义OpenGL ES着色器和照明,可以与SceneKit集成;
Metal: Metal是一套直接访问图形处理单元(GPU)编程的高效框架, 非常底层, 接近Metal(金属板了);
最后点击next创建好工程:
运行后会通过摄像机看到有一个3D的立体模型出现在眼前, 再看代码:
class ViewController: UIViewController, ARSCNViewDelegate {//VC遵循ARSCNView代理
@IBOutlet var sceneView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self
//Show statistics such as fps and timing information
sceneView.showsStatistics = true
// Create a new scene
let scene = SCNScene(named: "art.scnassets/ship.scn")!
// Set the scene to the view
sceneView.scene = scene
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
let configuration = ARWorldTrackingConfiguration()
// Run the view's session
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Pause the view's session
sceneView.session.pause()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
}
通过代码了解一些基本概念。
- SCNView: 主要是显示SceneKit的3D模型, 显示3D场景,继承自UIView; showsStatistics 是否显示统计数据, 场景中最下面的绿条
- ARSCNView:将相机捕捉到的界面作为3D场景,继承自SCNView
- ARSession:管理相机设备和AR体验所需要的处理的对象,包括从设备的运动感测硬件读取数据,控制设备的内置相机,以及对捕获的相机图像执行图像分析。会话综合了所有这些结果,以建立设备居住的真实世界空间与模拟AR内容的虚拟空间之间的对应关系。简单来说调动现实硬件, 结合虚拟软件,建立关系。通过ARSCNView管理这个会话。
- ARCamera:被称为照相机,通过照相机捕捉真实世界的图像。被ARSession调用。
- SCNScene:就是在是视图上所需要放置的场景, 万物皆场景。是SCNView的属性;
- SCNNode:称为节点,场景是由无数个节点组成, 他有自己的位置和坐标系统,我们会把几何模型, 灯光效果等添加到节点上, 又称万物皆节点。每一个Scene都有一个跟节点rootNode。
-
ARConfiguration:AR会话配置的的抽象基类:它可以增加AR体验,设置了配置对象的属性,并将配置传递给会话的方法。
要运行ARSession,首先创建一个具体的ARConfiguration子类的实例:
ARKit包括以下具体配置类:
ARWorldTrackingConfiguration
提供高品质的AR体验,使用后置摄像头精确跟踪设备的位置和方向,并允许平面检测和打击测试。
AROrientationTrackingConfiguration
提供使用后置摄像头并仅跟踪设备方向的基本AR体验。
ARFaceTrackingConfiguration
提供使用前置摄像头并跟踪用户脸部的移动和表情的AR体验。
总结如下图:
通过代码和概念:可以总结启动AR的步骤:
- 通过ARSCNView加载SCNScene场景;
- SCNScene启动相机ARCamera捕捉现实场景;
- 捕捉场景后ARSCNView将场景数据传递给ARSession;
- ARSession通过管理ARSessionConfiguration实现场景追踪;
- 给ARSCNView的scene添加一个子节点(3D物体模型);
写一个简单Demo, AR播放视频
- 给一个本地的视频url:
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self
sceneView.showsStatistics = false;
//本地视频URL
let bundlePath = Bundle.main.url(forResource: "驯龙记.mp4", withExtension: nil)
//首先创建一个创景:
let scene = SCNScene()
//创建一个平面的几何
let plane = SCNPlane.init(width: 0.664, height: 0.375);
//初始一个渲染器
let materials = SCNMaterial()
//创建player
let player = AVPlayer.init(url: bundlePath!)
//渲染器扩散接受内容
materials.diffuse.contents = player
//设置渲染器
plane.materials = [materials]
//设置节点
let node = SCNNode(geometry: plane)
//节点位置
node.position = SCNVector3(0, 0, -1.0)
//设置根节点
scene.rootNode.addChildNode(node);
//播放
player.play()
sceneView.scene = scene
}
完成
其中
node.position = SCNVector3(0, 0, -1.0)
坐标z轴, 正值朝向观察者, 负值是正面可以观察到的;
渲染器接受到的内容:
materials.diffuse.contents = ?
//可以是一种颜色(NSColor,UIColor,CGcolorRef)
//可以是图像(NSImage, UIImage, CGImageRef)
//可以是CALayer
//可以是路径 (NSString or NSURL)
//可以是场景SKScene SKTexture
//可以是二维码: AVCaptureDevice;( iOS 11以上)
//可以是AVPlayer;
//设置颜色的动画