ARKit初体验

第一:什么是AR

  • 增强现实AR, 将2D或者3D的元素添加到相机的实时视图中, 就好像 这些元素居住在现实世界中;
  • ARKit结合了设备运动跟踪,相机场景拍摄,高级场景处理和显示,简化了AR体验的任务,这是官方的解释: 就是让虚拟内容是真实世界的一部分的错觉。

第二:开发AR

  • 首先要开发AR, 需要具备A9以上的芯片设备,iPhone6S以上。
    如果app是以AR开发为主的:请使用应用程序Info.plist中ARKit的UIRequiredDeviceCapabilities部分中的键。
    如果增强现实是应用程序的辅助功能,使用isSupported 来判断是否支持设备。
  • 其次要理解一个概念: 在所有AR体验中,ARKit使用坐标系,遵循:y轴向上,z轴指向观察者,x轴指向观看者的右侧。右手系坐标原则:
    ARKit初体验_第1张图片
    vy6F7b.jpg

    这里有篇文章写的很好 关于MAC, IOS的坐标系。

创建工程

ARKit初体验_第2张图片
选择AR.png
点击Next
Content Technology中,有三个选项:

  • SceneKit: SceneKit底层实现使用Metal和OpenGL, 苹果这个封装狂魔封装起来的一套高性能3D图形框架;

  • SpeiteKit: SpeiteKit是Ios7引入的一套主要开发2D游戏的框架, 通过支持自定义OpenGL ES着色器和照明,可以与SceneKit集成;

  • Metal: Metal是一套直接访问图形处理单元(GPU)编程的高效框架, 非常底层, 接近Metal(金属板了);

最后点击next创建好工程:

运行后会通过摄像机看到有一个3D的立体模型出现在眼前, 再看代码:

class ViewController: UIViewController, ARSCNViewDelegate {//VC遵循ARSCNView代理
    @IBOutlet var sceneView: ARSCNView! 
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        //Show statistics such as fps and timing information
        sceneView.showsStatistics = true
        
        // Create a new scene
        let scene = SCNScene(named: "art.scnassets/ship.scn")!
        
        // Set the scene to the view
        sceneView.scene = scene
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // Create a session configuration
        let configuration = ARWorldTrackingConfiguration()
        
        
        // Run the view's session
        sceneView.session.run(configuration)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        // Pause the view's session
        sceneView.session.pause()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    }
}
通过代码了解一些基本概念。
  • SCNView: 主要是显示SceneKit的3D模型, 显示3D场景,继承自UIView; showsStatistics 是否显示统计数据, 场景中最下面的绿条
  • ARSCNView:将相机捕捉到的界面作为3D场景,继承自SCNView
  • ARSession:管理相机设备和AR体验所需要的处理的对象,包括从设备的运动感测硬件读取数据,控制设备的内置相机,以及对捕获的相机图像执行图像分析。会话综合了所有这些结果,以建立设备居住的真实世界空间与模拟AR内容的虚拟空间之间的对应关系。简单来说调动现实硬件, 结合虚拟软件,建立关系。通过ARSCNView管理这个会话。
  • ARCamera:被称为照相机,通过照相机捕捉真实世界的图像。被ARSession调用。
  • SCNScene:就是在是视图上所需要放置的场景, 万物皆场景。是SCNView的属性;
  • SCNNode:称为节点,场景是由无数个节点组成, 他有自己的位置和坐标系统,我们会把几何模型, 灯光效果等添加到节点上, 又称万物皆节点。每一个Scene都有一个跟节点rootNode。
  • ARConfiguration:AR会话配置的的抽象基类:它可以增加AR体验,设置了配置对象的属性,并将配置传递给会话的方法。
    要运行ARSession,首先创建一个具体的ARConfiguration子类的实例:
    ARKit包括以下具体配置类:
    ARWorldTrackingConfiguration
    提供高品质的AR体验,使用后置摄像头精确跟踪设备的位置和方向,并允许平面检测和打击测试。
    AROrientationTrackingConfiguration
    提供使用后置摄像头并仅跟踪设备方向的基本AR体验。
    ARFaceTrackingConfiguration
    提供使用前置摄像头并跟踪用户脸部的移动和表情的AR体验。
    总结如下图:
    ARKit初体验_第4张图片
    A548B070-4849-43C4-9756-39CB182B8469.png
通过代码和概念:可以总结启动AR的步骤:
  1. 通过ARSCNView加载SCNScene场景;
  2. SCNScene启动相机ARCamera捕捉现实场景;
  3. 捕捉场景后ARSCNView将场景数据传递给ARSession;
  4. ARSession通过管理ARSessionConfiguration实现场景追踪;
  5. 给ARSCNView的scene添加一个子节点(3D物体模型);

写一个简单Demo, AR播放视频

  1. 给一个本地的视频url:
override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        sceneView.showsStatistics = false;
        
        //本地视频URL
        let bundlePath = Bundle.main.url(forResource: "驯龙记.mp4", withExtension: nil)
        
        //首先创建一个创景:
        let scene = SCNScene()

        //创建一个平面的几何
        let plane = SCNPlane.init(width: 0.664, height: 0.375);
        
        //初始一个渲染器
        let materials = SCNMaterial()
        
        //创建player
        let player = AVPlayer.init(url: bundlePath!)
        
        //渲染器扩散接受内容
        materials.diffuse.contents = player
        
        //设置渲染器
        plane.materials = [materials]
        
        //设置节点
        let node = SCNNode(geometry: plane)
        
        //节点位置
        node.position = SCNVector3(0, 0, -1.0)
        
        //设置根节点
        scene.rootNode.addChildNode(node);
        
        //播放
        player.play()
        
        sceneView.scene = scene
        
    }
完成

其中

node.position = SCNVector3(0, 0, -1.0)

坐标z轴, 正值朝向观察者, 负值是正面可以观察到的;

渲染器接受到的内容:

materials.diffuse.contents  = ?
//可以是一种颜色(NSColor,UIColor,CGcolorRef)
//可以是图像(NSImage, UIImage, CGImageRef)
//可以是CALayer
//可以是路径 (NSString or NSURL)
//可以是场景SKScene  SKTexture
 //可以是二维码: AVCaptureDevice;( iOS 11以上)
//可以是AVPlayer;
//设置颜色的动画

你可能感兴趣的:(ARKit初体验)