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
