ARSessionとは
ARのシーンがどのように描写されるプロセス(要はライフサイクル)を管理している。
AppleのARSessionはVisual Inertial Odometry(VIO)を技術が使用されていて、モーションセンサーで周囲の変化を検知して得たデータとカメラ(ARCamera)から取得した動画、画像をコンピュータビジョン解析した結果を組み合わせて実現している。(らしい)
ARSessionを開始した場合はデータを取るのに時間がかかるのでARCoachingOverlayViewを表示したりする。(前回の記事を参照)
また、Delegateメソッドでセッション状態遷移を検知できる
ARセッションの主な役割
- デバイスのモーションセンサーから情報を読み込む
- デバイスに内蔵されたカメラを制御する
- ARシーンを生成するためにカメラから得たリアルタイムの映像を分析、処理する
- 実世界にARオブジェクトを実際に配置して描画する
ライフサイクルの種類
NotAvaiable
カメラーやセンサーから情報を収集する前
Limted(初期化)
デバイスの位置は認識できているがARKitの機能は使えない状態
Normalに状態が遷移する間に通る
Limited(機能不十分)
カメラが塞がれたり、何も映っていない状態になった時にもこうなる。
Limited(リローカライズ)
一度セッションが中断された状態から再度Normalの状態に戻る時、中断前のセンサー情報を元に正確にARオブジェクトを表示しようとする処理が走る
Normal
ARKitの機能が使える状態
状態を検知するためのDelegateメソッド
ARSessionDelegate(ARSessionObserverを継承している)
サブスレッドで呼ばれる
func session(ARSession, didAdd: [ARAnchor])
// 1つ以上のアンカーがセッションに追加されたことをデリゲートに通知します。
func session(ARSession, didUpdate: [ARAnchor])
// セッションが1つ以上のアンカーのプロパティを調整したことをデリゲートに通知します。
func session(ARSession, didRemove: [ARAnchor])
// 1つ以上のアンカーがセッションから削除されたことをデリゲート
ARSessionObserver
ARSessionObserverはARSessionDelegateが継承しているだけではなく他のProtocolでも継承されている。
全て自動でメインスレッドで呼ばれる。
トラッキングのクオリティの状態変化周りのDelegateメソッド
func session(ARSession, cameraDidChangeTrackingState: ARCamera)
// カメラでのトラッキングのクオリティの変更を通知
func session(ARSession, didChange: ARGeoTrackingStatus)
// ジオトラッキングの状態変化の通知
セッションの中断周りのメソッド
func sessionWasInterrupted(ARSession)
// セッション中断時
func sessionInterruptionEnded(ARSession)
// セッション再開時
func sessionShouldAttemptRelocalization(ARSession) -> Bool
// セッションが中断されてしまった時に自動でリローカライズするかどうかを判断する
エラー処理
func session(ARSession, didFailWithError: Error)
// ARKit側でセッションエラーが起きた時に呼ばれるメソッド。AlertControllerを呼び出しとけばOK
基本的にARKit側でセッションをよしなに管理してくれているが、もし自分でARSessionを管理したい場合は下記のプロパティをfalseにする必要がある
(デフォルトはtrue)
var automaticallyConfigureSession: Bool { get set }
参考
