e.blog

主にUnity/UE周りのことについてまとめていきます

Oculus Questのビデオパススルーを試す

概要

Oculus QuestでビデオパススルーAPIが公開され、開発者でも利用できるようになったので試してみました。いくつか設定で(2021/08/13時点では)いくつかハマりポイントがあるのでメモしておこうと思います。これらについては@gtk2kさんと@korinVRさんのツイートを参考にさせていただきました。

実際にビルドして画面をキャプチャしてみたのが以下のツイート。



Passthroughを有効化する

ドキュメントには以下のように記載があります。

※ 本記事の最後に書かれているサンプルシーンは設定済みになっているので、ここはあくまで既存プロジェクトを変更する際に必要になる処理です。

Implement Passthrough

Oculus Integration SDK for Unity contains the necessary APIs and settings to implement passthrough.

Prerequisites

  • Download the latest Oculus Integration SDK from the Unity Asset Store or from the Oculus Integration SDK Archive page.
  • Make sure the Oculus headset is using v31 or higher version. You can check this from Quick Settings > Settings > About and checking the Version number setting.
  • Since Passthrough API is an experimental feature, put your device in Experimental Mode by using the following command: adb shell setprop debug.oculus.experimentalEnabled 1. This step needs to be executed after each reboot. Without this setting, passthrough will not show up in your app.

Enable Passthrough

An app needs to opt in to use passthrough. This is needed both for build-time steps (additions to the Android manifest) and to initialize system resources at runtime.

  • From the Hierarchy tab, select OVRCameraRig to open the OVR Manager settings in the Inspector tab.
  • Under the Experimental section, select Experimental Features Enabled and Passthrough Capability Enabled. These two options enable the build-time components for using passthrough.
  • Under Insight Passthrough, select Enable Passthrough. This initializes passthrough during app startup. To initialize passthrough later, leave the checkbox unchecked and enable OVRManager::isInsightPassthroughEnabled from a script.
  • Add an OVRPassthroughLayer script component to OVRCameraRig.
  • The Projection Surface setting determines whether the passthrough rendering uses an automatic environment depth reconstruction or a user-defined surface.
  • The controls in the Compositing section work the same as in OVRPassthroughLayer: depending on the Placement setting, passthrough will be composited as an overlay or as an underlay. If multiple layers are present including OVRPassthroughLayers, use the Composition Depth setting to define the ordering between the layers.
  • Add multiple instances of OVRPassthroughLayer to your scene, each with its own configuration. A maximum of three instances can be active at any given time.

Player Settingを適切に設定する

Color SpaceをLinearに

Player Setting > Other Settings > Rendering > Color SpaceLinear に変更します。

ArchitecturesをARM64に

Player Setting > Other Settings > Configuration > Target ArchitecturesARM64 に変更します。

Scripting BackendをIL2CPPに

Player Setting > Other Settings > Configuration > Scripting BackendIL2CPP に変更します。

experimentalな設定を有効化する

adb コマンドを利用して以下のフラグをオンにする必要があるようです。

$ adb shell setprop debug.oculus.experimentalEnabled 1

なお、ドキュメントに

This step needs to be executed after each reboot.

と書かれているように、リブートごとに実行する必要がある点に注意が必要です。

AndroidManifest.xmlに設定を追記する

ビデオパススルーを有効化するために、AndroidManifest.xmlに以下の2点を追加します。

<uses-feature android:name="com.oculus.experimental.enabled" android:required="true" />
<uses-feature android:name="com.oculus.feature.PASSTHROUGH" android:required="true" />

実際に自分がビルドした設定は以下です。これを Assets/Plugins/Android/AndroidManifest.xml として保存します。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-feature android:name="com.oculus.experimental.enabled" android:required="true" />
    <uses-feature android:name="com.oculus.feature.PASSTHROUGH" android:required="true" />

    <application>
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:theme="@style/UnityThemeSelector">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>

Show Splash Screenをオンにする

どうも、この設定をオフにしているとパススルーAPIの初期化に失敗するよう。

Oculus Integrationをv31にupgrade

Oculus QuestのOSバージョンが31以上か確認

ビデオパススルーを利用するにはOSバージョンが31以上である必要があるので、使用しているQuestのOSがバージョンアップされているか確認します。

Passthroughシーンをビルド

Oculus Integrationが最新になっていれば、以下の場所にパススルー用のシーンが含まれているのでこれをビルドします。

これをビルドして実行すると、冒頭の動画のようなシーンを見ることができます。(もし初期化失敗している場合は3Dオブジェクトのみが見え、真っ暗な空間になってしまいます)