えむにわリソース

ITのスキマ的なあれこれを書きます。

【SteamVR】HMD無しでOpenVRを初期化しようとして無理だった話

SteamVRなんもわからん…

SteamVR 1.x の時代は、コントローラーの情報を無理やり取得できたのですが、
SteamVR 2.x になってからはHMD必須になったようです。
普通の人はここで NullDriver を設定して問題を回避します。

なんとかHMD無しでSteamVR.Input単体で動かせないか検証しました。

何故こんな不毛な検証をするのか

VRアプリ以外で、高性能コントローラーとしてVRコントローラーを使いたい
その際に余計なリソースを持ちたくない

環境要件

  • Unity 2018.4.13f1
  • SteamVR Unity Plugin 2.5.0

[SteamVR の設定] HMD無しでエラーにしない方法

Steamのインストールディレクトを探して、あなたのVR設定を発掘します

例えば、 D:\Steam\config\steamvr.vrsettings など、Steamインストールしたディレクトリの config を探してみましょう。

見つけたら "steamvr" のエントリを編集して、以下のように書き換えましょう。項目が存在するなら更新、無いなら追加です。

{
~略~
   "steamvr" : {
      "activateMultipleDrivers" : true,
      "requireHmd" : false,
~略~
   },
~略~
}

SteamVR を終了し、HMDを外す。場合によっては再起動する必要があります。

f:id:m2wasabi:20191219122824p:plain

後で分かりますが、この状態は負けフラグです。

地獄の検証結果

(HMDが)あるとき

全てが正常に動きます。

f:id:m2wasabi:20191219122844p:plain

何もしない

  • openvr_api.dll が読めない(手動設置するしかない)
  • 手動で OpenVR.Init() しても OpenVR.Input が取得できない

Package missing for Virtual Reality SDK OpenVR. Please add the OpenVR (Desktop) package using the Package Manager Window. Will attempt to enable None instead.

そりゃそうだ。

UnityProjectSettings > Player > Virtual Reality Supported

  • openvr_api.dll が読めるようになる (Version 1.0.5)
  • アプリケーション初期化時に OpenVR.Init() が走る
  • Virtual Reality Supported の子の設定項目を読み込む
  • よくわからないけど SteamVR がうまいことやってくれる

SUCCESS!!

PackageManager > OpenVR (Desktop)

  • openvr_api.dll が読めるようになる (Version 1.0.5)
  • アプリケーション初期化時に OpenVR.Init() は勝手には走らない (手動で初期化またはシーン中に SteamVR_Behaviour があれば走る)
  • 好きなように OpenVR を使うことができる

SUCCESS!!

(HMDが)ないとき

地獄です。

f:id:m2wasabi:20191219122924p:plain

何もしない

  • openvr_api.dll が読めない(手動設置するしかない)
  • 手動で OpenVR.Init() しても OpenVR.Input が取得できない

UnityProjectSettings > Player > Virtual Reality Supported

  • openvr_api.dll が読めるようになる (Version 1.0.5)
  • アプリケーション初期化時に OpenVR.Init() が走る
  • Virtual Reality Supported の子の設定項目を読み込む
  • OpenVR.Init() 実行時に HMDが無ければ落ちる
    XR: OpenVR Error! OpenVR failed initialization with error code VRInitError_Init_HmdNotFound: "Hmd Not Found (108)"!

PackageManager > OpenVR (Desktop)

  • openvr_api.dll が読めるようになる (Version 1.0.5)
  • アプリケーション初期化時に OpenVR.Init() は勝手には走らない (手動で初期化またはシーン中に SteamVR_Behaviour があれば走る)
  • OpenVR.Init() 実行時に HMDが無ければ落ちる
    XR: OpenVR Error! OpenVR failed initialization with error code VRInitError_Init_HmdNotFound: "Hmd Not Found (108)"!

悪あがきで初期化時の設定を変えたり無理やりクラスを引っ張り出そうとすると、ぬるぽやUnityEditor落ちと闘う羽目になります。。。

OpenVRのソース読む

ピュア初期化のためのイースターエッグを求めて、 OpenVRのリポジトリを見るも…

github.com

https://github.com/ValveSoftware/openvr/blob/master/src/ivrclientcore.h

初期化処理を追いかけると、最終的にヘッダからlib読みに行くところで試合終了です。
libのソースは無い。

結論

OpenVRで VRコンを使うときに、HMDは「存在しなければいけない」
NullDriverに頼らざるを得ないことが証明された。

余計なリソースを持ちたくないー (2回目)

Appendix:NullDriverの導入方法

Steamのインストールディレクトを探して、あなたのVR設定を発掘します

例えば、 D:\Steam\config\steamvr.vrsettings など、Steamインストールしたディレクトリの config を探してみましょう。

"steamvr" のエントリの並びに、 "driver_null" を追加しましょう。1項目追加するだけです。
"forcedDriver" の設定は不要です。NullDriverを強制しなくてもHMDが無ければ最低優先度でNullDriverが読み込まれます。

{
~略~
   "steamvr" : {
~略~
   },
   "driver_null" : {
      "enable" : true
   },
~略~
}

f:id:m2wasabi:20191219123016p:plain

参考資料

懐かしのまとめ記事で、全ての始まり shop-0761.hatenablog.com