見出し画像

【技術解説】Cases and Tips for Niantic Lightship ARDK

Introduction - はじめに

Niantic has launched its own AR Unity SDK, the Niantic Lightship ARDK, today, November 9, 2021. Lightship has been available in beta for developers since May 2021, and since then Designium has created a number of demos.

And now, The Designium is now Niantic's developer studio partner!
The demo presented here can be found on Niantic's website.

Niantic社は本日2021年11月9日より独自のAR Unity SDK「Niantic Lightship ARDK」の本格提供を開始しました。「Lightship」は2021年5月から開発者向けにベータ版が提供されており、それ以来デザイニウムでは様々なデモを作成してきました。

そして、このたびデザイニウムはNiantic社の開発パートナーになりました❗
今回紹介するデモ動画は、Niantic社のサイトでも紹介されています✨

We are Matt (@mechpil0t) and Mao(@rainage), two of the AR Engineer at The Designium

In July 2021 Niantic announced their Lightship Demo Challenge. This challenge gave developers 1 month to create prototypes that utilised the functions of the Lightship ARDK (AR SDK).

私たちは、デザイニウムのARエンジニアのMatt(@mechpil0t)とMao(@rainage)です。

2021年7月、Niantic社は「Lightship Demo Challenge」を発表しました。このチャレンジでは、開発者が1ヶ月間、Lightship ARDK(AR SDK)の機能を利用したプロトタイプを作成するものです。

Some of the most impressive features of Lightship SDK are the “real time mapping”, semantic segmentation, and the multiplayer component. Lightship “real time mapping” allows environmental collision and occlusion for AR objects using depth estimation. The multiplayer component allows users to quickly and easily synchronize AR experiences across multiple devices. Semantic segmentation uses machine learning to identify parts of a scene that fit into some category, e.g. sky, ground, buildings etc. These parts of the scene can be replaced with or used to block virtual content, for example in this video the virtual content would only show in the sky area.

Lightship SDKの最も印象的な機能は、「リアルタイム・マッピング」、「セマンティック・セグメンテーション」、そして「マルチプレイヤー・コンポーネント」です。Lightshipの「リアルタイム・マッピング」は、深度推定を用いてARオブジェクトの環境衝突やオクルージョンを可能にします。マルチプレイヤーコンポーネントは、ユーザーが複数のデバイス間でAR体験を迅速かつ容易に同期させることができます。セマンティックセグメンテーションは、機械学習を利用して、空、地面、建物など、あるカテゴリーに当てはまるシーンの部分を特定します。シーンのこれらの部分は、バーチャルコンテンツに置き換えたり、バーチャルコンテンツをブロックするために使用することができます。例えば、このビデオでは、バーチャルコンテンツは空の部分にのみ表示されます。

Each of the demos we created for the Lightship Demo Challenge focused on one or more of these features, and while we unfortunately did not win, we were two of the five runners up.🎉✨
https://nianticlabs.com/blog/ardkdemochallenge

In the following blog post we will give an overview of the demo projects we made.

Lightship Demo Challengeで作成したデモは、それぞれこれらの機能の1つ以上に焦点を当てたもので、残念ながら優勝は逃しましたが、5つの作品のうち2つが準優勝を獲得しました🎉✨
https://nianticlabs.com/blog/ardkdemochallenge

このブログでは、私たちが作ったデモプロジェクトの概要を紹介します。

BeyBlade

This demo utilized both the Lightship “real time mapping” and multiplier functions of Lightship. The aim of the BeyBlade demo was to create a physics based multiplayer AR game, a game that could be played anywhere and that contained objects that interacted with the real environment.

BeyBlade seemed like a good fit for this as the usual battle “arena” could be replaced with a mesh of the real environment created by the Lightship “real time mapping”. In addition, BeyBlade is a very simple recognisable concept that requires minimal user input to enjoy.

このデモでは、Lightshipの「リアルタイム・マッピング」と「マルチプライヤー」の両方の機能を利用しています。BeyBladeデモの目的は、物理ベースのマルチプレイヤーARゲームを作ることでした。どこでもプレイでき、現実の環境と相互作用するオブジェクトを含むゲームです。

BeyBladeは、通常のバトルの "アリーナ "を、Lightshipの "リアルタイムマッピング "によって作成された実環境のメッシュに置き換えることができるので、これに適していると思いました。また、「BeyBlade」は、非常にシンプルでわかりやすいコンセプトを持っているため、ユーザーの入力を最小限に抑えて楽しむことができます。

Our demo uses the 3D objects from this Unity asset:
https://assetstore.unity.com/packages/templates/tutorials/photon-multiplayer-ar-beyblade-ar-157814

However the movement and damage scripts were heavily modified to work with Lightship, and the networking that controls position synchronization and user interactivity was completely changed from photon to Niantic’s system.

In this demo the host device of the multiplayer session controls all the physics, damage and scores information. When the game starts each user has 3 virtual BeyBlades which they can throw from their device’s position. The BeyBlades land on the environmental mesh and move in a semi-random way, hitting each other until one BeyBlade runs out of health. The first user to lose all 3 of their BeyBlades loses the battle.

今回のデモでは、このUnityアセットの3Dオブジェクトを使用しています。
https://assetstore.unity.com/packages/templates/tutorials/photon-multiplayer-ar-beyblade-ar-157814
  
ただし、動きやダメージのスクリプトはLightshipで動作するように大幅に変更されており、位置の同期やユーザーのインタラクションを制御するネットワークもPhotonからNianticのシステムに完全に変更されています。

このデモでは、マルチプレイヤーセッションのホストデバイスが、物理、ダメージ、スコアの情報をすべてコントロールしています。ゲームが始まると、各ユーザーは3本の仮想ベイブレードを持ち、自分のデバイスの位置から投げることができます。ベイブレードは環境メッシュに着地し、半ランダムに移動しながら、ベイブレードの体力が尽きるまでお互いにぶつかり合います。最初に3つのベイブレードを失ったユーザーがバトルに敗北します。

Dragons

The aim of the dragon demo was to create the feeling of a large-scale cooperative battle against a large monster. I wanted to create an experience that combined multiplayer cooperation with the illusion of fighting a large monster flying above the city.

I used the Lightship multiplayer function to synchronize the user positions and fireballs they would shoot at the dragons. As with the BeyBlade demo the dragon position and health was controlled by the multiplayer session host device.

To achieve the feeling of a large creature flying over the city I tried to use the semantic segmentation function. At the time of the demo challenge, the SDK was still in a very early phase of development, and the resolution of the segmentation was low and the depth accuracy was not high enough to achieve high quality visuals. We look forward to future updates.

ドラゴンのデモの目的は、大規模なモンスターとの協力バトルの感覚を作り出すことでした。多人数で協力しながら、街の上を飛んでいる大きなモンスターと戦っているような錯覚に陥るような体験を目指しました。

Lightshipのマルチプレイヤー機能」を使って、ユーザーの位置とドラゴンに向けて撃つ火の玉を同期させました。ドラゴンの位置や体力は、「BeyBlade」と同様に、マルチプレイヤーセッションのホスト機器で制御しました。

街の上を大きな生き物が飛んでいるような感覚を得るために、セマンティックセグメンテーション機能を使ってみました。デモチャレンジの時点では、SDKがまだ開発の初期段階にあり、セグメンテーションの解像度が低く、深度精度も十分ではなかったため、高品質なビジュアルを実現することはできませんでした。今後のアップデートに期待しています✨

Graffiti

This is a simple graffiti game that allows users to draw on surfaces (the Niantic meshing) and apply stamps and stickers too. In this early state we see it as a way for young children to draw on walls without making their parents mad!
However, we see potential in this system and we are continuing to develop this idea. We hope to turn it into a fully fledged graffiti app

これはシンプルなグラフィティゲームで、ユーザーは表面(Niantic meshing)に絵を描いたり、スタンプやステッカーを貼ることができます。最初の段階では、幼い子供たちが親に怒られることなく壁に絵を描くための方法として考えました。
しかし私たちはこのシステムに可能性を見出しており、このアイデアを継続的に開発しています。本格的なグラフィティアプリにしたいと考えています。

SuicaWari

The aim of the SuicaWari demo was to create an experience to combine physical game experience with the augmentation effects of AR.
I want to design some experiences for families to have fun together. So I choose the SuicaWari(スイカ割り), the traditional physical game which you need to cover your eye then hit the watermelon. Then I created this physical based multiplayer AR game with Niantic SDK as a cooperative game.

When the game starts, the host(parent) can set the moving watermelon on the floor. Then the main player(kid) hands the phone as the virtual sticker to hit the watermelon Intuitively.

SuicaWariのデモの目的は、物理的なゲーム体験とARの拡張効果を組み合わせた体験を作ることでした。

家族で楽しめるような体験をデザインしたいと思い、SuicaWari(スイカ割り)という伝統的なゲームを選びました。そしてこの物理演算ベースのマルチプレイヤーARゲームを、Niantic SDKを使って協力ゲームとして作りました。

ゲームが始まると、ホスト(親)は動くスイカを床に置きます。そして、メインプレイヤー(子供)は、携帯電話を仮想スティックとして手渡し、直感的にスイカを叩きます。

画像1

In this game, there are a few parts that I tried to challenge:
- how to synchronize the status of each watermelon (moving position, animation, hit state)?
- how to synchronize fractions and counters

このゲームでは、いくつか挑戦してみた部分があります。
- それぞれのスイカの状態(移動位置、アニメーション、ヒットの状態)をどのように同期させるか?
- スイカの破片とタイマーの同期の取り方

SkyMemo

The aim of the SkyMemo demo was an idea to draw on the sky. In the beginning, I learned how to use semantics from the ‘MeshingSemantics’ of ARDK example. Then I make a simple practice with sky semantic segmentation, it was nice to let me want to make something that could interact with the sky.

SkyMemoのデモの目的は、空に絵を描くというアイデアでした。最初は、ARDKのサンプルの「MeshingSemantics」からセマンティクスの使い方を学びました。その後、空のセマンティックセグメンテーションを使って簡単な練習をしてみましたが、空と相互作用するようなものを作ってみたいという気持ちにさせてくれました。のデモの目的は、空に絵を描くというアイデアでした。最初は、ARDKのサンプルの「MeshingSemantics」からセマンティクスの使い方を学びました。その後、空のセマンティックセグメンテーションを使って簡単な練習をしてみましたが、空と相互作用するようなものを作ってみたいという気持ちにさせてくれました。

This demo tried to convert 2D sketch path points as 3d particle patterns. You can leave a message in the air. Of course, it can also be removed (The removal feature took me half the time of this project).

このデモでは、2Dスケッチのパス座標を3Dのパーティクルパターンに変換してみました。空中にメッセージを残すことができます。もちろん、削除することもできます(削除機能は、このプロジェクトの半分の時間を要しました)。

画像2

However, after some testing. For a better effect with sky semantic, you could not use a very empty sky. The meshing will detect the empty sky as a mesh. You need some buildings in front of the sky.

しかし、いくつかのテストの結果、スカイセマンティックの効果を高めるためには、あまり空っぽの空を使わないほうが良いかもしれないことがわかりました。メッシング機能は空をメッシュとして検出してしまいます。空の手前に建物などが必要です。

SkyMemo - Multiplayer version

After winning the runners up, Niantic asked if it is possible to update SkyMemo as multi-player version.

I improved this version with the following main features:

準優勝を頂いたあと、Niantic社からSkyMemoをマルチプレイヤーバージョンとしてアップデートできないかと尋ねられました。

このバージョンをつくる上で、主に以下の点を改善しました。

(1) Particle painting performance -
Each particle painting path will keep computing the position by path data. This causes a load on the computation that the original version only supports about 3~5 memos with good FPS. To allow more freedom to draw in the multiplayer version, I fix the particle painting method with Unity Particle System Job System. After the improvement, it allows 15~20 memos with good FPS.

(1)パーティクルペイントの性能
パーティクルペインティングの各パスは、パスデータによって位置を計算し続けます。そのため、計算に負荷がかかり、オリジナル版では3〜5枚程度のメモにしか対応できませんでした。マルチプレイヤー版では、より自由に描画できるように、パーティクルの描画方法をUnity Particle System Job Systemで修正しました。その結果、15~20個のメモを良いFPSで描くことができるようになりました。

(2) Multi-player
- Network data design
Each painting path will generate a lot of points and we need to design the data structure to match paint behaviour and share with each player. Using NetworkingField inside network spacing object then filled painting data by customized command will be a good solution to share huge point data for the multi-player.
- Tip for sharing a lot of data
As the painting will send out lots of data. There is another issue which I send out the drawing data while painting at the same time. Because NetworkingField will broadcast to each player, I need to force an interval for each command to provide a buffer. Otherwise, the network will be stuffed and make App frozen. So I make a simple command queue to store each step and send out step per 3 frames.

(2)マルチプレイについて
- ネットワークデータの設計
各ペインティングパスは大量のポイントを生成するので、ペインティングの動作に合わせてデータ構造を設計し、各プレイヤーに共有する必要があります。ネットワークスペーシングオブジェクト内のNetworkingFieldを使用し、カスタマイズされたコマンドでペイントデータを埋めることで、マルチプレイヤー用の巨大なポイントデータを共有することができます。
- 大量のデータを共有するためのヒント
ペインティングは大量のデータを送信します。描画データを送信しながら、同時に描画も行う場合、別の問題が発生します。NetworkingFieldは各プレイヤーにブロードキャストされるので、コマンドごとに強制的に間隔を空けてバッファを確保する必要があります。そうしないと、ネットワークがいっぱいになってアプリがフリーズしてしまいます。そこで、シンプルなコマンドキューを作り、各ステップを保存し、3フレームごとにステップを送信するようにしました。

(3) Day/Night effect
We also create a new effect for night mode. With this drawing in the night sky will be super fantasy.

(3) 昼と夜のエフェクト
私たちはさらにナイトモード用の新しいエフェクトを作りました。このエフェクトを使って夜空を描くと、とても幻想的になります。


General Notes

- Physics

The meshing capabilities of the Niantic SDK make it well suited to physics based AR elements that can react to the real environment in a more convincing way.

In the Beyblade demo, the Beyblades have physics based movement and damage. I used the Niantic SDK meshing to provide environmental collision so that the Beyblades roll across the floor and bump into walls.

However having physics based movement on separate devices would lead to different behaviour on different devices as the meshing would be slightly different.

So to achieve physics based game-play without conflict all physics are handled by the Host device. The host device handles the physics and then sends the positions of the Beyblades and damage effects to the peer device.

Niantic SDKのメッシング機能は、現実の環境に対してより説得力のある方法で対応でき、物理演算ベースのAR体験にとても適しています。

ベイブレードのデモでは、ベイブレードは物理演算ベースの動きとダメージ効果を保持しています。Niantic SDKのメッシングを使って、ベイブレードが床を転がったり、壁にぶつかったりするためのコリジョンを提供しました。
しかし、物理ベースの動きを別々のデバイスで実現すると、メッシングが微妙に異なるため、デバイスごとに異なる動作になってしまいます。

そこで、物理ベースのゲームプレイを矛盾なく実現するために、すべての物理演算をホストデバイスで処理することにしました。ホストデバイスは物理演算処理を行い、ベイブレードの位置やダメージ効果をピアデバイスに送信します。

- Networking

The camera pose sync and NetworkSpawn features are super convenient and so I use these for most actions in my Beyblade and dragon demos. For example placing Beyblades is achieved by network spawning an object at the camera position, this object contains a script that moves the Beyblade to its position. In the dragon demo shooting fireballs and placing the dragon spawning object are both achieved with network spawn.

However, the most useful features I found in the Niantic SDK networking was the ability to set the transport type and message type of each network message.
The transport types allow us to choose how important the message is, with ReliableOrdered being guaranteed to reach the other devices, and UnreliableUnordered used for messages that are not important. For example in the Beyblade demo I used UnreliableUnordered for position synchronization messages as they are sent very often and so it does not matter if a few are missed by the peer. For important events like damage, game start, etc I used ReliableOrdered.

カメラポーズシンクとNetworkSpawnの機能は非常に便利で、ベイブレードとドラゴンのデモのほとんどのアクションに使用しています。例えば、ベイブレードの設置はカメラのポジションにオブジェクトをNetworkSpawnすることで実現しており、このオブジェクトにはベイブレードをその位置に移動させるスクリプトが含まれています。ドラゴンのデモでは、火の玉を撃つこと、ドラゴンを生成するオブジェクトの配置には、どちらもNetworkSpawnで実現しています。

しかし、私が Niantic SDK のネットワーク機能で最も便利だと思ったのは、各ネットワークメッセージのトランスポートタイプとメッセージタイプを設定できることです。
トランスポートタイプでは、メッセージの重要度を選択することができ、ReliableOrderedは他のデバイスへの到達が保証され、UnreliableUnorderedは重要ではないメッセージに使用されます。例えば、ベイブレードのデモでは、位置同期メッセージにUnreliableUnorderedを使用しました。これは、非常に頻繁に送信されるため、相手が多少見逃しても問題ないからです。ダメージやゲームスタートなどの重要なイベントにはReliableOrderedを使いました。
private List<TransportType> _transportTypes =
     new List<TransportType>()
     {
       TransportType.UnreliableUnordered,
       TransportType.UnreliableOrdered,
       TransportType.ReliableUnordered,
       TransportType.ReliableOrdered
     };

 Message types are an easy way to identify data so it can be more easily used by the receiving device. For example I used the following message types to identity data in the Beyblade demo:

メッセージタイプは、データを識別するための簡単な方法で、受信側のデバイスでより簡単に使用することができます。例えば、ベイブレードのデモでは、以下のメッセージタイプを使ってデータを識別しています。
private enum _MessageType:
       uint
     {
       _image = 1,
       _message,
       _vector3,
       _spawn,
       _somethingelse,
       _control,
     }

And used commands such as this to send data of a specific type:

そして、特定のタイプのデータを送信するために、このようなコマンドを使用しました。
Networking.BroadcastData((uint)_MessageType._message, data, _transportTypes[3], true);

Another easier way if you want to share the data with every user, you could use the NetworkedField of HLAPI. It will create a shared object for your network group. This is really handy when you need to synchronize a global variable. We use this for the health and animation synced of Dragon demo, and score and counter synced of SuicaWari demo.

For example, I need to sync the `score` in SuicaWari.

データをすべてのユーザーと共有したい場合は、HLAPI の NetworkedField を使うと簡単です。これにより、ネットワークグループの共有オブジェクトが作成されます。これは、グローバル変数を同期させる必要があるときにとても便利です。Dragonデモの体力とアニメーションの同期、SuicaWariデモのスコアとタイマーの同期などに使用しています。

例えば、SuicaWariの`score`を同期させたい場合です。

画像3

First prepare the declaration and events of networkedField:

まず,networkedFieldの宣言とイベントを用意します.
private INetworkedField<int> _scoreIntField; 

_scoreIntField = new NetworkedField<int>("scoreIntField", authToObserverDescriptor, group);
_scoreIntField.ValueChanged += OnScoreDidChanged;

If score has been changed, user will auto get the value:

スコアが変更された場合、ユーザーは自動的にその値を取得します。
private void OnScoreDidChanged(NetworkedFieldValueChangedArgs<int> args)
{
 _score = args.Value.GetOrDefault();
 if(_scoreText != null)
   _scoreText.text = _score.ToString();
}

The score value only changed by the host to ensure that scores are not double-counted:​

スコアの値は、スコアが二重にカウントされないように、ホストによってのみ変更されます。
public void ChangeScore(int scorenum)
{
 if(_isHost) {
   _scoreIntField.Value = scorenum;
 }
}

-Localization

 The automated localization of multiple devices is probably the Niantic SDKs most useful function at the moment. However one issue I found is that sometimes is can take a long time to localize (sync the multiple device’s positions in the world). Therefore I think is it important to show the users when the localization has happened.

複数のデバイスの自動ローカリゼーションは、おそらく現時点では Niantic SDK の最も便利な機能です。しかし、私が見つけた一つの問題は、ローカライズ(世界における複数のデバイスの位置の同期)に時間がかかることがあるということです。そのため、ローカリゼーションが完了したことをユーザーに示すことが重要だと考えています。

- Position Sync

When devices are localized the position and rotation of AR anchors is generally very accurate (within a few cm and degrees). Therefore I found it useful to make objects I want to track the child of the AR anchor and then sync their local position rather than global position.

デバイスがローカライズされると、ARアンカーの位置と回転は概して非常に正確になります(数cm、数度以内)。そのため、追跡したいオブジェクトをARアンカーの子にして、グローバルな位置ではなくローカルな位置を同期させると便利だと思いました。

- Semantic Segmentation

The semantic segmentation can now segment buildings, foliage (trees), and grass, in addition to sky and ground. I tested today and the building and foliage segmentation worked really well. However all the segmentation is glitchy and low resolution at the moment.

I asked the Niantic guys and they say they will increase the resolution soon, so I'm looking forward to future updates.

セマンティックセグメンテーションでは、空と地面に加えて、建物、木の葉(木)、草をセグメンテーションできるようになりました。今日テストしたところ、建物と木の葉のセグメンテーションはとてもうまくいきました。しかし、すべてのセグメンテーションで不具合があり、解像度も低いです。Nianticのスタッフに聞いてみたところ、近々解像度を上げる予定だそうなので今後のアップデートに期待しています😊

Virtual Studio

Using Virtual Studio could save a lot of time to check your game logic, effects, animation and AR/Networking functions. You could run your game without mobile device.

Virtual Studioを使うことで、ゲームのロジック、エフェクト、アニメーション、AR/ネットワーク機能をチェックする時間を大幅に短縮できます。モバイル端末がなくてもゲームを動かすことができます。

Mock Mode
This is very helpful feature to help you check some visual design detials.
Using Mock mode could run almost everything (besides some custom multi-player behaviors) inside the Unity Editor. For example, I could test UI flow and hit plane to generate Networking objects of the SuicaWari project.

Mock Modeは、ビジュアルデザインの詳細をチェックするのに非常に役立つ機能です。モックモードを使うと、(マルチプレイヤーのカスタムビヘイビアを除いて)ほとんどのものをUnityエディタ内で動かすことができます。例えば、SuicaWariプロジェクトのネットワーキングオブジェクトを生成するために、UIフローやヒットプレーンをテストすることができます。

Remote Mode
This could help you debug some meshing and depth stuffs via mobile streaming with USB/Wifi. But I don't use this often because of the performance of my older MacBook Pro .

Remote Modeは、USB/Wifiを使ったモバイルストリーミングで、メッシュ処理や深度処理のデバッグをするのに役立ちますが、私の古いMacBook Proの性能では、これを頻繁に使うことはありません。

Editorial Note - 編集後記

Hello! I'm Mariko from The Designium PR.
What did you think of the demos and explanations of the Niantic Lightship ARDK, the hottest AR technology used in Pokémon GO and Pikmin Bloom? I was very excited to see these demos✨I'm looking forward to more AR work in the future😊We have a lot of other AR projects in the works, so please follow us on Twitter and note to check them out!!

こんにちは!デザイニウム広報のマリコです。
AR技術の中でも「ポケモンGO」や「ピクミンブルーム」でも使われている大注目の技術「Niantic Lightship ARDK」のデモと解説、いかがでしたか?私はこれらのデモを見て、とてもワクワクしました✨今後のAR作品がますます楽しみです😊

デザイニウムでは他にも様々なAR作品を公開しているので、Twitterやnoteをフォローして頂けたらとても嬉しいです❗













この記事が気に入ったらサポートをしてみませんか?