玩轉(zhuǎn)ARKit-ARSession

上一篇文章介紹了ARKit是什么,看過的同學(xué)一定對ARKit有了很深的印象湃番。沒看過的請移步這里。 傳送門: 玩轉(zhuǎn)ARKit-認(rèn)識(shí)ARKit(ARKit官方文檔翻譯)http://www.reibang.com/p/e373f7f96b5c


ARSession

ARSession是管理設(shè)備相機(jī)和增強(qiáng)現(xiàn)實(shí)需要的運(yùn)動(dòng)處理相關(guān)的共享對象

  • 一個(gè)ARSession對象可以協(xié)調(diào)完成ARkit的主要過程來幫助你完成一個(gè)增強(qiáng)現(xiàn)實(shí)的體驗(yàn)榛了。這些過程包括了從運(yùn)動(dòng)分析硬件中讀取數(shù)據(jù)、控制設(shè)備的相機(jī)、對相機(jī)捕獲的圖像進(jìn)行分析。(會(huì)話)session對象會(huì)綜合所有結(jié)果累贤,在你的現(xiàn)實(shí)世界和創(chuàng)建的虛擬世界之間創(chuàng)建一個(gè)對應(yīng)的關(guān)系。從而構(gòu)建出一個(gè)AR世界少漆。你可以理解為現(xiàn)實(shí)與虛擬共存的第三世界。
  • 每一個(gè)AR體驗(yàn)都需要?jiǎng)?chuàng)建一個(gè)ARSession對象硼被。你可以選擇用SRSCNView或者ARSKView對象來構(gòu)建AR視圖顯示部分示损,該視圖對象包括一個(gè)ARSession實(shí)例。如果您為AR內(nèi)容構(gòu)建自己的渲染器嚷硫,則你需要自己實(shí)例化和維護(hù)ARSession對象检访。
  • 運(yùn)行一個(gè)會(huì)話需要配置一個(gè)ARSessionConfiguration類或其子類類或其子類ARWorldTrackingSessionConfiguration的實(shí)例。這些類決定了ARKit如何追蹤設(shè)備與現(xiàn)實(shí)世界之間的相對位置與運(yùn)動(dòng)數(shù)據(jù)仔掸,因此會(huì)影響你創(chuàng)建的AR體驗(yàn)的質(zhì)量脆贵。

提示
ARSessionConfiguration和ARWorldTrackingSessionConfiguration在iOS11 beta5版本進(jìn)行了重命名已經(jīng)被棄用
被ARConfiguration和ARWorldTrackingConfiguration替代

小結(jié)

ARSession相當(dāng)于一個(gè)橋梁溝通ARSCNView顯示AR場景并管理相機(jī)(ARCamera)和ARWorldTrackingSessionConfiguration會(huì)話配置,達(dá)到ARKit追蹤設(shè)備與現(xiàn)實(shí)世界之間的相對位置與運(yùn)動(dòng)數(shù)據(jù)起暮,達(dá)到構(gòu)建AR世界的目的卖氨。

圖示關(guān)系
屏幕快照 2017-09-03 14.50.08.png

下面用一個(gè)小demo來實(shí)踐一下剛才的內(nèi)容

這個(gè)案例很簡單直接用Xcode9 創(chuàng)建一個(gè)AR工程,Xcode會(huì)自動(dòng)為你創(chuàng)建以下代碼運(yùn)行到iOS 11系統(tǒng)的6s上就OK了 。

更加詳細(xì)的實(shí)踐指導(dǎo)請移步傳送門:玩轉(zhuǎn)ARKit_01初體驗(yàn)http://www.reibang.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步創(chuàng)建AR場景視圖對象
//  AR場景視圖(用來顯示AR視圖的對象)
    @IBOutlet var sceneView: ARSCNView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
      //設(shè)置場景視圖的代理
        sceneView.delegate = self
        
        //顯示數(shù)據(jù)提示 例如fps
        sceneView.showsStatistics = true
        
         //第2步 創(chuàng)建場景   并把scene賦給場景視圖的scene
        // 創(chuàng)建一個(gè)場景 (named: "art.scnassets/ship.scn")!系統(tǒng)提供的3D模型
        let scene = SCNScene(named: "art.scnassets/ship.scn");
        //把創(chuàng)建的場景賦值給 場景視圖的scene
        sceneView.scene = scene
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // 第3步創(chuàng)建configuration并拿到session開啟會(huì)話
        //創(chuàng)建一個(gè)會(huì)話配置對象
        let configuration = ARWorldTrackingConfiguration()
        // 開啟會(huì)話  開啟AR世界
       //這里沒有通過創(chuàng)建ARSession對象而是用了SCNView內(nèi)部的session屬性
        sceneView.session.run(configuration)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        // 暫停會(huì)話
        sceneView.session.pause()
    }

}

可以看到簡單的創(chuàng)建一個(gè)AR體驗(yàn)只需要三步筒捺,沒意外的話你就能看到下圖的飛機(jī)

IMG_1937.PNG

提示

這個(gè)案例只是為了幫助理解ARSession的橋梁作用柏腻,現(xiàn)在再回頭看看上圖是不是理解了ARSession的作用了呢,是否在腦中有個(gè)清晰的創(chuàng)建簡單AR體驗(yàn)的思路了呢系吭?


下面再來分析下ARSession相關(guān)的API


import ARKit

extension ARSession {
    
    /**
     運(yùn)行會(huì)話的選項(xiàng).(有兩個(gè)選項(xiàng) 重置追蹤五嫂,移除現(xiàn)有的錨點(diǎn))
     這些選項(xiàng)會(huì)改變運(yùn)行會(huì)話的行為,如果你提供了一個(gè)空的選項(xiàng)會(huì)導(dǎo)致會(huì)話的行為會(huì)被重新追蹤到最后一個(gè)已知的位置然后保留現(xiàn)有的錨點(diǎn)
     */
    @available(iOS 11.0, *)
    public struct RunOptions : OptionSet {

        public init(rawValue: UInt)
        /** 會(huì)話將重置追蹤. */
        public static var resetTracking: ARSession.RunOptions { get }

        /** 會(huì)話將移除現(xiàn)有的錨點(diǎn). */
        public static var removeExistingAnchors: ARSession.RunOptions { get }
    }
}

/**
ARSession類可以在一個(gè)設(shè)備上配置和運(yùn)行不同的增強(qiáng)現(xiàn)實(shí)技術(shù)。
 */
@available(iOS 11.0, *)
open class ARSession : NSObject {
    /**
    用于接收ARSession更新的代理
     */
    weak open var delegate: ARSessionDelegate?
    /**
    執(zhí)行代理調(diào)用的代理隊(duì)列
     @discussion 如果沒有設(shè)置或設(shè)置nil肯尺,ARSession將在主隊(duì)列調(diào)用
     */
    open var delegateQueue: DispatchQueue?

    /**
     會(huì)話當(dāng)前的frame
     */
    @NSCopying open var currentFrame: ARFrame? { get }
    
    /**
    會(huì)話正在使用的配置
     */
    @NSCopying open var configuration: ARConfiguration? { get }

    /**
     使用提供的配置和選項(xiàng)運(yùn)行會(huì)話沃缘。(這是運(yùn)行會(huì)話的高級用法,支持添加兩個(gè)選項(xiàng))
     @discussion調(diào)用該方法在已經(jīng)運(yùn)行的會(huì)話上啟動(dòng)新的配置. 
      當(dāng)配置改變的時(shí)候可以改變session的默認(rèn)行為
     @param configuration 使用的配置
     @param options  session使用的運(yùn)行選項(xiàng) (resetTracking,removeExistingAnchors)
     */
    open func run(_ configuration: ARConfiguration, options: ARSession.RunOptions = [])

    
    /**
    暫停會(huì)話
     */
    open func pause()

    /**
     添加錨點(diǎn)
     */
    open func add(anchor: ARAnchor)

    /**
    移除錨點(diǎn)
     */
    open func remove(anchor: ARAnchor)
}

@available(iOS 11.0, *)
public protocol ARSessionObserver : NSObjectProtocol {
    
    /**
     失敗回調(diào)
     */
    optional public func session(_ session: ARSession, didFailWithError error: Error)
    
    /**
     追蹤狀態(tài)改變回調(diào)
     */
    optional public func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera)
    
    /**
     會(huì)話中斷回調(diào)
     */
    optional public func sessionWasInterrupted(_ session: ARSession)
    
    /**
     會(huì)話中斷結(jié)束回調(diào)
     */
    optional public func sessionInterruptionEnded(_ session: ARSession)

    /**
     輸出音頻緩沖回調(diào)
     */
    optional public func session(_ session: ARSession, didOutputAudioSampleBuffer audioSampleBuffer: CMSampleBuffer)
}

@available(iOS 11.0, *)
public protocol ARSessionDelegate : ARSessionObserver {

    /**
     Frame更新回調(diào)
     */
    optional public func session(_ session: ARSession, didUpdate frame: ARFrame)
    /**
     錨點(diǎn)被添加后的回調(diào)
     */
    optional public func session(_ session: ARSession, didAdd anchors: [ARAnchor])
    /**
     錨點(diǎn)更新的回調(diào)
     */
    optional public func session(_ session: ARSession, didUpdate anchors: [ARAnchor])
    /**
     錨點(diǎn)被移除的回調(diào)
     */
    optional public func session(_ session: ARSession, didRemove anchors: [ARAnchor])
}

聯(lián)系我

需要資料的可以私信我或直接郵箱/QQ

歡迎點(diǎn)贊/拍磚/交流

郵箱 ichenwanbing@163.com

QQ 351795515

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末则吟,一起剝皮案震驚了整個(gè)濱河市槐臀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逾滥,老刑警劉巖峰档,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寨昙,居然都是意外死亡讥巡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門舔哪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欢顷,“玉大人,你說我怎么就攤上這事捉蚤√浚” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵缆巧,是天一觀的道長布持。 經(jīng)常有香客問我,道長陕悬,這世上最難降的妖魔是什么题暖? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮捉超,結(jié)果婚禮上胧卤,老公的妹妹穿的比我還像新娘。我一直安慰自己拼岳,他們只是感情好枝誊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惜纸,像睡著了一般叶撒。 火紅的嫁衣襯著肌膚如雪绝骚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天痊乾,我揣著相機(jī)與錄音皮壁,去河邊找鬼。 笑死哪审,一個(gè)胖子當(dāng)著我的面吹牛蛾魄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湿滓,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滴须,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叽奥?” 一聲冷哼從身側(cè)響起扔水,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朝氓,沒想到半個(gè)月后魔市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赵哲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年待德,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枫夺。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡将宪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橡庞,到底是詐尸還是另有隱情较坛,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布扒最,位于F島的核電站丑勤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吧趣。R本人自食惡果不足惜确封,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望再菊。 院中可真熱鬧,春花似錦颜曾、人聲如沸纠拔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稠诲。三九已至侦鹏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臀叙,已是汗流浹背略水。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劝萤,地道東北人渊涝。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像床嫌,于是被迫代替她去往敵國和親跨释。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • ARKit ARKit框架通過集成iOS設(shè)備攝像頭和運(yùn)動(dòng)功能厌处,在您的應(yīng)用程序或游戲中產(chǎn)生增強(qiáng)現(xiàn)實(shí)體驗(yàn)鳖谈。 概述 增強(qiáng)...
    暗夜夜夜行路閱讀 5,794評論 0 17
  • Introducing ARKit iOS 11 引入 ARKit,這是 個(gè)全新的框架阔涉,允許開發(fā)者輕松地為 iP...
    沒八阿哥的程序閱讀 2,418評論 1 9
  • 筆者在上篇文章中對ARKit進(jìn)行了簡單介紹缆娃,在本篇文章中主要介紹ARKit中經(jīng)常用到的API及使用方法。了解這些A...
    未明一二閱讀 1,196評論 1 7
  • ARkit Introducing ARKit iOS 11引入ARKit瑰排,這是 個(gè)全新的框架贯要,允許開發(fā)者輕松地為...
    坤哥愛卿閱讀 1,340評論 0 1
  • 不知道要說些什么?每天就是這么平平常常凶伙,平平凡凡地過了一天又一天 每天清晨固定的模式郭毕。日行一善,養(yǎng)生函荣,運(yùn)動(dòng)显押,做面膜...
    一棵樹閱讀 139評論 0 0