上一篇文章介紹了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)系
下面用一個(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ī)
提示
這個(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])
}