ARKit学习

什么是ARKit

1.追踪

ARKit学习_第1张图片
QQ20170804-135612.png
  • world tracking 全局追踪
    识别现实场景要显示的东西应该放在哪里 .

  • Visual inertial odometry 视觉惯性测距
    就像平常我们看东西一样.近大远小.

  • No external setup 没有外部设置
    苹果的意思就是说有一台iPhone就够了,不需要其他外设

2.场景理解

ARKit学习_第2张图片
QQ20170804-140739.png
  • Plane detection 平面检测
    对现实平面是否水平面,斜面,垂直面进行检测

  • Hit-testig 命中测试
    当确定这个平面的时候,给虚拟物体加上重力计数,它会平放在那里

  • Light estimation 光估量
    摄像头传感器评估现场的光度,给你的虚拟物品加上阴影之类的

3.渲染

ARKit学习_第3张图片
QQ20170804-141503.png
  • Easy integration 简单集合
  • AR views AR视图
  • Custom rendering 自定义渲染

简单来说 ARKit 就是利用相机捕捉现实世界然后在屏幕上显示3D模型.

  • 相机捕捉现实世界 ---->ARkit来实现
  • 显示自己的3D模型 ---->SceneKit

底层体系

ARKit学习_第4张图片
006.png
  • ScenneKit iOS8后出来用来做游戏用的3D
  • SpriteKit iOS7把2D coco 再进行封装
  • Metal 操作GPU CPU的API 进行纹理,材质上的改变
ARKit学习_第5张图片
007.png
  • AVFoudation 数据采集捕捉
  • CoreMotion 侦测手机移动,3d画面以怎样的角度显示等等

整个步骤

  • First step
    • 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);
  }
ARKit学习_第6张图片
demo1.jpg

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);
        
    }

ARKit学习_第7张图片
Demo.jpg

下载地址
[^官方Demo] https://developer.apple.com/sample-code/wwdc/2017/PlacingObjects.zip
[^文中Demo] https://github.com/FineaX/arkitDemoPractice

你可能感兴趣的:(ARKit学习)