マーカーシンクを使ってローカライズする
このドキュメントでは、ARDKを使用して、共有環境で複数のユーザーをローカライズするために、ユーザーにビジュアルマーカー(QRコードなど)をスキャンしてもらう方法について説明します。
ARDKで可能なその他のARローカライゼーションには環境中のオブジェクトのスキャンが含まれますが、これはユーザーにとって難しい状況となる場合があります。環境内のオブジェクトではなく、マーカーをスキャンした方が楽な場合が多く、この方法は、スキャンに適したオブジェクトが見つからない場合や取り込めない場合にも便利です。さらに、マーカーにはセッション情報を含めることもできるため、クライアントはマーカーをスキャンして特定の共有ARセッションに参加するだけでなく、そのセッションとの同期を行うことができます。
一般的に、マーカーを使用した同期では、環境を使用した同期よりも精度が低く、ピアの位置や方向がずれる場合があります。屋外など、スキャン可能なオブジェクトや特徴が少ない空間では、マーカーシンクを使用してください。
マーカーを使用して同期を行う
マーカーを使った同期は次のように行います。
ホストでマーカーデータを生成する
ホストでARNetworking.InitializeForMarkerScanningを呼び出し、マーカーを画面に表示する
非ホストのクライアントはARNetworking.ScanForMarkerを使用し、ホストデバイスに表示されているマーカーをスキャンします。クライアントは結果をもとに、セッションへの参加や、共有セッションでのローカライゼーションを行います。クライアントのPeerStateが安定状態の場合は、クライアントがmarkersyncを使用して共有環境で正常にローカライゼーションを行ったことを意味します。
次のフローチャートは、基本フローと必要なAPIコールを示します。点線のボックスは、開発者が行う手順、実線のボックスは、ユーザーやプレイヤーが行う手順を示します。灰色部分は、同時に行われる手順を示します。
マーカーの生成
IARNetworking.InitializeForMarkerScanningメソッドで必要なのは、マーカーの点の位置のみです。つまり、マーカーの生成や表示、解析、スキャンは、任意の方法で行うことができます。ただし、次の点に注意する必要があります。
マーカーが少なくとも4つの識別可能な点(例: QRコードの3つの位置点と1つのアライメント点)で構成されている
マーカーの点は、表示中は画面上で静止している
IMarkerScanner の実装によって、世界をスキャンしてマーカーを検出できる
必要に応じて、IARNetworking.ScanForMarkerを呼び出して渡します。
何も渡されない場合は、QRコードをスキャンするデフォルトの実装(ARFrameMarkerScanner)が使用されます。
IMarkerParser の実装によって、
IMarkerScanner
で指定されたピクセル配列から MarkerMetadata (byte[]
としてシリアライズ)を抽出できます。ARFrameMarkerScanner
を構築する際に必要に応じて渡します。IMarkerScanner
をカスタム実装する場合は必須です。何も渡されない場合、またはデフォルトの
IMarkerScanner
を使用する場合は、デフォルトの実装( ZXingBarcodeParser )が使用されます。これはマーカーがQRコードの場合のみ使用できます。
IMarkerParser
と同様に実装することで、ホストからIARNetworking.InitializeForMarkerScanning
を呼び出して登録される4点以上のマーカーの点を識別できますIMetadataSerializer の実装によって、
IMarkerParser
からMarkerMetadata
にバイトをデシリアライズできます。必要に応じて
IARNetworking.ScanForMarker
を呼び出して渡します。何も渡さない場合は、デフォルトの実装(BasicMetadataSerializer)が使用されます。
例
QRコードを利用して、複数のプレイヤーをマルチプレイヤーARセッションに素早く参加して同期を行うサンプルシーンは、 Assets/ARDKExamples/MarkerSync
の ARDKの使用例 プロジェクトを参照してください。
ヘルパー
ZXingMarkerGeneratorは、
MarkerMetadata
でバーコードを生成し、IARNetworking.InitializeForMarkerScanning
の呼び出しに必要な位置を計算する方法の例です。BarcodeDisplayは、
ZXingMarkerGenerator
で生成されたバーコードを表示するためにシーンに配置できるヘルパーコンポーネントです。
ベストプラクティス
デバイスのARトラッキング状態が最適化されたら、IARNetworking.ScanForMarkerを呼び出します。
トラッキング精度は、ARSessionの
CurrentFrame.Camera.TrackingState
で確認できます。一番高い精度はTrackingState.Normal
です。
マーカーとの同期が完了しても、全プレイヤーが
PeerState
からStable
になるまで、プレイヤーは同じエリアを探し続けさせるようにしてください(マップを見つけて同期する可能性が高まります)。マーカーシンクでは、ほぼ瞬時にプレイヤー間の同期を行うことができますが、ARDKの従来の同期方法のようにドリフト補正が有効ではありません。
マーカーシンクによって移行した状態
PeerState.Stabilizing
でもプレイには問題ありませんが、高い信頼性で同期を行うには、マップを使用してPeerState.Stable
に移行することをお勧めします。