美文网首页iOSARKit专题
玩转ARKit-ARSession

玩转ARKit-ARSession

作者: cmfish | 来源:发表于2017-09-06 12:30 被阅读836次

    上一篇文章介绍了ARKit是什么,看过的同学一定对ARKit有了很深的印象。没看过的请移步这里。 传送门: 玩转ARKit-认识ARKit(ARKit官方文档翻译)http://www.jianshu.com/p/e373f7f96b5c


    ARSession

    ARSession是管理设备相机和增强现实需要的运动处理相关的共享对象

    • 一个ARSession对象可以协调完成ARkit的主要过程来帮助你完成一个增强现实的体验。这些过程包括了从运动分析硬件中读取数据、控制设备的相机、对相机捕获的图像进行分析。(会话)session对象会综合所有结果,在你的现实世界和创建的虚拟世界之间创建一个对应的关系。从而构建出一个AR世界。你可以理解为现实与虚拟共存的第三世界。
    • 每一个AR体验都需要创建一个ARSession对象。你可以选择用SRSCNView或者ARSKView对象来构建AR视图显示部分,该视图对象包括一个ARSession实例。如果您为AR内容构建自己的渲染器,则你需要自己实例化和维护ARSession对象。
    • 运行一个会话需要配置一个ARSessionConfiguration类或其子类类或其子类ARWorldTrackingSessionConfiguration的实例。这些类决定了ARKit如何追踪设备与现实世界之间的相对位置与运动数据,因此会影响你创建的AR体验的质量。

    提示
    ARSessionConfiguration和ARWorldTrackingSessionConfiguration在iOS11 beta5版本进行了重命名已经被弃用
    被ARConfiguration和ARWorldTrackingConfiguration替代

    小结

    ARSession相当于一个桥梁沟通ARSCNView显示AR场景并管理相机(ARCamera)和ARWorldTrackingSessionConfiguration会话配置,达到ARKit追踪设备与现实世界之间的相对位置与运动数据,达到构建AR世界的目的。

    图示关系
    屏幕快照 2017-09-03 14.50.08.png

    下面用一个小demo来实践一下刚才的内容

    这个案例很简单直接用Xcode9 创建一个AR工程,Xcode会自动为你创建以下代码运行到iOS 11系统的6s上就OK了 。

    更加详细的实践指导请移步传送门:玩转ARKit_01初体验http://www.jianshu.com/p/ef180f75ba46

    //
    //  ViewController.swift
    //  ARSession
    //
    //  Created by XXX on 2017/9/6.
    //  Copyright © 2017年 XXX. All rights reserved.
    //
    
    import UIKit
    import SceneKit
    import ARKit
    
    class ViewController: UIViewController, ARSCNViewDelegate {
    
    //第1步创建AR场景视图对象
    //  AR场景视图(用来显示AR视图的对象)
        @IBOutlet var sceneView: ARSCNView!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
          //设置场景视图的代理
            sceneView.delegate = self
            
            //显示数据提示 例如fps
            sceneView.showsStatistics = true
            
             //第2步 创建场景   并把scene赋给场景视图的scene
            // 创建一个场景 (named: "art.scnassets/ship.scn")!系统提供的3D模型
            let scene = SCNScene(named: "art.scnassets/ship.scn");
            //把创建的场景赋值给 场景视图的scene
            sceneView.scene = scene
        }
        
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            
            // 第3步创建configuration并拿到session开启会话
            //创建一个会话配置对象
            let configuration = ARWorldTrackingConfiguration()
            // 开启会话  开启AR世界
           //这里没有通过创建ARSession对象而是用了SCNView内部的session属性
            sceneView.session.run(configuration)
        }
        
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            
            // 暂停会话
            sceneView.session.pause()
        }
    
    }
    
    

    可以看到简单的创建一个AR体验只需要三步,没意外的话你就能看到下图的飞机

    IMG_1937.PNG

    提示

    这个案例只是为了帮助理解ARSession的桥梁作用,现在再回头看看上图是不是理解了ARSession的作用了呢,是否在脑中有个清晰的创建简单AR体验的思路了呢?


    下面再来分析下ARSession相关的API

    
    import ARKit
    
    extension ARSession {
        
        /**
         运行会话的选项.(有两个选项 重置追踪,移除现有的锚点)
         这些选项会改变运行会话的行为,如果你提供了一个空的选项会导致会话的行为会被重新追踪到最后一个已知的位置然后保留现有的锚点
         */
        @available(iOS 11.0, *)
        public struct RunOptions : OptionSet {
    
            public init(rawValue: UInt)
            /** 会话将重置追踪. */
            public static var resetTracking: ARSession.RunOptions { get }
    
            /** 会话将移除现有的锚点. */
            public static var removeExistingAnchors: ARSession.RunOptions { get }
        }
    }
    
    /**
    ARSession类可以在一个设备上配置和运行不同的增强现实技术。
     */
    @available(iOS 11.0, *)
    open class ARSession : NSObject {
        /**
        用于接收ARSession更新的代理
         */
        weak open var delegate: ARSessionDelegate?
        /**
        执行代理调用的代理队列
         @discussion 如果没有设置或设置nil,ARSession将在主队列调用
         */
        open var delegateQueue: DispatchQueue?
    
        /**
         会话当前的frame
         */
        @NSCopying open var currentFrame: ARFrame? { get }
        
        /**
        会话正在使用的配置
         */
        @NSCopying open var configuration: ARConfiguration? { get }
    
        /**
         使用提供的配置和选项运行会话。(这是运行会话的高级用法,支持添加两个选项)
         @discussion调用该方法在已经运行的会话上启动新的配置. 
          当配置改变的时候可以改变session的默认行为
         @param configuration 使用的配置
         @param options  session使用的运行选项 (resetTracking,removeExistingAnchors)
         */
        open func run(_ configuration: ARConfiguration, options: ARSession.RunOptions = [])
    
        
        /**
        暂停会话
         */
        open func pause()
    
        /**
         添加锚点
         */
        open func add(anchor: ARAnchor)
    
        /**
        移除锚点
         */
        open func remove(anchor: ARAnchor)
    }
    
    @available(iOS 11.0, *)
    public protocol ARSessionObserver : NSObjectProtocol {
        
        /**
         失败回调
         */
        optional public func session(_ session: ARSession, didFailWithError error: Error)
        
        /**
         追踪状态改变回调
         */
        optional public func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera)
        
        /**
         会话中断回调
         */
        optional public func sessionWasInterrupted(_ session: ARSession)
        
        /**
         会话中断结束回调
         */
        optional public func sessionInterruptionEnded(_ session: ARSession)
    
        /**
         输出音频缓冲回调
         */
        optional public func session(_ session: ARSession, didOutputAudioSampleBuffer audioSampleBuffer: CMSampleBuffer)
    }
    
    @available(iOS 11.0, *)
    public protocol ARSessionDelegate : ARSessionObserver {
    
        /**
         Frame更新回调
         */
        optional public func session(_ session: ARSession, didUpdate frame: ARFrame)
        /**
         锚点被添加后的回调
         */
        optional public func session(_ session: ARSession, didAdd anchors: [ARAnchor])
        /**
         锚点更新的回调
         */
        optional public func session(_ session: ARSession, didUpdate anchors: [ARAnchor])
        /**
         锚点被移除的回调
         */
        optional public func session(_ session: ARSession, didRemove anchors: [ARAnchor])
    }
    

    联系我

    需要资料的可以私信我或直接邮箱/QQ

    欢迎点赞/拍砖/交流

    邮箱 ichenwanbing@163.com

    QQ 351795515

    相关文章

      网友评论

      • aa6ecf7ab32e:你好,我在考虑一个需求,我把ARSCNView这个view来显示是我自己的wifi模块传来的视频,并非是相机捕捉的视频流,然后实现AR的效果,是不是要从openGL来处理视频流来做AR效果.

      本文标题:玩转ARKit-ARSession

      本文链接:https://www.haomeiwen.com/subject/kjjmjxtx.html