AR全称Augmented Reality(增强现实),是一种将虚拟3D场景加入到由摄像机捕捉到的3D现实场景当中的技术。AR是借助于AVFoundation和CoreMotion来实现这一效果的。
分为两个步骤来实现:
- 1.相机捕捉现实世界图像(由ARKit来完成)
- 2.在图像中现实3D模型(由Scenekit来完成)
实现原理:
1.ARCamera用相机捕捉真实世界图像,ARSCNView将相机捕捉到的界面图像作为3D场景,他们两者之间通过ARSession连接起来的。而ARSession需要指定一个为会话追踪配置的对象ARSessionConfiguration,我们使用其子类ARWorldTrackingConfiguration来跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时会交给ARSession去管理,该位置是一个类ARFrame,ARSession有对应的属性currentFrame。
2.ARSCNView继承于SCNView,SCNView是来显示3D场景的,SCNView又继承于UIView。SCNView有个类型为SCNScene的属性scene表示3D世界的场景(万物皆是Scene),SCNScene有个根节点类型为SCNNode的rootNode,任何3D模型都可看作成一个节点然后添加到根节点,这样就可以在3D场景中显示该3D模型了。结构图如下:
1798026-50bbc2f9a06fb069.png
相关代码如下:
override func viewDidLoad() {
super.viewDidLoad()
// 设置代理
sceneView.delegate = self
// 显示数据
sceneView.showsStatistics = true
//创建场景
let scene = SCNScene()
//创建球体模型,半径为0.1米
let sphere = SCNSphere(radius: 0.1)
//为模型添加渲染器
let material = SCNMaterial()
material.diffuse.contents = UIImage(named: "earth.jpg")
sphere.materials = [material]
//创建节点
let sphereNode = SCNNode(geometry: sphere)
//设置节点的位置
sphereNode.position = SCNVector3(0,0,-0.5)
//添加到场景的根节点上
scene.rootNode.addChildNode(sphereNode)
sceneView.scene = scene
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let configuration = ARWorldTrackingConfiguration()
//启动会话
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//停止会话
sceneView.session.pause()
}
效果如下:
CC211523FACD6914778A55FF5F90D337.jpg
网友评论