先月、Meta Quest 3を購入しました。
参考: Meta Quest 3: 複合現実を体験できる新しいVRヘッドセット - 購入する | Meta Store
せっかくなので、Meta Quest Developer Center OpenXRモバイルSDKを参考に開発環境を整えて、ネイティブXRのサンプルアプリ起動させてみたいと思います。
環境
- M2 Macbook Air (macOS 14.1)
- Android Studio (2023.1.1)
 
 - Meta Quest 3
 
Meta Quest 3 開発者モードの設定
こちらにあるように、開発者モードを有効にするには、開発用のMetaアカウントとそのアカウントが所属する組織をMeta Quest 団体マネージャに登録する必要があります。
組織登録後、Meta Quest 3を装着し、開発者アカウントでログインすることで開発者モードへの切り替えが可能になります。
この状態でUSB-CケーブルでPCと接続すると、確認ダイヤログの後、他のAndroid端末と同様に実機デバッグが起動できます。
※ちなみに、私はバッテリー付きのストラップを使っているのですが、ストラップ側の差し込み口ではPCの認識は出来ませんでした。本体の方に接続しないといけないようです。
Android SDK, NDKの設定
まずは、Meta Quest Developer Center の Android開発ソフトウェアの設定通りに進めます。
Apple Silicon対応
Apple Silicon Macの場合、インストールするNDKのバージョン次第では、ERROR: Unknown host CPU architecture: arm64 のエラーが発生するため、NDKのインストールディレクトリ直下に存在する「ndk-build」ファイルを以下のように修正します。
DIR="$(cd "$(dirname "$0")" && pwd)"
-$DIR/build/ndk-build "$@"
+arch -x86_64 /bin/bash $DIR/build/ndk-build "$@"
OpenXRモバイルSDKのダウンロード
Oculus OpenXR Mobile SDKのページから、開発に必要な一連のファイルをダウンロードし、任意のディレクトリ(以下 OPEN_XR_SDK )に解凍します。(執筆時点のバージョンは60.0)
パスに空白文字 が含まれると、NDKまわりのビルドでエラーとなるため、問題ない場所で配置します。
Gradleの設定
設定ファイルに指定されたGradleのバージョンが古く、そのままでは動作しないため、いくつか修正を行います。
gradle-wrapper.properties
「OPEN_XR_SDK/gradle/wrapper/gradle-wrapper.properties」を以下のように修正します。
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
※ 7.2以降のバージョンの場合、現時点では別のエラーが発生するので、ここで紹介されている7.0.2を使用しています。
gradleディレクトリを各サンプルディレクトリにコピー
OpenXRモバイルSDKに同梱されているサンプルには「gradle-wrapper.properties」が含まれておらず、ビルド時にエラーとなるため、「OPEN_XR_SDK/gradle」ディレクトリを各サンプルのプロジェクトディレクトリ(例:「OPEN_XR_SDK/XrSamples/XrPassthroughOcclusion/Projects/Android」)にコピーします。
※サンプルプロジェクトは「OPEN_XR_SDK/XrSamples」配下にあります。
build.gradleの更新
「OPEN_XR_SDK/build.gradle」のバージョンも上記に合わせます。
buildscript {
  repositories {
    google()
    jcenter()
  }
  dependencies {
-    classpath 'com.android.tools.build:gradle:4.0.0'
+    classpath 'com.android.tools.build:gradle:7.0.2'
  }
}
ビルドの実行
AndroidStudioで、サンプルプロジェクト(OPEN_XR_SDK/XrSamples/【サンプル名】/Projects/Android/build.gradle)を開きます。
以下のようなエラーが発生している場合は、Gradleに対するJDKのバージョンが合っていないので、JDKの方 を合わせます。( Settings > Build, Exclution, Deployment > Build Tools > Gradle > GradleJDK の項目で指定可能です。 今回は JDK16 を設定しました)
Unsupported Java. 
Your build is currently configured to use Java 17.0.7 and Gradle 7.0.2.
Possible solution:
 - Upgrade Gradle wrapper to 7.2 version and re-import the project
※Android Studioのオススメ通り、 Gradleを上げてしまうと、現状ビルドが通らなくなるので注意が必要です。
同期終了後、Meta Quest 3を接続していれば、「devices」に 「Oculus Quest3」と出てくるので、この状態でデバッグボタンを押下すれば、サンプルアプリを実機上で動作させることが出来ます。
サンプルの種類について
いくつか、サンプルアプリを紹介します。
いずれも 「 OPEN_XR_SDK/XrSamples/【サンプル名】/Src/main.cpp 」に凡その処理が記述されており、処理の内容をカスタマイズする際は、こちらを修正します。
XrBodyFaceEyeSocial
アイトラッキングとボディ(上半身)トラッキングのサンプルです。
正直、アイトラッキング(特に、視線の動き)は実感出来ませんでしたが、上半身は(不安定ではあるものの)指の動きまで認識出来てました。
XrPassthroughOcclusion
パススルー(現実世界の描画)と遮蔽物認識のサンプルです。
自分から見た、現実世界における遮蔽物の裏(床平面の下に移動した部分)はきちんと隠れているようです。
MRアプリを作る上で避けて通れない処理ですが、サンプルアプリのコードは他のサンプルよりも複雑になっていました。
XrVirtualKeyboard
バーチャルキーボードを利用したサンプルです。
今後力を入れていくものと思われますが、バーチャルキーボードAPIは認識が不正確で、現時点では全く使い物になりませんでした。
その他
詳しく見てないですが、他にも以下のようなサンプルが含まれています。
- XrAppBase
 - XrBodyTrackingFB
 - XrColorSpaceFB
 - XrCompositor_NativeActivity
 - XrControllers
 - XrEyeTrackingSocialFB
 - XrFaceTrackingFB
 - XrHandDataSource
 - XrHandsAndControllers
 - XrHandsFB
 - XrInput
 - XrKeyboard
 - XrPassthrough
 - XrSceneModel
 - XrSpaceWarp
 - XrSpatialAnchor
 
最後に
自分のPCがUnrealによるXR開発に対応していなかったのと、諸所の理由からUnityの利用も気が進まなかったことをモチベーションに変えて、ネイティブのOpenXR SDKを使ってみようとしたのですが、
サンプルアプリの実行に思ったより手間取ってしまい、OpenXR APIの仕様と実装状況の調査までは及びませんでした。
今後はその部分やセンサーの精度などを深掘りし、機会があればまた記事にしたいと思います。
参考
- Oculus開発者センター
 - android studio - Unable to build any of the projects of Oculus OpenXR Mobile SDK and Oculus Mobile SDK - Stack Overflow
 
      