Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般
  • ライフ

Meta Quest 3でOpenXRを試してみる

先月、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の仕様と実装状況の調査までは及びませんでした。

今後はその部分やセンサーの精度などを深掘りし、機会があればまた記事にしたいと思います。


参考



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。