CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Niantic SDK 3.15でImage TrackingおよびAndroidスマートフォンをホストとしたShared ARを試してみました

Niantic SDKは、単体の端末でARに関する機能を実行できるだけではなく、複数の端末とARを同時に体験できるShared ARという仕組みもあります。

Shared ARを実行するにはいくつか方法があるため、今回はShared ARについて調べてみました。

検証した環境
- Unity 6000.053f1 (Mac OS)
- Niantic Lightship AR Plugin 3.15.0-2508040839
- Niantic Lightship Shared AR Client Plugin 3.15.0-2508040839
- AR Foundation 6.06 (依存関係により自動import)

検証に使用したデバイス - Nothing Phone 3a
- MacBook Pro (M1, Sonoma 14.7)

1. Shared ARとは

公式ドキュメントにはこのように書いてあります。ARを使ったマルチプレイを実現するための方法です。

Shared AR allows multiple users to experience the magic of AR together. With Shared AR, developers have the ability to connect multiple users in real-time. Leveraging the Unity platform, you can now use Niantic Spatial Platform's Shared AR technology in your Unity project to create multiplayer experiences, allowing people to connect and socialize within your application.

lightship.dev

マルチプレイを実現するには、参加する端末が相互に現在位置を共有し、シーン内の各種オブジェクトの動きの共有が必要です。

1つめについては3つの方法が紹介されています。

  • VPS Colocalization

  • Image Tracking Colocalization

  • Mock Colocalization

また、各種オブジェクトの動きの共有には、Unityが提供しているNetCodeの使用が紹介されています。NetCodeについては以下をご覧ください。

Unity ネットワーク技術メモ - フレームシンセシス

少し前の記事ですが、NetCodeを使ってローカル環境でのホスト・クライアント構成もできるようです。この場合はローカルネットワークでの使用に限定されますが、料金はかかりません。

Unity Netcode for GameObjectsでオンラインマルチプレイゲームを作る #オンラインゲーム - Qiita

ネットワークを介してプレーヤー同士が接続する場合、料金がかかります。

料金がわかるリンクについても紹介されておりました。

UGS Pricing

2. Shared ARの実現方法

2.1 VPS Colocalization

Nianticが提供している地図情報+対象場所のメッシュデータを使って位置を共有する方法です。以下に使い方が書いてあります。

lightship.dev

Niantic Lightship Platform (開発者向けポータルサイト) にGeospatial Browserという機能があります。ここで自分がShared ARを実現したい場所を入力(今回は東京都港区としてみました)すると、VPS情報やメッシュ情報が登録された場所を確認できます。このメッシュをダウンロードしてUnityで使うと、どこにコンテンツを表示されるかなどの調整もできます。

Geospatial Browser on Niantic Lightship Platform

ちなみに、各地点のメッシュデータはPokemon Goのユーザが集めたもののようです。こちらに書いてありました。

Niantic is building a ‘geospatial’ AI model based on Pokémon Go player data | The Verge

そのため、場所によってはメッシュが存在しないのですが、その場合開発者が撮影することもできるようです。

この方法は、場所に合わせて位置合わせができることが利点です。一方、Geospatial Browserに登録された場所 (Public Location) でしか使えないことになります。つまり、Geospatial Browserには登録されていない道路、建物の中を活用したARには不向きということになります。

2.2 Image Tracking

現実にある画像を位置合わせの基準とする方法です。GPSなどの位置情報と無関係に任意の場所で位置合わせができるようになります。

www.nianticspatial.com

2.3 Mock Colocalization

デバッグ用の機能です。Unity Editorの拡張により、ビルドしなくても複数のウインドウを開いて動作を確認できるようです。

便利な機能ですが運用向けではないため、何かを開発する場合に改めて使用を考えたいと思います。

共有ARのデバッグ方法 | Niantic Spatial Platform

3. Image TrackingとNetCodeを使った共有

3つの方法のうち、自分の部屋でも実機を伴ってShared ARを検証できるのはImage Trackingなので、これをもう少し調べてみました。

Niantic SDKの環境構築やサンプルプロジェクトのビルド手順については、こちらもご参考ください。

www.crossroad-tech.com

以下の公式ドキュメントでは、1から作る方法が簡単に書かれています。
Netcodeを使って画像追跡コロカライゼーションを使用する | Niantic Spatial Platform

ただ、GitHubで公開されているサンプルプロジェクトにサンプルシーンがあるので、それを使います。

github.com

上記のサンプルプロジェクトをダウンロードしてUnityで開きます。

Assets/Samples/SharedAR/Scenesの中にあるImageTrackingColocalizationというシーンを開きます。

ImageTrackingColocalizationDemoというオブジェクトを選択して、トラッキング対象の画像を確認します。

Target image of ImageTrackingColocalization

最初はNianticが準備した画像が入っています。この画像を印刷するか、別の画像に差し替えるとサンプルの動作を確認できます。

今回は全然違う画像 (たまたま子どもが持っていた進研ゼミのテキストを撮影) を使ってみました。

新しい画像を追加して使う場合、Project Viewで画像を選択して、Inspectorで以下のように変更する必要があります。

A Sprite UI Image for Image Tracking

このように設定変更しないままビルドすると、アプリ上で画像を読み込んだ瞬間に、以下のエラーが出ます。

InvalidOperationException: The texture must be readable to be used as the source for reference image.  

ここまで準備したらアプリをビルドして、スマートフォンで開きます。

スマートフォンで開いた後、Start Newというボタンを押してからマーカにした物体 (今回は進研ゼミのテキスト) をカメラに写します。

すると、cubeが表示されて位置情報の原点が取れたことが確認できます。

続いて、スマートフォン画面左上にPIN : 123のように番号が表示されているので、この番号を別の端末で使います。

今回はUnity Editorで同じシーンを開き、123をテキストフィールドに入力してからJoinボタンを押します。すると、2つめの端末が先ほどの原点に白い丸として表示されます。

それぞれの端末の動きが共有されているので、スマートフォンを適当に動かしてみます。するとPC画面側で白い円状のものが動くことが確認できます。つまり、位置の共有ができています。

Androidスマートフォンのアプリを終了すると、PC画面側が白くなってHost Disconnectedと表示されます。

4. 補足:Device Mappingについて

今回紹介したImage Trackingと同等の形でShared ARを実現する場合、以前紹介したDevice Mappingを活用するのもありだと思います。

しかし、Device Mappingを確認できるサンプルプロジェクトのCloudPersistenceシーンでは、NetCodeは使われていないようでした。

また、空間内の位置同期については、CreateAndPlaceCube関数で同じ空間にCubeオブジェクトが出現という処理だけだったので、任意のオブジェクト変化を相互に同期する仕組み (=NetCode相当) がなく、自分で実装する必要がありそうです。

5. おわりに

ひとまず動きました。あとはスマートフォンとQuest3で動くのかが気になっているので、次回はそれを試してみようと思います。


8/17追記

AndroidスマートフォンとQuest3で動くかを調べたのですが失敗しました。まず、Quest3はImage Tracking (AR Foundationの仕組みを使っている) が動きませんでした。

Unity No active UnityEngine.XR.ARSubsystems.XRImageTrackingSubsystem is available. This feature is either not supported on the current platform, or you may need to enable a provider in <b>Project Settings</b> > <b>XR Plug-in Management</b>.

AR Foundationの機種別対応状況はこちらです。Quest3がImage Tracking非対応と確認できます。

https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@6.1/manual/index.html#platform-support

別の仕組みを取り入れるなど、方法はあると思います。しかし、今回は検証する時間確保が難しいため、スマートフォンとQuest3のNetCode同期はまたの機会にしたいと思います。