ARKitのまとめ(実装2)
Jul 25, 2017 · iosarkit
概要
WWDC2017で発表されたARKit
の実装についてのまとめ2
ARKit
ではARSession
実行後の状況をARSessionDelegate
の通知で取得できる
トラッキング状態
ARSession
実行時のデバイスのトラッキング状態は、
func session(ARSession, cameraDidChangeTrackingState: ARCamera)
で通知される。
このARCamera
の中のtrackingState
でトラッキング状態を取得できる
ステータスの種類は以下のとおり
Not Available
Normal
Limited
セッション開始時はNot Available
である。
まだ、トラッキングできるだけのデータが入ってきていない状態で、デバイス位置は初期状態となっている
しばらく経過して、必要なデータが取得できて、デバイスの位置や姿勢をトラッキングできる様になると、Normal
へと変わる。Normal
の間はデバイス位置の利用が可能である
何らかの原因でトラッキングがうまくできなくない状態になると、Limited
になる。Limited
の場合は、enum
のAssociated Value
で理由が渡されてくる
AR情報の取得
※以下はSceneKit
やSpriteKit
を使わない場合の前提である
ARFrame
ARSession
を実行すると、ARKit
が検出したデバイスや空間の状況は、ARFrame
のオブジェクトとして取得できる。
つまり、ARFrame
はARKit
が現在認識している状況そのものといえる
このARFrame
の取得は、
ARSessionDelegate
のdidUpdate
で更新時に取得ARSession
のプロパティのcurrentFrame
で任意に取得
の2通りがある
ARFrame
には以下の情報が含まれる
- カメラのキャプチャ画像
- トラッキング情報
- デバイスの位置や向き
- トラッキング状態
- 空間(シーン)状況
- AR空間上のオブジェクトの位置や向き
- 検出された面や特徴点
- 照明の状況
ARCamera
ARCamera
は空間上に配置された仮想のカメラで、デバイスの位置や向きと一致している(デバイスのカメラを表しているとみなせば良い)
ARFrame
には1つだけ含まれる
主な中身はトランスフォーム(変換行列)である。これは、セッション開始時のデバイスの位置を原点とし、どれだけ移動や回転したかの行列となっている
他には、トラッキングの状態やレンダリング時に使用出来る各種行列(ビュー行列やプロジェクション行列)も提供されている
ARAnker
AR空間上にあるオブジェクトの位置や向きを表している。 その実体はトランスフォーム(変換行列)である
このオブジェクトは、検出された水平面の様にARKit
によって自動で追加されるほか、任意に追加や削除することができる。
例えば、画面上に仮想の物体を配置した場合は、対応するARAnker
をセッションに追加することができる。
つまり、現実空間に実在するオブジェクトを表す場合もあれば、存在しない仮想のオブジェクトを表す場合もある
ARFrame
はその空間に含まれる全てのARAnker
を配列として保持している。
このアンカーが追加や削除、更新された場合は、ARSessionDelegate
で通知を受信できる
ARPlaneAnchor
ARPlaneAnchor
はARAnker
のサブクラスで、ARKit
が検出した平面を表す
平面なのでセンター位置と面の範囲を持っている。
ARKit
は常に空間の状況を検出、更新するので、これらは動的に変化する場合がある。
更新された場合は、デリゲートで通知される
例えば、デバイスを動かすことにより床の範囲がさらに検出されて広くなった場合は、センター位置と範囲が更新される。 また、最初は2つの別々の面として認識されていたものが、実際には一つの大きな面だと認識された場合には、それらの面はマージされて後から検出された面の方が削除される
ARPointCloud
ARPointCloud
はARKit
が検出した特徴点一式を表す
通常はこれを直接使うことはないが、空間のオブジェクトの輪郭とある程度一致する
ARLightEstimate
ARLightEstimate
は現在の空間の環境光(照明)の強度を表す
この値を利用してレンダリング時のライトを調整することで、よりリアルな描画ができる
確認環境
- Xcode9.0 beta3