はじめに

以前、最近のVPSを比較してみた。 という記事で Immersal・Geospatial API・Vuforia・Niantic の4つのVPSを比較しました。

あれから約3年が経ち、各VPSのSDKやAPIはアップデートが続いています。特に Immersal の Discord では新機能に関する議論が活発に行われており、改めて調査してみようと思いました。

本記事では以下の内容をまとめています。

  • AR Foundation 6.4 における Vulkan サポートについて
  • Immersal の変更点(GeoPose ローカライズの追加など)
  • Geospatial API の変更点(Streetscape Geometry・Scene Semantics API など)
  • ローカライズ速度の実測比較(Immersal 3方式 vs Geospatial API)
  • 他の VPS(Vuforia・Niantic)の近況

各 SDK の最終更新

調査時点(2026年4月)での各 SDK・API の最新バージョンは以下のとおりです。


SDK / API
最新バージョン更新日
Immersal SDKv2.3.02026年2月12日
ARCore Extensions(Geospatial API)v1.53.02026年3月10日
Vuforia Enginev11.42025年9月10日
Niantic Spatial SDKv4.0.02026年4月頃

どの SDK も継続してアップデートされており、3年前の記事と比べて機能が大きく拡充されていることがわかります。

開発環境

  • Unity 6000.4.1f1
  • AR Foundation 6.4.2(ARCore 6.4.2 / ARKit 6.4.2)
  • ARCore Extensions 1.53.0
  • Immersal SDK 2.3.0
  • 動作確認端末 : Pixel 10

AR Foundation 6.4 における Vulkan サポートについて

対応方法のドキュメント

AR Foundation では Vulkan レンダリングバックエンドへの対応が進んでいます。ドキュメント上は 6.1 以降で対応とされていますが、Pixel 端末では 6.4 未満だとカメラ映像(現実の背景)が表示されない問題がありました。実用上は AR Foundation 6.4 以降を使用するのがよいかと思います。

Immersal のドキュメントには動作環境として OpenGLES3 が指定されていますが、Vulkan 環境下でも問題なく動作することを確認しています。パフォーマンスの面でも OpenGLES3 と比べて改善が見込めるため、新規プロジェクトでは Vulkan を選択するのもよいかもしれません。

Immersal の変更点

GeoPose ローカライズの追加

以前の Immersal SDK では、ローカライズ方式として以下の2つがありました。

  • Device Localization:マップデータをデバイスにダウンロードして端末上で処理
  • Server Localization:カメラ画像をサーバーに送信してクラウドで処理

最新の SDK では GeoPose Localization が追加されています。GeoPose は GPS 情報を活用して検索範囲を絞り込み、クラウドでローカライズを行う方式です。マップをダウンロードする必要がなく、ネットワーク環境があれば利用できます。

なお、ドキュメントにはサンプルシーンへの言及がありますが、実際には SDK にサンプルが含まれていないため、自力で実装する必要があります。


Immersal
GeoPose

Immersal
DeviceLocalization

Immersal
ServerLocalization

Google
Geospatial API
処理場所クラウドデバイス上クラウドクラウド
GPS活用あり(検索範囲絞り込み)なしなしあり(中心)
マップDL不要必要不要不要(Google側が保有)
ネットワーク必須不要必須必須

GeoPose を使用する際の注意点として、マップを Public に設定する必要があります。また、精度を高めるためには屋外で数十メートル歩きながらマッピングするのが望ましいようです。屋内でも動作はしましたが、精度は屋外に比べて落ちる印象でした。

ドキュメントには ECEF 座標系(tx, ty, tz, qw, qx, qy, qz)の設定が必要との記載がありますが、すべて 0 のままでも動作しました。また、新しい Mapper アプリではなぜか ECEF 座標が設定されないようです。この辺りはドキュメントの不備があるかもしれません。

実装のポイント

GeoPose の実装は他の方式と比べてシンプルです。GeoPoseLocalization コンポーネントをシーンに追加し、XRMapLocalizationMethod に設定するだけで、SDK の初期化・セッション管理は DeviceLocalization・ServerLocalization と同様に行えます。

xrMap.LocalizationMethod = geoPoseLocalization;


GeoPoseLocalization には SearchRadius(デフォルト 200m)パラメーターがあり、GPS 座標を中心にマップを検索する半径を指定できます。なお、GeoPoseProcessor というコンポーネントも SDK に含まれていますが、これはローカライズ結果のマップ座標を WGS84(緯度・経度・方位角)に逆変換して UI に表示するための IDataProcessor であり、ローカライズ自体には不要です。

ローカライズの完了は Localizer.OnFirstSuccessfulLocalization イベントで検知できます。

Mapper アプリで動画ライクな Map 作成が可能に


以前は静止画を複数枚撮影してマップを作成していましたが、最新のMapper アプリでは動画のように連続してフレームを取り込みながらマッピングできるようになりました。直感的な操作でマップを作成できるため、以前と比べてかなり使いやすくなっています。

Geospatial API の変更点

Streetscape Geometry


Streetscape Geometry は、建物や地形の 3D メッシュをリアルタイムに取得できる機能です。AR Foundation と組み合わせることで、現実の建物にオクルージョンを適用したり、建物の壁面にコンテンツを貼り付けたりといった表現が可能です。実際に試してみたところ、建物の形状はかなり正確に取得できており、実用的に使えそうだと感じました。

ARCore Extensions のサンプルシーンに Streetscape Geometry の実装が含まれており、そのまま動作することを確認しています。

Scene Semantics API


Scene Semantics API は、カメラ映像のピクセルごとに「空・建物・道路・樹木・車・人」などのラベルを判定してセマンティックセグメンテーションを行う機能です。

Streetscape Geometry と異なり、Scene Semantics API はサンプルシーンに実装が含まれていないため、自力で実装する必要があります。実際に試してみると、オーバーレイ表示自体は動作しました。ただし、端末を素早く回転させると、セマンティクス処理の遅延によりオーバーレイが実際のカメラ映像とずれてしまいます。また、ARCore が提供するセマンティクステクスチャはカメラセンサーの向き(横長)で出力されるため、ポートレート表示に合わせて 90° 回転する処理が必要でした。現時点ではまだ実用的な精度とは言えないかもしれませんが、今後のアップデートに期待です。

実装のポイント

ARSemanticManager コンポーネントは XROrigin の GameObject にアタッチします(ARAnchorManagerARRaycastManager などの他の Manager 類と同様です)。その後、ARCoreExtensionsConfigSemanticModeEnabled に設定します。

ARCoreExtensions.ARCoreExtensionsConfig.SemanticMode = SemanticMode.Enabled;


テクスチャの取得は TryGetSemanticTexture() で行います。返されるテクスチャはカメラセンサーの向き(横長)で出力されるため、ポートレート表示の場合は 90° CCW 回転が必要です。各ピクセルの値がラベルのインデックス(0〜11)になるため、ラベルごとに色を割り当てて Texture2D に書き込みます。

private Texture2D _semanticTexture;
private Texture2D _semanticDisplayTexture;

  // ラベルインデックスに対応する表示色(0〜11)
  private static readonly Color32[] LabelColors = new Color32[12]
  {
      new Color32(  0,   0,   0,   0),  // 0: Unlabeled(透明)
      new Color32(135, 206, 235, 160),  // 1: Sky
      new Color32(255, 140,   0, 160),  // 2: Building
      new Color32( 34, 139,  34, 160),  // 3: Tree
      new Color32(128, 128, 128, 160),  // 4: Road
      new Color32(192, 192, 192, 160),  // 5: Sidewalk
      new Color32(139,  90,  43, 160),  // 6: Terrain
      new Color32(148,   0, 211, 160),  // 7: Structure
      new Color32(218, 165,  32, 160),  // 8: Object
      new Color32(220,  20,  60, 160),  // 9: Vehicle
      new Color32(255, 182, 193, 160),  // 10: Person
      new Color32(  0, 105, 148, 160),  // 11: Water
  };

  void UpdateSemanticOverlay()
  {
      if (!SemanticManager.TryGetSemanticTexture(ref _semanticTexture))
          return;

      int srcW = _semanticTexture.width;
      int srcH = _semanticTexture.height;

      // ARCore はカメラセンサーの向き(横長)でテクスチャを提供する
      bool needsRotation = srcW > srcH;
      int dstW = needsRotation ? srcH : srcW;
      int dstH = needsRotation ? srcW : srcH;

      // 寸法変化にも対応
      if (_semanticDisplayTexture == null ||
          _semanticDisplayTexture.width  != dstW ||
          _semanticDisplayTexture.height != dstH)
      {
          _semanticDisplayTexture = new Texture2D(dstW, dstH, TextureFormat.RGBA32, false);
          _semanticDisplayTexture.filterMode = FilterMode.Bilinear;
          _semanticDisplayTexture.wrapMode   = TextureWrapMode.Clamp;
      }

      byte[]    rawData = _semanticTexture.GetRawTextureData();
      Color32[] colors  = new Color32[dstW * dstH];

      if (needsRotation)
      {
          // 90° CCW: dstX = srcY, dstY = srcW - 1 - srcX
          for (int srcY = 0; srcY < srcH; srcY++)
          for (int srcX = 0; srcX < srcW; srcX++)
          {
              int dstX  = srcY;
              int dstY  = srcW - 1 - srcX;
              int label = Mathf.Clamp(rawData[srcY * srcW + srcX], 0, 11);
              colors[dstY * dstW + dstX] = LabelColors[label];
          }
      }
      else
      {
          for (int i = 0; i < rawData.Length; i++)
              colors[i] = LabelColors[Mathf.Clamp(rawData[i], 0, 11)];
      }

      _semanticDisplayTexture.SetPixels32(colors);
      _semanticDisplayTexture.Apply();
  }

ローカライズ速度の比較

計測方法

Immersal(DeviceLocalization / ServerLocalization / GeoPose)と Geospatial API のローカライズが完了するまでの時間を実測しました。場所は道路際にある石川啄木の像の付近を選択しました。

計測場所の選定にあたっては、両システムにとって公平な環境になるよう配慮しました。Geospatial API は Google ストリートビューに収録されている場所でなければ位置合わせができないため、ストリートビューで撮影済みの道路沿いを選んでいます。Immersal 用には同じ場所でマッピングを行い、公開マップとして登録したうえで計測しました。

  • Immersal:SDK の初期化・セッション開始から最初のローカライズ成功までの時間
  • Geospatial API:AREarthManagerEarthTrackingStateTracking になってから、水平誤差 20m 以内かつ方位誤差 25° 以内になるまでの時間

計測結果

ローカライズ時間(秒)の比較。

回数
Immersal
DeviceLoc

Immersal
ServerLoc

Immersal
GeoPose

Google
Geospatial API
11.201.421.120.83
21.130.991.220.90
31.261.091.120.73
41.021.071.170.67
51.161.881.17 0.83
61.091.081.020.83
71.041.151.110.77
81.111.081.230.77
91.121.131.080.98
101.361.251.200.83
平均1.151.211.140.81

考察

全体的に、どの方式も 1 秒前後 でローカライズが完了しており、以前の調査と比べてどの方式も高速化されている印象です。

Immersal の 3 方式を比較すると、GeoPose が最も速く(平均 1.14 秒)、次いで DeviceLocalization(1.15 秒)、ServerLocalization(1.21 秒)という結果でした。ただし差は非常に小さく、実用上はどの方式もほぼ変わらないと言えるかもしれません。DeviceLocalization はマップをダウンロードする手間がかかる分、ローカライズそのものは安定しています。

Geospatial API は平均 0.81 秒と最も速い結果でした。ただし Geospatial API のローカライズ完了条件(水平誤差 20m・方位誤差 25°)は Immersal のそれとは性質が異なるため、単純な優劣の比較は難しいかもしれません。Geospatial API はサーバー側の地図データをもとに位置を推定するため、マッピング作業が不要という大きなメリットがあります。

他の VPS の近況

Vuforia

Vuforia は画像マーカーやモデルターゲットに強みを持つ SDK です。最新の v11.4 では On-Prem Advanced Model Targets の Android 対応などが追加されています。一方、v11.4 で Unity AR Foundation のサポートが削除された点は注意が必要です。

ドキュメントからは VPS 用途として特にめぼしい新機能が見つけられなかったため、今回の比較対象からは除外しました。

Niantic Spatial SDK

詳細は別記事「Niantic Spatial SDKをMeta Quest 3で動かしてみた」にまとめています。

Niantic Spatial SDK(NSDK)は Lightship ARDK の後継 SDK で、Object Detection・Meshing・VPS2 の3機能を搭載しています。

VPS2Scaniverse で空間をスキャンしてマップを作成する方式で、以前の「高精度 VPS」が依存していた Lightship.dev(2026年2月末終了)とは独立して動作します。屋内での位置合わせ精度は高く、Meshing・Object Detection との組み合わせや配置情報の永続化も実現できました。

まとめ

今回は Immersal と Geospatial API を中心にVPSの最新動向を調査しました。

  • Immersal は GeoPose ローカライズの追加や Mapper アプリの改善により、以前と比べてかなり使いやすくなっています。ローカライズ速度も高速で安定しており、マップを自作できる柔軟性は依然として大きな強みだと思います。
  • Geospatial API はローカライズ速度が最速で、マッピング作業が不要なため導入コストが低いのが魅力です。Streetscape Geometry も実用的なレベルに達しており、屋外 AR の用途では非常に有力な選択肢だと感じました。Scene Semantics API はまだ発展途上といったところです。
  • AR Foundation 6.4 + Vulkan の組み合わせでも Immersal が動作することを確認しました。

用途や環境に合わせて使い分けるのがよいかと思いますが、「マッピング不要・すぐ使える」という点では Geospatial API が、「特定の場所でより正確なローカライズ」が必要な場合は Immersal が向いていると感じました。



ギャップロを運営しているアップフロンティア株式会社では、一緒に働いてくれる仲間を随時、募集しています。 興味がある!一緒に働いてみたい!という方は下記よりご応募お待ちしております。
採用情報をみる