共有環境でローカライゼーションする

このドキュメントでは、ARDKを使用して、共有環境で複数のユーザーをローカライズするために、ユーザーに現実世界の共通オブジェクトをスキャンしてもらう方法について説明します。

このステップは、ARDKネットワークAPIを使用して、クライアントが参加できるARNetworkingセッションを作成するコードをAR体験に追加済みであることを前提としています。ARNetworkingセッションの作成と参加に関する詳細については、 共有ARを使い始める および ネットワークARセッションのセットアップ をご参照ください。

環境を使用し同期する

環境を使用した同期は次のように行います。

  • ホストとして指定されたクライアントは、環境内の静的オブジェクトをスキャンし、最初のスキャンデータを1つ以上NianticのARバックエンドにアップロードします。

  • 非ホストのクライアントは、NianticのARバックエンドから最初のスキャンデータを受け取り、オブジェクトを同様にスキャンしてから、スキャンしたオブジェクトをすべて使用して共有環境内で同期を行い、同じ場所に配置します。

  • これで、すべてのクライアントに同一の座標空間(ホスト空間)が共有され、同じ場所にあるポーズ情報を共有できるようになったため、各クライアントは(共有された)世界で他のクライアントの場所を特定できます。

ホストとして環境をスキャンする

まず、ホストとして指定されたクライアントは、環境をスキャンして、他のクライアントとの同期を行うために共有可能なマッピング情報を収集する必要があります。ARSessionを設定して実行し、マッピングデータを収集します。ARNetworkingManagerを使用するか、ARSessionで IsSharedExperienceEnabled を有効にします。手順については、ネットワークARセッションのセットアップ の「共有体験の開始」をご参照ください。

IsSharedExperienceEnabled が有効になるとすぐに、セッションでマッピング情報の収集が開始されます。ホストとして指定されたクライアントは、環境のスキャンを開始し、マッピングデータをNianticのARバックエンドに送り返します。共有セッションが動作するように、ホストは少なくとも1つのマップをNianticのARバックエンドに送信する必要がありますが、ホストはセッションが有効である限り、定期的にNianticのARバックエンドにアップデート情報を送信します。

ホストユーザーが最初のマップを正常にスキャンできるように、このスキャンプロセスにおいて、次のガイドラインをユーザーに伝え、ゲーム内で明確な指示を出すことをお勧めします。

  • 環境内にある静止オブジェクトを探してスキャンしてください。際立った特徴(縁取りの明暗差が大きい、パターンの非対称や繰り返しなど)が多く、表面に光沢や反射がないオブジェクトを探します。たとえば、特徴や色が目立つオブジェクト(靴など)が挙げられます。

  • マッピングするオブジェクトから3フィート以上離れて立ってください。

  • デバイスのカメラは、真正面からオブジェクトに向け、高い位置や低い位置から向けないようにしてください。また、床に向けないでください。3Dシーンの情報をできるだけ詳細に収集する必要があるため、広くて平らな面や平面はあまり役に立ちません。テーブルなどを使用し、オブジェクトの配置を高くすることが必要になる場合があります。

  • カメラをオブジェクトに向けたまま、オブジェクトを中心にゆっくりと円を描くように数歩ずつ移動します。左回りと右回りの両方を行います。オブジェクトに近づいたり、オブジェクトから遠ざからないように注意してください。カメラは旋回させないでください(左右や上下に動かさず、1点を中心に回転させる)。

  • スキャンが完了するまで、左右に移動します。この作業には約15秒かかりますが、環境の複雑さやお使いのデバイスの機能によっては、数分かかる場合もあります。

次の動画では、ゲーム内でのマッピングやローカライズの見え方について解説します。

スキャンプロセスをテストする際は、デバッガをアタッチしないようにご注意ください。パフォーマンスに悪影響を及ぼす可能性があります。

スキャンやマッピングのプロセスの最中は、スキャン中であることを示すメッセージがユーザーに通知されます。スキャンの進行状況をユーザーに表示するには、ARFeaturePointRendererを使用して、IARFrame.RawFeaturePoints の点群データをレンダリングします。

最初のスキャンが完了するまで、ホストのPeerStateは WaitingForLocalizationData のまま変わりません。最初のスキャンが完了すると、ホストのPeerStateは Stable に更新されます。スキャンが正常にアップロードされたことや、他のユーザーがセッションに参加してローカライズを開始できることをユーザーに通知することができます。スキャンしたマップを表示する場合は、ARMapVisualizationRendererを使用します。

非ホストのクライアントとして環境の同期を行う

非ホストのクライアントが、IsSharedExperienceEnabled が有効のセッションに参加するには、同一の環境をスキャンして、ホストがアップロードしたマッピングデータとの同期を行い、ローカライズする必要があります。

クライアントがセッションに参加すると、ホストによってアップロードされたマッピングデータが、NianticのARバックエンドから直ちに送信開始されます。上記の「ホストとして環境をスキャンする」に記載されているのと同様のガイドをユーザーに提供し、ホストがスキャンしたのと同じ静止オブジェクトのスキャンを開始してもらう必要があります。進行状況を追跡するには、クライアントのPeerStateを確認します。

  • PeerStateが Unknown の場合は、クライアントはNianticのARバックエンドに接続されていないことを意味します。ゲームはNianticのバックエンドへの接続の待機中であることをユーザーに通知できます。

  • PeerStateが WaitingForLocalizationData の場合は、ホスト側で最初のマップのアップロードが完了していないか、ネットワーク上の問題が発生していることを意味します。クライアントは、ホストからのデータアップロードの待機中であることをユーザーに通知できます。

  • PeerStateが Localizing の場合は、クライアントがNianticのARバックエンドからマッピングデータを受信済みであることを意味します。この時点で、ユーザーはホストと同じ環境のスキャンを開始します。ホストスキャンプロセスに記載されているガイドラインと同じユーザーガイドラインを使用してください。ユーザーはホストがスキャンしたと同じオブジェクトや環境を、同一の距離やデバイスの向きでスキャンする必要があります。

  • PeerStateが Stable の場合は、ARDKによってユーザーのスキャンデータがNianticのARバックエンドからダウンロードしたデータと同期され、クライアントが共有環境にローカライズされたことを意味します。

  • PeerStateが Failed の場合は、ホストが最初のマッピング情報をアップロードできず、セッションから退出したことを意味します。この際、クライアントもセッションから切断されるため、新しいセッションに再接続する必要があります。

次の基本コードの例では、PeerStateのアップデートをサブスクライブし、PeerStateを確認します。

using Niantic.ARDK.AR.Networking;
using Niantic.ARDK.AR.Networking.ARNetworkingEventArgs;

IARNetworking _arNetworking;

void SubscribeToPeerStateUpdates()
{
 _arNetworking.PeerStateReceived += OnPeerStateReceived;
}
void OnPeerStateReceived(PeerStateReceivedArgs args)
{
  var peer = args.Peer;
  var peerState = args.State;
  // In this example, ignore update if it's not for the local device
  if (_arNetworking.Networking.Self.Identifier != peer.Identifier)
    return;
  // Leave session (or do something else) if localization failed
  if (peerState == PeerState.Failed)
    _arNetworking.Networking.Leave();
  // ...process other PeerStates accordingly...
}

また、IARNetworkingインターフェイスを通じて、すべてのピアのローカライゼーションの最新ステータスを取得することができます。

var allPeerStates = arNetworking.LatestPeerStates;
var myPeerState = arNetworking.LocalPeerState;

ローカライゼーションデータをスキャンし、そのプロセスをユーザーに通知する方法については、ARDK使用例のARNetworkingサンプルや、ARDKのダウンロード のAR Voyageのサンプルを参照してください。

すべてのクライアントのローカライゼーションの完了後に、共有AR空間のクライアントの位置や向きを共有する方法については、仮想オブジェクト情報を共有する をご参照ください。