これはUnity Advent Calender 2019の21日目の記事です
ARKit3で追加された新しいARの共有のサンプルの解説です
https://github.com/Unity-Technologies/arfoundation-samples
のARCollaborationDataのサンプルを実行した動画がこちら
ブログ用
— sada@VirtualxRえんじにゃ (@SAyanada9) December 19, 2019
arkit3のCollaborative Sessionのサンプル実行動画 pic.twitter.com/tDhRkBBqt7
所感
割と早く位置合わせされてるしそこそこ実用的な気がする
一つ懸念があるとすればあまり特徴点がないところだと認識が遅くなりそうというところ
使える要件はiOS13以上のみなのでA12プロセッサが必要というわけではないです
Appleのドキュメント
Building Collaborative AR Experiences
Creating a Collaborative Session
collaborationEnabled
これによると最大4人が最適と書いてあります
ネットワーク的に最適なのかそれとも処理的に4人ぐらいが限界なのかはわからないです(ちなみにサンプルではBluetoothでP2P通信をしていた)
(大雑把な)仕組み
Collaborative SessionというARKit3で追加された機能でARCollaborationDataというデータを共有している
ARCollaborationDataとは
点群情報を保持し続けるオブジェクト
そのオブジェクトが他の人の点群情報をマージしたり出力したるする機能が付随している様なイメージ
少し詳しい仕組み
点群情報(便宜上点群情報というが、この情報の塊に正確には点群、自分の位置(点群等からの相対距離だと思われる)ReferencePoints(点群に紐つく位置、又の名をアンカー)が入っていると思われる)をp2p的に送信して、受信した時に自分が持ってる点群情報にマージ、重ね合わせをして複数端末の位置を共有するような感じ
ARWorldMapとの違い
ARWorldMapの方は
- 空間ごと一度保存してからそれを送信(受信)する
- アンカーに加えて平面の情報なども保存(共有)する
- 単体の機能では端末の位置は共有しない(端末の位置はARWorldMapには保存されない)
- 一度ある程度空間を認識してから送信する必要がある
- あくまでStaticなものの共有(変わらない空間、場所)に向いている
- 端末同士の座標形は一致する(複数端末上で現実空間の同じ場所に原点がある)
に対して
ARCollaborationDataの方は
- 都度都度空間情報を送信する
- 平面の情報などは共有せず、他端末の位置、アンカーのみ共有する
- 単体の機能で端末の位置を共有することができる(p2p的に送受信するSDKは別に必要(Photon等))
- 主に動的に変わるものだけを共有することに特化(自分の位置や、増える物)
- 端末同士の座標形は一致しない(複数端末上で現実空間の同じ場所に原点がない)
端末の座標形の話
Collaborative Sessionの 端末同士の座標形は一致していない
理由は点群(複数端末で共通な位置情報)を共有しその点群からの相対座標にある端末の位置を共有しているので下の図のように現実世界上の位置は一致しているがUnityでの座標は一致していない状態になるため座標系は一致していないことになります
位置を共有したARのゲーム等を作るにあたって
複数端末の位置(相対位置)が共有されてても座標形が一致(原点が現実世界上の座標の同じところにあるということ)してないとUnity上の同じ座標に物を生成してもARで通して見ると違うところにあるといったように場所が狂ってしまいます
なので現実世界上での共通の場所をそれぞれの端末の原点とする(すべてのオブジェクトをその共通の座標からの相対座標に設定する)と座標系が一致します
ここでARCollaborationDataのアンカー(ReferencePoints)を共有するという機能を使います
アンカーは現実世界上の取得した特徴点の上に設定することができるのでそのアンカーを共有することによって複数端末上で現実世界上の同じ位置のUnity上の座標が取れる様になります
その後、その場所をUnityでの原点にするような処理を行えば複数端末の座標形が一致します
原点の合わせ方については以前書いたこの記事が参考になります https://qiita.com/SAyanada9/items/806f202ccfc1ba55619a
まとめ
ARkit2のARWorldMapよりは位置を共有するのは楽にはなった(それでも少々使い辛い)ので使ってみるのも良いかもしれませんね