ARKit入门01

来源:互联网 发布:医美缩小毛孔知乎 编辑:程序博客网 时间:2024/06/08 10:13

简介

增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

ARKit是基于AVFoundation框架和CoreMotion框架的

所需

  1. A9以上设备 (不支持模拟器)se 6s 6sp 7 7p
  2. xcode9 bates,iOS11,xcode9

特性

  1. 追踪:追踪现实和虚拟场景
    • 全局追蹤:追踪现实场景和虚拟场景,就像真实的存在现实中
    • 视觉惯性测距VIO:肉眼看到效果,远离所需,拉近放大
    • 没有外部设置:不需要外部设备(投影仪等)
  2. 场景理解:
    • 平面监测:现实世界都是有细小的平面构成
    • 命中测试:两个物件发生接触,产生一些反应
    • 光估计:用光照的方法,让物体更逼真。比如影子
  3. 渲染
    • 简单集合:用xcode自带的可以实现渲染。SceneKit(iOS8出现、3d场景)、SpriteKit(iOS7出现,2d场景)2D、Metal(iOS7出现,不支持模拟器)
    • AR视图:ARview,物件以arView的形式出现
    • 自定义渲染:可以使用其他引擎渲染,支持(Unity、Unreal)

运行原理

相机捕捉显示世界->arkit
显示3D模型->SceneKit
通过AR回话->ARSession使两者交互

原理图

坐标

这里写图片描述

x,y,z
是以相机的位置为中心,所以轴的负值标识我们正前方,正值表示我们的后方(后脑勺)
单位是米

ARSession

  • 使用之前设置一个追踪ARSessionConfiguration(来追踪设备方向的基本配置)
  • 通过run方法启用
  • 来处理是用来管理设备相机的共享对象(AVCaptureSession)和增强现实所需的处理(CMMotionmanager)
  • 最终生成一个一个的frame展示

Arssion

基本步骤

  1. ARSCNView加载场景SCNScene
  2. SCNScene启动相机ARCamera开始捕捉场景
  3. 捕捉场景后ARSCNView开始将场景数据交给Session
  4. Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
  5. 给ARSCNView的scene添加一个子节点(3D物体模型)

入门掌握四大基础点

  1. 几何
  2. 节点
  3. 渲染
  4. 手势

demo

  • 用到的关键类:
    • 场景视图(ARSCNView)
    • 场景(SCNScene)
    • 几何(SCNGeometry)
    • 节点(SCNNode)
    • 渲染器(SCNMaterial)
  • 如何在空间中放一个平面
    1. 创建场景视图 ARSCNView,设置代理
    2. 创建一个场景 SCNScene,给场景视图绑定场景
    3. 创建一个平面几何形状 (box,plane)
    4. 基于几何形状创建一个节点SCNNode
    5. 创建一个渲染器SCNMaterial,用其对平面几何进行渲染
    6. 添加节点到场景的根节点中

demo1

  1. 打开Xcode9bete版本,新建一个工程,选择Augmented Reality APP(Xcode9新增),点击next
    这里写图片描述

  2. 选择SceneKit
    这里写图片描述

  3. 此时,Xcode会自动为我们生成一段极其简洁的AR代码
    效果图后面补上

demo2

 override func viewDidLoad() {        super.viewDidLoad()        // Set the view's delegate         //1.设置场景代理        sceneView.delegate = self        // Show statistics such as fps and timing information        sceneView.showsStatistics = true        //2.创建场景        let scene = SCNScene()        //3.创建几何        let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)        //4. 渲染  渲染器可以决定怎样渲染,这个 contents属性可以设置很多东西,UILabel, UIImage,甚至 AVPlayer都可以        let material = SCNMaterial() //        material.diffuse.contents = UIColor.red//        material.diffuse.contents = UIImage(named: "brick.png")      //5.对几何进行渲染        box.materials = [material]//       6. 创建节点        let boxNode = SCNNode(geometry: box)//       7.设置节点位置        boxNode.position = SCNVector3(0,0,-0.2)//       8. 把节点放到根节点上        scene.rootNode.addChildNode(boxNode)        sceneView.scene = scene    }

这样就能我们面前就有一个红色的长宽高都是0.1m的正方体盒子