メインコンテンツまでスキップ
バージョン: 1.0.4

(参考)Magic Leap 2からMiRZAへのアプリケーション移植

WARNING

本情報は2026年4月付の調査レポートです。 Magic Leap 2向けのアプリケーションをMiRZAに移植する方法をご案内いたします。 ※本情報は参考としていただき、開発・実装についての責任は負いかねます。

1. 概要

本資料はMagic Leap 2向けアプリからMiRZAへの移植について調査した結果をまとめたものです。 各アプリの移行可能性については以下の通りです。

  • CGを表示するだけのアプリ:移行可能
  • ML2特有機能を利用したアプリ:一部移行可能(後述)
  • MRTK3を利用したアプリ:MiRZAに機能があり実現可能なものは移行可能

2. MLSDKについて

Magic Leapの開発にはMLSDKを利用しています。本調査ではMLSDK2を対象とします。

MLSDKの歴史

  • 0.24.0系 (Unity 2020.3)
    • 初代ML1向け。ARFoundationは使わない独自システム
  • 1.x系 (Unity 2022.2+)
    • 初版リリースは2022年10月
    • 最終リリースは2023年8月
    • このバージョンからML2向け。ARFoundationのXR Pluginとして実装
  • 2.x系 (2.4.0からUnity 2022.3+対象)
    • 初版リリースは2024年1月
    • このバージョンからOpenXR Pluginとして実装されている
    • GitHubで公開されている2.5.0は2024年10月リリース
MLSDK 1.x系MLSDK 2.x系
MLSDK 1.x系MLSDK 2.x系

3. 調査環境

本調査の実行環境を示します。 なお、ML2の手持ちコントローラを使った操作は、Headwornのスマホコントローラで代用しました。

  • Unity 2022.3.62f2
  • MLSDK 2.6.0 (2024.12.14にリリースされた最新版)
  • Spaces SDK 1.0.4 (2026.4.7現在最新版)
  • GitHubで公開されているサンプル (2.5.0)

4. 機能別移植評価

サンプルアプリ2.5.0の各機能について、MiRZAへの移植可否を調査した結果を以下に示します。 評価記号は以下の通りです。

  • ◎: ほぼそのまま移植可能
  • 〇: 小規模修正で移植可能(数時間程度)
  • △: 一部のみ移植可能
  • ×: 移植不可
サンプル名内容標準/MLSDK独自移行可能?標準/Spaces独自備考
HelloCube赤いCubeを表示するだけ。uGUIのCanvasで構築されたシーン切替用UIあり標準標準UIはXRInteractionToolkitで構築されているため移行可能。実際に動作確認実施。
Controlコントローラの状態表示(位置・ボタン状態など)独自 MagicLeapController×n/a対応するコントローラがMiRZAにはない。
EyeTracking視線トラッキング独自 MagicLeapEyeTrackerFeature×n/a
FacialExpression表情トラッキング独自 MagicLeapFacialExpressionFeature×n/aML2の表情トラッキングは現状、目のみ(口は非対応)。
GlobalDimmerディミング(グラスを暗くする)独自 MagicLeapRenderingExtensionsFeature×n/a
Hands両手の認識位置にモデル表示、ピンチジェスチャ検出、ピンチした位置にCubeを生成標準 InputSystem / Hand Interaction Profile / XR Hands標準 InputSystem / Hand Interaction Profile / XR HandsInputActionAssetsの差し替えで移行可能。ただしスマホコントローラとの同居は不可。実際に動作確認実施。
MarkerTrackingマーカートラッキング(QR, Aruco, April, EAN13, UPCA, CODE128)独自 MagicLeapMarkerUnderstandingFeature独自 SpacesQrCodeManagerSpaces SDKはQRコード認識のみ対応。
Meshing空間構造の認識とメッシュ化一部独自 ARMeshManager / MagicLeapMeshingFeature標準 ARMeshManagerMagicLeapMeshingFeature経由のAPIは未対応(メッシュ品質設定など)。実際に動作確認実施。
OcclusionCGが手・コントローラ・空間構造に隠れる表現独自 MagicLeapPhysicalOcclusionFeature×n/aMiRZAでは透明メッシュ表示により空間構造のOcclusionを表現できる可能性あり。
PixelSensors各種カメラ画像のキャプチャ(RGB、SLAM、Depth、EyeTracking)独自 MagicLeapPixelSensorFeature標準 ARCameraManagerMiRZAではRGBカメラのみキャプチャ可能。
Planes平面検出一部独自 ARPlaneManager / MagicLeapPlanesFeature標準 ARPlaneManagerMagicLeapPlanesFeature経由の情報取得は未対応。PlaneClassificationは動作しない。実際に動作確認実施。
SegmentedDimmer部分的なディミング(CGの背景を部分的に暗くすることでCGを見やすくする)独自 MagicLeapRenderingExtensionsFeature×n/a
SpatialAnchorsローカルアンカーとLocalizationMapのサンプル独自 MagicLeapSpatialAnchorsFeature / MagicLeapLocalizationMapFeature標準 ARAnchorManagerローカルアンカーのみ可能。LocalizationMapは不可。MiRZAにはSpaceの概念(SLAMマップをOSに保存する機能)がない。

5. 移行手順

公式ドキュメントに従って作ったシンプルなML2向けプロジェクトをSpaces SDKで動くようにした手順を示します。

5.1. 動作確認した移行手順

動作確認済みの手順は以下の通りです。

  • ML2用Unityプロジェクトを開く
    • Assets、Packages、ProjectSettingsディレクトリのみ存在する状態でUnityプロジェクトを開く
    • Libraryディレクトリなどの一時ファイル保存に利用するディレクトリは、Unityプロジェクトを開く前にすべて削除しておく
  • MLSDK関連のライブラリ・ファイル・Prefabの削除
    • Package Managerからプロジェクト内にimportされているMagicLeap SDK、Magic Leap Setup Toolsを削除する
      • InputSystemの切替時(再起動時)にスクリプトエラーが出るので、Ignoreを押してそのまま進める
    • Assets/Samples/Magic Leap SDKディレクトリを削除
      • MLSDKを削除することによって出るスクリプトエラーを消すのが目的
    • シーン中のML Rigを削除。一時的にシーン内にMain Cameraがない状態にしておく
    • MLSDKが導入するカスタムAndroidManifest.xmlを削除する ← ポイント
      • Project Settings→Publishing Settings→Custom Main Manifestのチェックを外す
      • Assets/Plugins/ディレクトリを削除
  • Spaces SDKの導入
    • Package Managerからcom.qualcomm.snapdragon.spaces-1.0.4.tgzを導入する
      • InputSystemの切替でUnityエディタの再起動がかかる
    • Spaces SDKのConfiguration ToolでHeadwornアプリのセットアップを進める
      • 今回はコントローラは使わないので、セットアップ後、シーン内のXR Rig以下にあるLeft Controller、Right Controllerを削除しておく
    • Project Settings→XR Plug-in Management→Project Validationでfix allする

5.2. スマホコントローラへの置き換え手順

ML2コントローラをスマホコントローラへ置き換える際の追加手順は以下の通りです。

  • ML2のコントローラを含むML Rigを削除
  • Configuration Toolsを一通り実行して、Spaces SDKのXR Origin(XR Rig)をシーンに追加
  • Camera Offsetを0mに設定
  • XR Origin→Camera Offset以下のLeft、Right Controllerを削除して、Spaces Simple Interactionプレハブを配置
    • Headwornアプリでのスマホコントローラ機能を提供するプレハブ
    • Assets/Samples/Snapdragon Spaces/1.0.4/Core Samples/Shared Assets/Prefabs/Interaction/Spaces Simple Interaction.prefab
  • Spaces Simple Interactionの中にあるHost Controller PointerにSorting GroupコンポーネントをAddして、Order in Layerを5に設定
    • これを設定するとUIとレイの描画順序が正しくなる

Sorting Groupコンポーネントの設定

Sorting Groupコンポーネントの設定

6. 注意事項

MLSDKとSpaces SDKの同居は不可であり、MLSDKの削除は必須です。

  • UnityプロジェクトからMLSDKを抜かないと、x86-64の.soファイルが混じる
  • 同居させると、MLSDKのProject Validationの影響でコンパイルできなくなる

また、OpenXRのHands Interaction Profileを入れると、スマホコントローラ(Spaces Simple Interaction)が動かなくなる事象を確認しています。

Hands Interaction Profile有効時はスマホコントローラが動作しない

Hands Interaction Profile有効時はスマホコントローラが動作しない

7. MRTK3を利用したアプリの移植

MRTK3を利用したアプリの移植については、以下のセクションで具体的な移行手順を示します。

  • MiRZAに機能があり実現可能なものは移行可能
  • MLSDKを直接利用しているアプリと比較すると、移行は比較的容易

また、以下の制約事項が確認されているため、移行検討時にはこれらを前提条件として設計方針を定めることを推奨します。

  • ハンドトラッキングとスマホコントローラは同居できない(左手コントローラがスマホコントローラと干渉する)
  • DRFでUnityプロジェクトを作ると、スマホコントローラのデバイス(Windows MR Controller OpenXR)が値を出力しない

8. ML2向けMRTK3プロジェクトのSpaces SDK移行手順

MRTK3を利用して作成されたMagic Leap 2向けUnityプロジェクトをMiRZAで実行できるように設定する手順を示します。

今回まとめた手順は、Magic Leap社が公開している以下のMRTK3サンプルをSpaces SDK向けに設定することを想定しています。

8.1. 作業用Unityプロジェクトの準備

はじめに、以下のURLからML2向けMRTK3サンプルのzipファイルをダウンロードします。

zipファイルは、できるだけパスが短くなる場所で展開します。 (Unityプロジェクトを開いたときに、パスが長すぎて問題が発生するpackageを含んでいるのが理由です)

MRTK3サンプルには、UnityProjects/MRTKDevTemplate/ にテンプレートのUnityプロジェクトが同梱されています。このUnityプロジェクトを同じディレクトリにコピーして作業用Unityプロジェクトとします。

  • 今回は、UnityProjects/MRTKDevTemplate/ を UnityProjects/MRTKML2Spaces/ にコピーしています
  • Unityプロジェクトのディレクトリの位置は変更しないでください。変更するとPackages/manifest.jsonで参照しているMRTK3関連パッケージのパスが合わなくなりエラーが発生します

8.2. Unityプロジェクト共通設定

作業用Unityプロジェクトを開きます。

Package Managerを開いて、tgzパッケージとしてSpaces SDK関連の以下パッケージをUnityプロジェクトへ追加します。

  • com.qualcomm.snapdragon.spaces-1.0.4.tgz
  • com.qualcomm.qcht.unity.interactions-4.1.14.tgz

現在Unityプロジェクト内に導入されているパッケージ一覧から、MLSDK関連の以下パッケージを削除します。

  • Magic Leap MRTK3(これを先に削除しないとMLSDKが削除できない)
  • Magic Leap Soundfield Audio
  • Magic Leap SDK (MLSDK)
  • Microsoft Spatializer
  • Mixed Reality OpenXR Plug-in
  • Magic Leap XR Plug-in
  • Google ARCore XR Plugin

Project Settings→MRTK3を開き、次の項目を有効に設定します。

  • AccessibilitySubsystem
  • MRTK Hands Aggregator Subsystem
  • Subsystem for Unity XRHands API
  • Subsystem for Hand Synthesis
  • その他の項目は無効に設定してください。

MRTK3の設定画面

MRTK3の設定画面

MRTK3設定のProfileがmissingの場合は、Assign MRTK Defaultボタンを押してデフォルト設定を割り当ててから設定を行ってください。

Profileがmissingのときの設定

Profileがmissingのときの設定

8.3. Spaces SDK Configuration ToolとMiRZA Configuration Toolを使ったUnityプロジェクト設定

まず、作業用Unityプロジェクトを開いた状態で、空のシーンを開きます。

  • UnityエディタのメニューFile→New Scene から実施
  • 空のシーンはConfiguration Toolを使った設定をパスするために使うだけなので、作成するシーンの種類はどれでも構いません

Spaces SDKのConfiguration Toolsを使ってDRFをセットアップする手順を一通り実行します。

Package Managerを開き、MiRZA Configuration Toolsを導入します。

  • com.nttqonoq.devices.android.mirza.configuration-tool-1.0.4.tgz

MiRZA Configuration Toolsを使用して、以下の項目を設定します。

  • Step 1-1にある「Change to 1.15.0-pre.1」ボタンを押して、OpenXR Pluginのバージョンを1.15.0-pre.1に修正
  • Step 1-2にある「Import TextMesh Pro Essential Resources」ボタンを押して、TextMesh Proを使用するためのアセットをUnityプロジェクトへ導入
  • Step 1-2にある「Set Android Minimum API Level to 33」ボタンを押して、AndroidのMinimum API Levelを33に設定

Project Settings→Playerを開き、Other SettingsにあるAndroidのTarget API Levelを35に設定します。

  • この設定は、Android 16以降の端末にapkをインストールする際に必要な設定です
  • Android 16では、API Level 35未満で作成されたapkをadb installしようとすると、OSから警告ダイアログが表示され、apkのインストールが阻止されます

Project Settings→XR Plug-in Management→OpenXRを開き、Enabled Interaction Profilesに以下の項目を追加してください。

  • Microsoft Mixed Reality Motion Controller Profile
  • Hand Interaction Profile
  • Oculus Touch Controller Profile

OpenXRのInteraction Profiles設定

OpenXRのInteraction Profiles設定

Project Settings→XR Plug-in Management→OpenXRのFeature Groupで次の設定を有効にしてください。

  • Hand Tracking
  • Hand Tracking Mesh FB
  • Hand Tracking Mesh MSFT
  • Hand Tracking Subsystem

OpenXRのFeature Group設定画面

OpenXRのFeature Group設定画面

8.4. シーン設定

MRTK3を使用したシーンの場合、基本的にシーンに用意されているGameObjectをそのまま使用することができます。

まず、Assets/Scenes/HandInteractionExamples.unityを開きます。

  • Configuration Toolで使用した空のシーンは、以後使用しないため削除して構いません

次に、MiRZA Configuration Toolsを使用して、以下の項目を設定します。

  • Step 2-1にある「Setup XR Core Modules」ボタンを押して、動作に必要なコンポーネントを導入
  • Step 2-2にある「Add Snapdragon Spaces Modules」ボタンを押して、DRFの動作に必要なコンポーネントをシーンへ導入

MRTK XR Rig→Camera OffsetにattachされているXR Originを次のように設定します。

  • Tracking Origin Mode : Device
  • Camera Y Offset : 1.6
  • ※これを設定しないと、Main Cameraのスタート位置が地面から0mになってしまい、見上げないとコンテンツが見えなくなってしまいます

8.5. 可能な操作

ここまでの設定で、MiRZAでできる操作は次の通りです。

  • ハンドトラッキング
    • 近くの操作、遠くの操作共に可能
  • ハンドコントローラ
    • MiRZAのスマホコントローラやスマホ画面の表示は、今回は未設定
  • 音声入力
    • MiRZAの場合、音声認識は非対応
    • そのためGaze+音声入力による操作はできない
  • 視線Gaze操作
    • MiRZAには視線トラッキング機能がないので、視線Gazeはできない
  • ヘッドGaze操作
    • 頭の正面向きによるGaze操作は可能
    • ただし、注視による選択操作はデフォルト無効。今回のUnityプロジェクト設定では設定していない

9. スマホコントローラを使ったMRTK3プロジェクトのSpaces SDK移行手順

本セクションでは、HeadwornのスマホコントローラをMRTK3で使用するための手順をまとめています。

前セクション(セクション8)との主な違いは以下の通りです。

  • UnityプロジェクトをHeadwornでセットアップする
  • QCHTは使用しない
  • OpenXRのInteraction ProfilesはMicrosoft Mixed Reality Motion Controller Profileだけ設定する
  • MRTK XR Rig→Camera Offset以下にあるMRTK RightHand Controller、MRTK LeftHand Controllerを無効にする
  • Device Pointerプレハブをシーンルートに配置する

スマホコントローラ操作とハンドトラッキング操作を同時に有効にすると干渉するため、このセットアップ手順ではハンドトラッキング操作は無効にしています。

9.1. 作業用Unityプロジェクトの準備

セクション8.1と同様の手順でML2向けMRTK3サンプルのzipファイルをダウンロードし展開します。

UnityProjects/MRTKDevTemplate/ を UnityProjects/MRTKHeadworn/ にコピーして作業用Unityプロジェクトとします。

9.2. Unityプロジェクト共通設定

作業用Unityプロジェクトを開きます。

Package Managerを開いて、tgzパッケージとしてSpaces SDK関連の以下パッケージをUnityプロジェクトへ追加します。

  • com.qualcomm.snapdragon.spaces-1.0.4.tgz
  • ※今回は、QCHTは使用しません

現在Unityプロジェクト内に導入されているパッケージ一覧から、MLSDK関連の以下パッケージを削除します(セクション8.2と同様)。

  • Magic Leap MRTK3
  • Magic Leap Soundfield Audio
  • Magic Leap SDK (MLSDK)
  • Microsoft Spatializer
  • Mixed Reality OpenXR Plug-in
  • Magic Leap XR Plug-in
  • Google ARCore XR Plugin

Project Settings→MRTK3を開き、次の項目を有効に設定します。

  • AccessibilitySubsystem
  • MRTK Hands Aggregator Subsystem
  • Subsystem for Unity XRHands API
  • Subsystem for Hand Synthesis
  • その他の項目は無効に設定してください。

MRTK3の設定画面

MRTK3の設定画面

MRTK3設定のProfileがmissingの場合は、Assign MRTK Defaultボタンを押してデフォルト設定を割り当ててから設定を行ってください。

Profileがmissingのときの設定

Profileがmissingのときの設定

9.3. Spaces SDK Configuration Toolを使ったUnityプロジェクト設定

まず、作業用Unityプロジェクトを開いた状態で、空のシーンを開きます。

  • UnityエディタのメニューFile→New Scene から実施

Spaces SDKのConfiguration Toolsを使ってHeadwornをセットアップする手順を一通り実行します。

Spaces SDKのConfiguration Toolsを使ったHeadwornのセットアップの4of5で登場するImport Snapdragon Spaces Samplesでは、必ずImport Core Samplesボタンを押してSpaces SDKのCoreサンプルを導入してください。

今回のセットアップ手順では、Coreサンプルに同梱されているPrefabを使用するため、必ずCoreサンプルを導入してください。

Import Core Samples画面

Import Core Samples画面

Project Settings→XR Plug-in Management→OpenXRを開き、Enabled Interaction ProfilesにMicrosoft Mixed Reality Motion Controller Profileだけを追加してください。

  • ※【注意】Hand Interaction Profileは入れないでください。入れるとスマホコントローラが動作しなくなります

OpenXRのInteraction Profiles設定画面

OpenXRのInteraction Profiles設定画面

9.4. シーン設定

MRTK3を使用したシーンの場合、基本的にシーンに用意されているGameObjectをそのまま使用することができます。

まず、Assets/Scenes/HandInteractionExamples.unityを開きます。

MRTK XR Rig→Camera OffsetにattachされているXR Originを次のように設定します。

  • Tracking Origin Mode : Device
  • Camera Y Offset : 1.6
  • ※これを設定しないと、Main Cameraのスタート位置が地面から0mになってしまい、見上げないとコンテンツが見えなくなってしまいます

XR Originの設定画面

XR Originの設定画面

スマホコントローラとハンドコントローラが干渉するため、今回の設定ではハンドコントローラを無効に設定します。

MRTK XR Rig→Camera Offset以下に配置されているMRTK RightHand Controller、MRTK LeftHand ControllerのGameObjectを無効に設定します(SetActive(false)の状態)。

ハンドコントローラ無効化の設定画面

ハンドコントローラ無効化の設定画面

スマホコントローラを有効にするため、Assets/Samples/Snapdragon Spaces/1.0.4/Core Samples/Shared Assets/Prefabs/Interaction/ にあるDevice Pointerプレハブをシーンルートに配置します。

Device Pointer

Device Pointer