🗻

「長〜く歩く路上 AR 体験」を実装した話⑥〈STYLY の AR で長距離移動したい〉

に公開

はじめに

2025年3月8日(土)から3月30日(日)まで山梨県富士河口湖町にて開催された、 やまなしメディア芸術アワード(YMAA)メタバース企画《6okken 拡張遊歩「まだ見ぬ世界」の歩き方》展(以下、《拡張遊歩》) において、 xR 作品パートのテクニカルディレクションと実装 を担当しました。

https://www.youtube.com/watch?v=CHHiNxG8rf8

https://youtu.be/BgSGLPbhaNE

本記事は、プロジェクト《拡張遊歩》の xR 作品パートの実装過程をトピックごとにまとめる記事シリーズのうちの一つです。

  1. 〈はじめに〉
  2. 〈MR デバイスで空間描画 & エクスポート〉
  3. 〈Meta Quest をかぶって長距離移動したい場合の注意事項〉
  4. 〈立体地図プラットフォーム Cesium を用いた AR コンテンツのシミュレーション〉
  5. 〈雪の積もる地域で路上 AR 体験を提供するには〉
  6. 〈STYLY の AR で長距離移動したい〉 ◀ イマココ
  7. 〈安全に関する配慮〉
  8. 〈おまけ:表現の余白や遊びをもたせるための実装〉

本記事で書くこと

  • STYLY の VPS と画像マーカー実装における 位置合わせ についての検証
  • 《拡張遊歩》で運用した 角度の補正機能 について

書かないこと / 注意事項

  • 実装したコードの全体像や詳細に関しては、本記事では省略します。
  • それぞれのトピックについて検証が完璧に行えたわけではない(むしろ結構カツカツだった)ので、より適切な実装方法が存在するかもしれません。参考程度にご覧ください。
  • より良い選択肢や、内容の誤りを見つけた場合はコメントで指摘をいただければ幸いです。

本題:STYLY による AR 体験の長距離移動性能

〈はじめに〉で紹介したとおり、《拡張遊歩》の xR 作品パートは 「作家が気ままに遊歩(100〜200m 規模)した軌跡を、線状の CG オブジェクトとして記録し、 AR コンテンツとして周辺地域に展開する」 というものでした。

また、前回説明したように《拡張遊歩》では AR プラットフォームとして STYLY を採用しました。そのうえで、100〜200m 規模で長距離移動するようなコンテンツ を作成した際のズレ具合や対策について、以下にまとめます。

「位置合わせ時の精度」と「移動した先でのズレ」

「AR コンテンツの始点で位置合わせをして、200m 進んで、終点までたどり着く」 ことを考えたとき、気になるのは 「位置合わせ時にどれくらいの精度が出るか」「進んでいるうちにどれくらいズレるか」 です。

《拡張遊歩》では STYLY の City Anchor(ARCore Geospatial API)による位置合わせ に加え、バックアッププランとして ロケーションマーカー(画像マーカー)による位置合わせ の両方を想定していたので、プロジェクト初期段階には それぞれについてちょっとした検証 を行いました。

City Anchor(ARCore Geospatial API による VPS)

まずは、City Anchor での位置合わせの検証について記します。

位置合わせ時の精度

City Anchor による位置合わせは 結構信頼できる感じ でした。目印としてスマホでスキャンした周辺環境の 3D データを使用して検証しましたが、シーンを起動すると以下のように「じわ〜っ」と位置が合っていきました。(高さ方向の位置合わせだけクセあり仕様だったのでゴリ押し解決しましたが、長くなるのでここでは割愛します。)


スマホでスキャンしたデータを使って City Anchor における位置合わせを検証

とはいえ 時間帯や使用デバイスによってバラツキはありそう で、手元のデバイスでも複数回実施すると少し結果が変わりました。前後左右に最大 1m 程度のバラツキ が生じるイメージです。

移動した先でのズレ

前回も触れましたが、STYLY の City Anchor は ARCore Geospatial API による位置合わせのため、移動中の定期的な位置補正が行われているものと期待していました。実際に検証してみると、歩いている間に「スッ」とスライドしてくれる挙動 には出くわしました。


歩いている途中で、AR コンテンツ全体がちょっと左にシフトする挙動

しかし、試しに 100m ほど行って帰ってきてみると、開始地点が前後左右に最大 2m 程度ズレてしまって いました。


大きく動いて帰ってきたらズレてしまっていた

STYLY による ARCore Geospatial API の実装において、定期的な位置補正が行われているのかどうかは 結局結論が出せませんでした が、《拡張遊歩》での利用においてはギリギリ問題なさそうと判断し、そのまま進めることになりました。

ロケーションマーカー(画像マーカー)

次に、ロケーションマーカーでの位置合わせの検証です。

位置合わせ時の精度

ロケーションマーカーによる位置合わせは、一般的な画像マーカー AR と同程度の精度 で想像して問題なさそうでした。マーカーに対して数cm & 数° のズレに収まっている印象で、マーカーの傾きも検出します。


マーカーを傾けてもフィット

Android での位置合わせも最近精度が改善された様子で、中の人の記事によると iPhone 14 Pro / Pixel 7 で平均 2° 程度のズレに収まるとのこと。

https://qiita.com/uechan16/items/b6df0eb492fb0907e0a2

移動した先でのズレ

開始地点でマーカーを読み込むだけの AR なので、移動によって生じるズレは仕方がないかな、という感じです。行って帰ってくると少しズレて いました。


人と球の位置を合わせて → 遠くに行って帰ってくると → 少しズレてしまっていた

昨年話題になった ポカリの CM 撮影における AR 実装 のように 複数マーカーを使った定期的な位置補正 ができれば理想でしたが、STYLY の画像マーカーは1シーンにつき1つまでしか登録できない ため、諦めました。

https://www.youtube.com/watch?v=6GaynJWLkn8

(苦し紛れ)補正の仕組みを作る

STYLY 上でできる範囲には限界がありましたが、《拡張遊歩》ではデバイスごとの体験の差をなるべく吸収するため、念の為 超簡易的な位置補正の仕組み を作って運用しました。

長距離移動の際、気になるのは位置のズレより角度のズレ

VPS にせよ画像マーカーにせよ、長距離移動の AR 体験を提供するうえで気になるのは 位置合わせ時の角度のズレ です。例えば 位置合わせ時のズレが 3° 程度だったとしても、200m 進んだ先では 10m ほどの差 を生んでしまいます。

そのため、 STYLY のロケーションマーカー検出のように、マーカーの「ロール・ピッチ・ヨー」回転をそれぞれ検出してシーンに適用する位置合わせ は、長距離移動コンテンツを提供するうえでは少しやっかいです。


引用: 3次元ベクトルの回転「ロール・ピッチ・ヨー」

なぜなら、マーカー上ではピッタリ合っているように見えても、どうしてもそれぞれの角度に数°のズレが生じてしまうからです。つまり マーカーをいくら水平に設置したとしても、コンテンツが完璧に水平な角度で出現してくれるとは限らない のです。


ピッタリ合っているように見えて数°ズレている

このままでは、例えば 「位置合わせ時はズレていなかったけど、200m 先でコンテンツが 10m も上にズレてしまう」 といった現象がおきてしまいます。ズレなく表示するために、まずはコンテンツの「縦方向の軸」が「重力方向」と一致するように補正してあげる必要があります。

デバイスが検知した上方向ベクトルを基準にロール角とピッチ角を設定する

そこで、ロール角とピッチ角に関しては、 AR 機能の起動中にデバイスが「上方向」とみなしているベクトル に合わせるように補正をしました。ARKit や ARCore ではデバイスのジャイロセンサや加速度センサを用いて自己位置推定を行うため、AR シーンの「上方向」ベクトルが「重力方向」と一致します。


表示された AR コンテンツの縦軸が重力方向と一致するように補正

これで、例えば 「200m 先でコンテンツが 10m も上にズレてしまう」といったことは起こらなく なりました。

開始地点から離れていくに連れて定期的にヨー角を補正

しかし、残念ながらヨー角のズレに関しては課題が残ります。

デバイスのコンパス機能の値を取得できればあるいは、 と思いましたが、カスタムの C# スクリプトが使えない STYLY ではどうにも実現できなさそうでした。(PlayMaker を使ってコンパスの値を取得する方法を知っている方がもしいれば教えていただきたいです…。)

そこで、苦し紛れですが《拡張遊歩》では 「任意の地点で、今デバイスがある角度までコンテンツを回転させる」 という簡易補正機能を作って運用しました。開始地点からの移動距離によって発火 する補正機能なので、往復が生じるような複雑なルートだと成り立たない のですが、《拡張遊歩》におけるコンテンツの進むルートは全体的に一方向だったので、なんとか成立しました。

つづく

以上のような工夫をもとに、《拡張遊歩》では 100〜200m 規模の AR コンテンツをなんとか成立?させていました。次回、本編最後となる〈安全に関する配慮〉では、本プロジェクトで行った安全対策やその反省点をまとめます。

Discussion