AR系アプリ作成に必要な要素 その3
1-4はデータを取れたので、いよいよ5に入ります。
- カメラプレビューへのオーバレイ表示
- 端末の向いている方角/姿勢の取得
- 端末の現在地(緯度/経度)の取得
- カメラの画角情報取得
- 2-4の情報から表示情報を計算
注意:以下はメモ書きです。アプリはまだ完成していないので正しいかわかりません。
方針
最終的には、対象物をカメラ画像にオーバレイしてディスプレイに投影するので、対象物の位置をデバイス座標系(device coordinate system)で表現する必要があります。
これまでに得られている、対象物の位置、デバイスの位置は、(緯度, 経度, 高さ)の極座標なので、座標変換をやりやすくするために、地球の中心を原点とした三次元直交座標系に変換する必要がありそう。
また、AndroidのセンサーAPIで得られる端末の回転状態は、(地球に対して北向きの接線, 東向きの接線, 地表から空に向かう法線)による座標系(world's coordinate system)なので、この変換も必要。
http://developer.android.com/reference/android/hardware/SensorManager.html
getRotationMatrix()を参照。
まとめると、
- 対象物の位置、端末の位置を、極座標(緯度, 経度, 高さ)から三次元直交座標系に変換
- 対象物の位置、端末の位置を、センサーAPIのworld's coordinate system(端末が原点)で表現
- 端末の向き(=カメラの向き)の座標系(device coordinate system)に回転
- ディスプレイに投影
という流れになります。
極座標(緯度, 経度, 高さ)から三次元直交座標系に変換
地球が完全な球ではない(GPSの極座標系も地球を回転楕円体と定義)ため単純な計算ではなさそうで、いきなり難易度が高い。。。
このサイトの図でイメージをつかみ、
http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html
このサイトの計算式を使って進めています。
http://homepage1.nifty.com/aida/jr1huo_calsat32/Calsat32Keiido.htm
2点間の距離はそれなりの精度で取得できたので、大きな間違いはなさそう。
センサーAPIのworld's coordinate systemで表現
上記サイトの図の直交座標系から、getRotationMatrix()の座標系への変換です。
3次元座標変換で躓いたので、下記サイトを読んで勉強中。。。
http://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/robotics/coordtrans.html
device coordinate systemに回転
これも3次元の座標変換です。getRotationMatrix()で取得した回転行列を使えるはず。デバイス座標系の定義は下記にあります。
http://developer.android.com/reference/android/hardware/SensorEvent.html
ディスプレイに投影
ここにいい感じの説明があったので参考にします。
http://opencv.jp/opencv-2.1/cpp/camera_calibration_and_3d_reconstruction.html
座標変換で頭が捻じれそうです。。。