什么是ARKit
1.追踪
world tracking 全局追踪
识别现实场景要显示的东西应该放在哪里 .Visual inertial odometry 视觉惯性测距
就像平常我们看东西一样.近大远小.No external setup 没有外部设置
苹果的意思就是说有一台iPhone就够了,不需要其他外设
2.场景理解
Plane detection 平面检测
对现实平面是否水平面,斜面,垂直面进行检测Hit-testig 命中测试
当确定这个平面的时候,给虚拟物体加上重力计数,它会平放在那里Light estimation 光估量
摄像头传感器评估现场的光度,给你的虚拟物品加上阴影之类的
3.渲染
- Easy integration 简单集合
- AR views AR视图
- Custom rendering 自定义渲染
简单来说 ARKit 就是利用相机捕捉现实世界然后在屏幕上显示3D模型.
- 相机捕捉现实世界 ---->ARkit来实现
- 显示自己的3D模型 ---->SceneKit
底层体系
- ScenneKit iOS8后出来用来做游戏用的3D
- SpriteKit iOS7把2D coco 再进行封装
- Metal 操作GPU CPU的API 进行纹理,材质上的改变
- AVFoudation 数据采集捕捉
- CoreMotion 侦测手机移动,3d画面以怎样的角度显示等等
整个步骤
- First step
- ARSession //这是个单例,是ARKit的核心类,用于控制设备摄像头
处理传感器数据,对捕捉的图像进行分析等等
- ARSession //这是个单例,是ARKit的核心类,用于控制设备摄像头
- Configurations
ARSessionConfiguration //跟踪设备方向的一个基本配置,在运行时候需要指定AR运行的配置
class ARWorldTrackingSessionConfiguration //配置跟踪设备的方向和位置,以及检测设备摄像头所看到的现实世界的表面
- Standard Views
ARSCNView //用来增加相机通过3D Scenekit所捕捉到的内容并展示AR效果的一个View
ARSKView //用来增强相机通过2D SpriteKit所捕捉到的内容并展示AR效果的一个View
- Real-World Objects and Positions
ARAnchor //真实世界的位置和方向,用于在一个AR场景中放置物体
APPlaneAnchor //在一个AR Session会话中检测一个真实世界的位置和方向的相关信息
ARHitTestResult //在一个AR Session会话中通过检测相机视图中的一个点来获取真是世界中表面的相关信息
- Camera and Scene Details
ARFrame //捕获一个视频图像和位置追踪信息作为一个AR会话的一部分
ARCamera //在一个AR会话中摄像机的位置和成像特征信息为捕获视频帧
ARLightEstimate //在一个AR会话中估计场景照明信息关联到一个捕获的视频帧
Demo练习one
添加一个白色的球体到屏幕中
//初始化配置
override func viewDidLoad() {
super.viewDidLoad()
//设置追踪
let configuration = ARWorldTrackingSessionConfiguration();
//检测水平面
configuration.planeDetection = .horizontal;
//开始配置运行
sceneView.session.run(configuration);
// Do any additional setup after loading the view, typically from a nib.
}
func addCube(_ sender: Any) {
//镜头前后的位置
let zCoords = -0.5;
print(zCoords);
//单位米 0.1米
let culbeNode = SCNNode(geometry:SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0.1) );
//出现在3维空间的位置
culbeNode.position = SCNVector3(0,0,zCoords);
//添加到根节点
sceneView.scene.rootNode.addChildNode(culbeNode);
}
Demo2
添加3D素材到屏幕上,这里用到的素材取自苹果的Demo,后面会给出的Demo链接和苹果的官方Demo链接
//获取相机的坐标
struct myCamraCoordinaties {
var x = Float();
var y = Float();
var z = Float();
}
func getCamraCoordinaties(sceneViewm: ARSCNView) -> myCamraCoordinaties {
let cameraTransForm = sceneView.session.currentFrame?.camera.transform;
let cameraCoodrdiantes = MDLTransform(matrix: cameraTransForm!)
var cc = myCamraCoordinaties()
cc.x = cameraCoodrdiantes.translation.x
cc.y = cameraCoodrdiantes.translation.y
cc.z = cameraCoodrdiantes.translation.z
return cc;
}
func addCup(_ sender: Any) {
let cupNode = SCNNode();
let cc = getCamraCoordinaties(sceneViewm: sceneView);
cupNode.position = SCNVector3(cc.x,cc.y,cc.z);
guard let vitualObjectSecne = SCNScene(named:"cup.scn" ,inDirectory:"Models.scnassets/cup")else{
return
}
let wrapperNode = SCNNode()
for child in vitualObjectSecne.rootNode.childNodes {
child.geometry?.firstMaterial?.lightingModel = .physicallyBased
wrapperNode.addChildNode(child)
}
cupNode.addChildNode(wrapperNode);
sceneView.scene.rootNode.addChildNode(cupNode);
}
下载地址
[^官方Demo] https://developer.apple.com/sample-code/wwdc/2017/PlacingObjects.zip
[^文中Demo] https://github.com/FineaX/arkitDemoPractice