先月、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