VRとプラットフォームのあれこれ

自鯖のDiscordでたまたまこういう話題になったので、知見共有も兼ねて記事化しています。
素人意見なので、鵜呑みにしないでください。VR技術者じゃないので。

#PCVRのインターフェース
##趣味ならOpenVR使っとけばとりあえずなんとかなるよ、うん
現状、VR機材のインターフェースは割とバラバラである。
PCVRについて大雑把に言えば、

+ Steam VR対応HMDならOpenVR直結
+ そうでないならSteam VRが互換性機能を提供してるのでまあOpenVRが使えばなんとかなる(Oculus, Windows MR)

という印象。

もともと、PCVRのSDKは、OculusとOpenVRの2強だが、
OpenVRはSteam系、Oculus系、Windows MR系に全部対応しているのに対し、
Oculus SDKはOculusにしか対応していなかった。

ので、OpenVRとOculus両方対応するか、あるいは1つでだいたい全部使えるOpenVRを使うのが一般的。
とはいえ、OculusのHMDの性能をフルに引き出せるのはOculus SDKだし(性能低いPCでも快適にプレイできる)、
Oculusのストアに出すにはOculus SDKを使わないといけない(確か)しで、
本腰入れたゲームでは両対応、ツール系ではOpenVRでお茶を濁すことが多かった。

最近、Oculus SDKがOpenVRに対応したりなんだりしているので更にややこしい。

あれ？Windows MRは？というと、確かUWPからじゃないとアクセスできない独自仕様。
だけど、公式にSteamVRにブリッジする機能がある関係上OpenVRで開発されることが多い感じがある。
UWP開発といえば、HoloLensと同じ感じを目指しているのだろうという感じがある。
ビジネス向けで、低スペックPCでも動くというWinodws MRの利点はおそらくUWP開発時に生きるが、
自由度と対応の楽さはOpenVRの圧勝という印象。

##モバイルは？
これまた乱立している。
基本的にモバイルSoCの性能を出すためにどれもかしこもAndroidがベースなのだが、

+ Google Daydream
+ Oculus SDK 
+ HTC VIVE Wave SDK

のように同じAndroidなのにまたプラットフォームがいろいろある。
さらにスマホに画面ハメるのだと、Google VR APIだけでも行けるし。

GearVRやOculus GoなどOculus系はDaydreamとはまた別のAndroid上でVRを提供する仕組みを持ってる。
どうやらHTC VIVE WaveもDaydreamとは別物らしい。
なお、中国圏では400種以上のスタンドアロンHMDが存在しているらしく、VIVE Waveはそれを統合する目的らしい。
また、VIVE Wave SDKはOpenVRにも対応してるのでPC、スタンドアロン両対応しやすいのだろう。
OculusのSDKも同じく、PCのOculusとスタンドアロンに両方対応していた気がする。

一方、OpenVRはPCのみ、Google Daydreamはスタンドアロンのみとなる。

##結局どれ使えばいいの
実情として、

+ Oculusランタイムは基本Oculus(と一部の提携HMD)しか使えない
+ OpenVRはドライバ仕様が公開されてるのでやろうと思えばどれにも対応できる。

ので、なにはともあれとりあえずPCVRでなにかしたいならOpenVR一強。
...かと思いきや、Oculusストアは無視できないのでそこに登録するにはOculusランタイムに対応しないといけない。

Android系は謎。
とりあえずOculusが一番普及しそうなので、モバイル向けはOculusへの対応を優先でいいと思う。

#OpenXR
それで、このバラバラ、ユーザー困惑をどうにかしようということでやってるのがOpenXR規格である。
入出力レイヤーを抽象化して、アプリケーション側はランタイムを気にせず1つのAPIを叩くだけで標準的なVR機能が使えるようになるというもの。
その上、ランタイムを気にせず汎用的なHMDを開発することもできるようになる(こちらはオプション要素だがOpenVRがサポートしそう)。

嫌われがちなSteamVR Unity Pluginの2.X系、「わかりにくくなった」と嫌われているあの入力インターフェース仕様は、
OpenXRの一環と思われる。そのくらい基本的な理念が似ている。

Windows MRもOpen XRランタイムの試作版みたいなのを出してたはず。
Oculusも参加してるんだけど、今後どうなるのかは不明。

VR/ARの標準規格目指す「OpenXR」導入始まる - Mogura VR News
https://www.moguravr.com/openxr-siggraph-2018/

まさに現状はこの記事の線だらけの図の通り
ここにさらにVive focusやOculus Questが入る感じ？Switch VRも？

まあカオスですわな。

##抽象化あれこれ
実際VRで必要なのは、大雑把に言えば

+ 各入力の姿勢を取ること、ボタン等を取ること、振動等を出力すること(デバイス関連)
+ HMDに適切に二眼映像と音声を出力すること

でしかない。
こんくらい抽象化できんだろ感はあるし、実際OpenXRはそれを進めている。
とはいえこれはWindowsでいえば、ウィンドウを表示できることと、マウスキーボードが使えることレベルでの抽象化でしかない。

ので、さらに上位のUIを作るみたいなところも抽象化したくなってきますね。
結局Unityみたいなプラットフォームが挟まり、主にそこで抽象化されているのが今。

しかしながらベンダーにロックインはしたくないし、他のより優秀な仕組みやデバイスを期待するなら、
デバイスレベルでも抽象化は進めていかないといけないということで進んでいる。

#入力の抽象化
あのよくわからないと評判の入力システムは、ようは、

+ アプリケーションは「欲しい入力の情報」をランタイムに提示する
+ ドライバは、コントローラからの入力を抽象化してランタイムに渡す
+ ランタイムは、その2つの関係をユーザーに割り当てるように要求する

という構造をしている。

この仕組みにより、VRソフトが出た後に新しいコントローラが出てもユーザーが割り当てることで対応させることができる。
VRソフト側も、将来的な拡張に備えて細分化して定義しておき、現状のコントローラに対してはとりあえず大雑把に割り当てておく、
というようなことができるようになっている。
で、あらかじめよく知られているコントローラに対しては、アプリケーションが「既定の関係」を同梱しておくことができる。
SteamVR Pluginの初回実行時にあの何個もできるデフォルトバインディングのjsonはそれ。

例えば、

+ 頭への振動
+ 手への振動
+ 胸への振動
+ 足への振動
+ 空間の振動

を作っておき、現状よく知られるコントローラへはとりあえず **全部コントローラの振動** に割り当てて置く。

OpenXR対応の振動ベストを買ったり、あるいはなんらかの新世代の振動システムが出てきたら、
ユーザーはそれをゲーム側の修正を待つこと無く割り当て直すことができる。

また、ボタンに対してはより柔軟に「必須」「推奨」「オプション」が定義できて、
必須のボタンは割り当てしないと起動しないが、それ以外は割り当てなくても良いようになっている。

これはつまり、Oculus Goみたいなシンプルなコントローラは必須項目だけで操作でき、
新世代のボタンめっちゃあるコントローラが生まれたら、オプションも含めて細かく割り当てられるようになる。

言ってしまえばゲームパッドのキーコンフィグをVRでもできるようになるというわけだ。

なお、「新しいコントローラでたらユーザーがいちいち割り当てんの？」に関して、
Steamは「他のユーザーはこんな割り当てしてます」で対処してる様子。

VRChatでフルトラになると「トラッカーの情報割当たってないので割り当ててください」画面に遷移するのはこのためである。

んで、そしたらゲーム内でのコントローラのチュートリアルどうするねんとなるわけですが
最近のSteamVRのアップデートで対応機能出ましたね。

コントローラのボタンとゲーム内の操作の対応表をVR空間にランタイム側が出してくれる機能が追加されています。
Steam VR Homeでダッシュボード開くと出てくるので見てみるとわかります。

これと同等の情報をゲーム内から取得する機能もあるし、ランタイムの表示機能を呼び出す機能もある。
ただこれらはOpenXRというよりSteamVRの機能であり、将来的にどう普及するのかは別の話。

まだ、入力インターフェースの抽象化しか行われてないので、将来的にどうなるんだろうなぁという気持ちもある。

このあたり詳しくはこちらの記事もご参照ください。

Steam VR Input System(OpenVR Action Input)についてのメモ
https://qiita.com/gpsnmeajp/items/e423c699dde7aecb25cc

#プラットフォーム競争
今の所プラットフォームを作ろうとしてるのは

+ Oculus (元祖)
+ Steam VR (元祖)
+ Google Daydream
+ HTC VIVE Wave
+ Web VR(Mozilla)
+ その他もろもろ中国圏？

PCVRは、OculusとSteamの2強の印象が強い。
ちょうどiOSとAndroidの関係に似ている

WebVRはスマホで動かすLinux(Androidでない)感。分かる人はこの表現でわかってくれそう。

一番すごいというか差を吸収してるのはUnityかもしれない。Unreal Engineもあるけど大変そう。

なお、Oculusも独占かと思いきや、提携結べば対応HMD作れるみたいなんですよね。名前は見かけたことがある。
ただ普及した話を聞かない。

まああとは、Oculusはプラットフォームとしての整備やVRへの技術投資と公開がはっきりしてる感じがある一方、
Steam VRはゲーム環境としての部品を作るのに専念してる感じがある。そこも方向性の違いだなぁと
リップシンクとか、統一アバターとか、VRChatのあの会話しやすい空間的音響もOculusのSDK。

そしてHTC君はどこへ行く。
どうやらHTCはValveに見切りをつけたのか、独自のプラットフォームを作ろうとしている感じがある。
技術開発も進めている様子で、最近はハンドトラッキングなど精力的にSDKを出している。
VIVE Cosmosあたりでは独自プラットフォームを展開していく模様。

あ、もともとONSPってVisiSonics社の技術なんですね
https://qiita.com/yanosen_jp/items/03de6ad02a05493f343b

#雑感
HTCは、Valveが切り込まないスタンドアロンにプラットフォーム作ってOculusに対抗しようぜ感がある。
Valveはスタンドアロン行かないだろうなぁ。ゲーム体験的にはPCVRは超えられないし。
現状スマホアプリに参入していないのと同じかなという印象。