ARCore Geospatial API の精度はそこそこよい。API から取得できる値を見ても水平方向 20cm とかの精度がでてるんだけど、実際の見た目でいうと 20cm ズレるとそこそこ気になる。
壁面に実際に描かれている QR コードと AR 表示している QR コードのテクスチャ位置はデータ的にはピッタリ同じにしてるんだけど Geospatial API で位置あわせするとズレて見える。
MoAR を起動して最初に体験するコンテンツは Mo(AR)^2 という壁面の QR コードが飛び出してくるものなので、ここがズレてるのはやだなーなんか対策ないかなーというとこで思いついたのが、VPS だけじゃなくて従来のイメージマーカーを併用する方法。
ARKit でイメージマーカーを使う方法
Detecting Images in an AR Experience | Apple Developer Documentation
ARReferenceImage.referenceImages
でマーカー画像を読み込んで ARWorldTrackingConfiguration.detectionImages
にセットすればあとは ARSCNView
の delegate で各画像に対応する ARImageAnchor の情報が得られるので適当に動かすなりする。
MoAR では以下の2つの画像を AR Reference Image として使っている。位置は全く同じなんだけど昼と夜でかなり見た目が変わるので昼の画像だけだと夜は認識してくれない。
画像登録時にはその画像が現実空間でどれぐらいのサイズかを正確に入力する必要がある。このサイズが間違ってると認識してくれないか、認識してもなんか動きがおかしい、みたいなことなる。(なった)
ちなみに似たような画像を複数登録すると Xcode が画像が似てるぞーっと警告を出す。
実際、夕方とかのどっちの画像にも近いような条件だと昼の画像にマッチすることもあれば夜の画像にマッチすることもあるのでしっかり区別をつけたい場合は、警告が出ないような画像にする必要がありそう。MoAR はどっちにマッチしたとしても位置は同じなので警告は無視。
実装した
最初数秒間は VPS だけの状態で、壁面のリアル QR コードと AR 上の QR メッシュモデルがずれてるけど、その後マーカー画像を認識するとピタっと位置が合うようになった。
VPS いらないのでは?
マーカーでそこまでピッタリ位置が合うなら VPS いらないのでは?と思ってやってみたのだが、
マーカー付近はピッタンコなんだけどマーカーから離れた上端付近がプルプルする。マーカーの回転角の推定誤差がマーカーから離れるにしたがって見た目上大きくなってくのでプルプルするんだと思う。
このプルプルはマーカーの回転値を使わずに位置だけ(具体的には SCNNode.simdWorldPosition
)をマーカーのものを使って回転値は画像全体から推定された VPS 側の値をを使えば収まる。
もう一つマーカー画像の弱点はマーカー画像全体が画面内に収まっていないとトラッキングできなくなるという点。あたりまえなのだけどこの制限があるので、ビル全体やその周辺までキャンバスにする必要がある MoAR では単純にデカいマーカーをトラッキングするだけではだめでやっぱり VPS が必要だった。