XREAL Air 2 Ultra × Unity 6 で 平面検知(Plane Detection)を実装する
はじめに
AR体験において、現実の床やテーブルの上にオブジェクトを配置するために欠かせないのが「Plane Detection(平面検知)」です。
今回は XREAL Air 2 Ultra のセンサーを用いて、周囲の水平面や垂直面をリアルタイムにスキャンし、可視化する手順をまとめます。
動作確認環境
- Unity: 6000.0.70f1
- XREAL SDK: 3.1.0
- AR Foundation: 6.0.6
-
- XR Interaction Toolkit: 3.0.10
- Device: XREAL Air 2 Ultra + Beam Pro
1. 機能概要
周囲の環境をスキャンし、検知された平面をメッシュとして表示することで、空間認識の状況をフィードバックします。
| 機能 | 内容 |
|---|---|
| Plane Detection | 水平面(床・机)および垂直面(壁)をリアルタイムで検知します |
| Plane Visualization | 検知された平面を半透明のメッシュとして可視化します |
2. シーン構築の手順
事前準備
-
Package Manager の設定:
-
AR Foundationを Unity Registry からインストールします。 -
XR Interaction Toolkitをインストールし、Samples タブからStarter Assetsをインポートします。
-
-
XR Origin の配置:
-
Assets/Samples/XR Interaction Toolkit/3.0.1/Starter Assets/Prefabs/XR Origin (XR Rig).prefabを Hierarchy に配置します。
-
-
AR Session の追加:
- Hierarchy で右クリックし、
XR > AR Sessionを追加して AR のライフサイクルを管理します。
- Hierarchy で右クリックし、
-
プラグインの有効化:
-
Edit > Project Settings > XR Plug-in Managementで XREAL XR plug-in を有効にします。
-
平面検知の設定
-
XR Originオブジェクトを選択し、AR Plane Managerをアタッチします -
AR Plane Managerの Plane Prefab スロットに、可視化用のプレハブ(例:AR Feathered Plane)をセットします -
XR Originに、検知を制御するためのスクリプト(Assets/_Project/Scripts/PlaneDetection.cs)をアタッチします
3. スクリプトの実装
検知された平面の情報を取得するためのスクリプトです。
PlaneDetection.cs
このスクリプトを XR Origin にアタッチして使用します。
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class PlaneDetection : MonoBehaviour
{
private ARPlaneManager arPlaneManager;
void Start()
{
// 同一オブジェクト内の ARPlaneManager を取得
arPlaneManager = GetComponent<ARPlaneManager>();
}
void Update()
{
// 検知されているすべての平面をループで確認
foreach (ARPlane plane in arPlaneManager.trackables)
{
// 検知した平面のIDをログに出力
Debug.Log($"Detected plane: {plane.trackableId}");
}
}
}
4. ビルドとデプロイ
-
Build Settings: Platform を Android に変更し、
Build and Runを実行します - 接続: Beam Pro を PC に接続してインストールします
- 起動: インストール後、PC から Beam Pro を抜き、XREAL Air 2 Ultra を接続します
- アプリ起動: Beam Pro 内の MyGlasses アプリから作成したアプリを起動し、権限(他のアプリの上に表示)を許可します
4. 実際に使ってみた感想
周囲を見渡すと、検知された平面に合わせて半透明のメッシュが出現します。実際に運用してみた率直な所感は以下の通りです。
精度と形状の再現性
平面の検知自体はスムーズに行われますが、精度に関しては改善の余地があると感じました。
検知されたメッシュが現実のテーブルより一回り大きくなってしまったり、実際の形状とは少し異なる形で生成されたりすることがあります。広い空間であればまた結果が異なるかもしれませんが、現時点では「おおよその位置」を把握する用途がメインになりそうです。
床の検知について
今回の検証では、机や壁などのオブジェクトは認識されましたが、床の検知が難しい場面がありました。センサーの認識範囲や環境の明るさ、床のテクスチャ(模様の有無)にも左右される部分かもしれません。
センサーの限界と工夫
やはりデバイスのセンサーによる平面認識には限界を感じる部分もあります。
カチッとした正確な配置を求めるよりも、検知された平面をガイドとして使いつつ、ユーザーが微調整できるようなUIを組み合わせるのが、今のSDK(3.1.0)でのベストな開発スタイルかもしれません。
