一、什么是ARKit
AR(Augmented Reality),即虚拟增强现实技术,也就是将虚拟的计算机图形和真实环境结合的技术
ARKit能支持苹果所谓的“世界追踪”(world tracking)特性。以识别场景图像中的显著特征,从视频的每一帧中跟踪这些特征位置的差异,并将该信息与运动感测数据进行比较,从而得到设备的位置和运动的高精度模型。
“World tracking”还可以分析和理解场景中的内容。寻找与相机画面中的点对应的真实世界表面,检测相机画面中的平面,并报告位置和尺寸,然后在这个平面放置内容,并与场景中的虚拟内容进行交互。
在iOS11系统上,ARKit正式成为iOS系统框架,让开发者能够使用OC或swift语言就能开发AR App。
二、ARKit开发要求
Xcode 9或以上,iOS 11以及硬件设备A9处理器以上(6s以上机型)
三、ARKit实现原理
相机捕捉现实世界(ARkit),显示3D模型(sceneKit)
其中ARSession用于管理设备相机的共享对象和增强现实体验所需运动处理
ARSessionConfiguration跟踪设备方向,ARFrame捕获图像,追踪场景信息
原理如下图:
- 打开xcode 9,新建一个工程,选择Augmented Rdeality App
- 选择SceneKit
创建一个新的SCNScene
let scene = SCNScene() sceneView.scene = scene
创建几何模型
let sphere = SCNSphere(radius: 0.1)
- 渲染
let material = SCNMaterial()
material.diffuse.contents = UIImage(named:"earth.jpg")
sphere.materials = [material]
- 设置根节点
let sphereNode = SCNNode(geometry: sphere)
//设置节点位置,z轴为负数
sphereNode.position = SCNVector3(x: 0, y: 0, z: -0.5)
scene.rootNode.addChildNode(sphereNode)
AR视觉位置如下图
中间的盒子代表手机相机,从+Z这边看的话,AR模型在我们后脑勺位置,从-Z方向看才是在我们正前方位置。所以节点位置第三个参数Z为负数。
7.添加手势
func registerGestureRecognizers(){
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped))
self.sceneView.addGestureRecognizer(tapGestureRecognizer)
}
@objc func tapped (recognizer: UIGestureRecognizer){
let sceneView = recognizer.view as! ARSCNView
let touchLoaction = recognizer.location(in: sceneView)
let hitRersults = sceneView.hitTest(touchLoaction, options: [:])
// 一開始的時候 index = 0
if !hitRersults.isEmpty {
if index == self.textures.count {
index = 0
}
guard let hitRersult = hitRersults.first else {
return
}
let node = hitRersult.node
node.geometry?.firstMaterial?.diffuse.contents = UIImage(named: textures[index])
index += 1
}
}
- AR效果
五、总结
通过ARKit实现AR记住四步就可以了:
创建几何 -> 渲染 -> 设置节点 -> 添加手势