OpenXRとMeta Questではじめる!AR/MRアプリの現実世界との位置合わせ - Immersal編 -

1. はじめに
Unity の OpenXR:Meta パッケージは、2025年8月現在、バージョンが 2.2.0 となり機能のアップデートが進んでいます。
AR/MRアプリの体験の質を左右する「現実世界との位置合わせ」には様々な手法が存在しますが、この記事ではその中から、外部のVPS(Visual Positioning System)である Immersal を利用した位置合わせ手法を、Meta Quest の OpenXR 環境で実現できるか検証します。
先に、検証結果のデモ動画をご覧ください。
ご覧のように、Meta Quest の実機で Immersal を使った位置合わせに成功しました。
この記事では、このデモを実現するための具体的な開発環境の構築方法から実装のポイントまでを解説していきます。
なお、本記事を作成するにあたって、下記の素晴らしい記事を参考にさせていただきました。
Unity 用 Meta Quest 位置合わせライブラリ (QR / Immersal) の仕組み
2. OpenXR:Meta パッケージを利用した開発環境構築
OpenXR:Meta パッケージを利用した開発環境の構築方法について説明します。
開発環境構築の詳細は、公式ドキュメントに詳しく記載されていますので、ここでは概要に留めます。
2.1. 新規プロジェクトを作成とプロジェクト設定
-
Unity Hub

-
Build Profiles : Meta Quest に Switch Platform

-
Universal Render Pipeline Asset : Mobile_RPAsset を修正

-
Universal Renderer Data : Mobile_Renderer を修正

2.2. OpenXR:Meta パッケージのインストールと設定
-
Package Manager : OpenXR:Meta パッケージをインストール

-
Project Settings : XR Plug-in Management で OpenXR、Meta Quest feature group を有効化

-
Project Settings : OpenXR で Oculus Touch Controller Profile を追加

2.3. シーンの設定
- シーンの作成 : GameObject > XR メニューから 、AR Session と XR Origin (Mobile AR) を追加
- Camera コンポーネントの設定 : MainCamera の Camera コンポーネントの Clear Flags を Solid Color に変更し、Background Color を黒(0, 0, 0, 0)に設定
3. Passthrough Camera Api の導入
Meta Quest でのカメラ映像取得は、残念ながら現時点において、OpenXR:Meta パッケージで提供されている AR Foundation ではサポートされていません。
そのため、Meta XR Core SDK を導入して Passthrough Camera Api を利用します。
Immersal で必要な機能を Passthrough Camera Api の サンプルプロジェクト からピックアップします。
3.1. Meta XR Core SDK のインストール
-
Package Manager

-
Project Settings : XR Plug-in Management で Meta XR feature group を有効化

3.2. Immersal に必要なパッケージのインポートとプロジェクト設定
-
GitHub : https://github.com/oculus-samples/Unity-PassthroughCameraApiSamples/tree/main/Assets/PassthroughCameraApiSamples/PassthroughCamera
実質的に必要なのは、PassthroughCamera フォルダ以下ですが、映像が取得できているかを確認するために、CameraViewer フォルダもインポートします。


-
Project Settings : AndroidManifest の設定
Passthrough Camera Api を利用するために、AndroidManifest.xml の設定を行います。

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<!--Used when Application Entry is set to Activity, otherwise remove this activity block-->
<!--<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>-->
<!--Used when Application Entry is set to GameActivity, otherwise remove this activity block-->
<activity android:name="com.unity3d.player.UnityPlayerGameActivity"
android:theme="@style/BaseUnityGameActivityTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.app.lib_name" android:value="game" />
</activity>
</application>
<uses-feature android:name="com.oculus.feature.PASSTHROUGH" android:required="true" />
<uses-permission android:name="com.oculus.permission.USE_SCENE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="horizonos.permission.HEADSET_CAMERA" />
</manifest>
3.3. OpenXR 向けの Script 修正
PassthroughCamera の WebCamTextureManager.cs スクリプトは、OpenXR を利用する想定で作成されていないため、OpenXR 向けに修正します。
修正箇所は、WebCamTextureManager.cs の InitializeWebCamTexture メソッドの中で、PassthroughCameraUtils.IsPassthroughEnabled() を呼び出している部分です。
この部分は、OVRPassthroughLayerコンポーネント が有効かどうかを確認するためのものですが、OpenXR では OVRPassthroughLayer は存在しないため、コメントアウトします。
private IEnumerator InitializeWebCamTexture()
{
// Check if Passhtrough is present in the scene and is enabled
/*
var ptLayer = FindAnyObjectByType<OVRPassthroughLayer>();
if (ptLayer == null || !PassthroughCameraUtils.IsPassthroughEnabled())
{
PCD.DebugMessage(LogType.Error, "Passthrough must be enabled to use the Passthrough Camera API.");
yield break;
}
*/
#if !UNITY_6000_OR_NEWER
// There is a bug on Unity 2022 that causes a crash if you don't wait a frame before initializing the WebCamTexture.
// Waiting for one frame is important and prevents the bug.
yield return new WaitForEndOfFrame();
#endif
while (true)
{
3.4. Camera映像の確認
- シーンの設定 : 3.2. でインポートした PassthroughCamera と CameraViewer の Prefab をシーンに配置する

4. Immersal の導入
Immersal を利用するためには、Developer Portal でアカウントを作成し、APIキーを取得する必要があります。
公式ドキュメント にインストールやプロジェクト、シーンの設定方法が詳しく記載されています。
ただし、プロジェクトの設定で同様のことを行うと動作しなくなる部分があるので、必要なことを順に説明します。
4.1. Immersal SDK のインポートとプロジェクト設定
-
Package Manager : Immersal SDK を Git URL からインポート、サンプルプロジェクトをインポート

-
Project Settings : Player > Other Settings > Graphics API で Vulkan を削除

-
Project Settings : Player > Other Settings > Allow 'unsafe' code を有効化

-
Project Settings : OpenXR > Meta XR > Meta Quest Occlusior を無効化

4.2. Immersal のシーン設定
-
Immersal SDK > Login メニューからログインを行い、APIキーを取得

-
4.1. でインポートした Immersal サンプルプロジェクトの SimpleScene から ImmersalSDK とXR Space のGameObject を取得してシーンに配置

4.3. Quest 向け PlatformSupport の導入
Immersal SDK は、Meta Quest には対応していないため、Quest 向けの PlatformSupport を導入する必要があります。
参考にさせていただいた記事 で紹介している QuestSupport.cs をプロジェクトにインポートします。
- Immersal SDK Prefab の 子オブジェクトとして QuestSupportコンポーネントを配置、設定
4.4. Immersal による位置合わせの設定
- XR Space 配下の XR Map で作成したマップを指定
以上で、Meta Questの実機でImmersalによる位置合わせを試すための準備がすべて整いました。
プロジェクトをビルドして、実際に動作を確認してみましょう。
5. まとめ
本記事では、Quest の OpenXR 開発環境において、Meta XR Core SDK の力を部分的に借りることで、外部 VPS である Immersal との連携が可能になることを検証しました。
OpenXR を利用することで、Quest のカメラ機能のように、プラットフォーム固有の実装が必要な部分は存在しますが、アプリの中核部分はプラットフォーム非依存に保たれ、他のプラットフォームでもそのまま利用できる開発フローが実現できそうです。
次回以降は、現実世界との位置合わせを行うためのもう一つの手法である、ARアンカー の導入について解説します。
特に、OpenXR:Meta バージョン 2.2.0 の目玉機能である ARアンカーの共有に焦点を当て、複数のユーザーが同じ体験を共有するマルチユーザー環境の構築についても、その実装方法を検証していきます。
エンジニア絶賛募集中!
MESONではUnityエンジニアを絶賛募集中です! XR、空間コンピューティングのプロジェクトに関わってみたい! 開発したい! という方はぜひご応募ください!
MESONのメンバーページからご応募いただくか、TwitterのDMなどでご連絡ください。
書いた人

高野 剛
Unixシステムのインフラ構築・運用を経験後、ECサイトを中心としたWebアプリ開発、プロジェクトマネージメントに従事する。
ミニオン好きが高じて、USJに通い続ける中、XRアトラクションに魅了される。
自分が感動したことを他の人にも体験してもらいたいという思いから、転職を決意し、XRの学校での1年間の学びを経てMESONへ入社。
Discussion