見出し画像

XREAL AirをWindows PCでSteamVRのHMDとして使う




0.はじめに

0-1.目的

XREAL Air(旧NREAL Air、以下Air)をWindows PCに繋ぎ、SteamVRのHMDとして使用します(立体映像を映します)。

0-2.前提、概要、注意!

(1)前提
次の別記事で紹介している、Airをヘッドトラッキング装置として使用する方法の発展形になります。
まだそちらを読んでいない方は先に読んで理解してください。
<XREAL AirとWindows PCでゲームのヘッドトラッキングをする>

(2)概要
SteamVR向け自作HMD利用アドオン「OpenVR-OpenTrack」を利用します。

映像の表示については、OpenVR-OpenTrackが作るSBS(Side-by-Side、一つの画面の左半分と右半分で別々に映像を映す方式)3D映像をAirのSBS機能で表示して立体表現します。
首振りの入力については、(1)の記事で出力したfreetrack 2.0データをOpenVR-OpenTrackで受け取って入力とします。

(3)注意!

  • 【!】現状、この記事は参考程度に捉えてください。
    今回紹介する方法では、後述の理由により、現時点であまりVR体験として最適化ができていません。
    従ってこの記事の内容は、「ふーん、そういうことも出来るんだな」くらいのつもりで読んでください。

  • 【!】設定値について調整しきれていません
    具体的には、特に左右の映像間の距離(実質IPD、瞳孔間距離設定のようなものと思われる)について、最適な設定値やその求め方が分かっていません。
    ⇒このアドオン自体は特にAirを意識して作られたわけではなく、さまざまな自作VRHMDで広く使う目的のもので、Air向けの設定値については情報がほぼ見つからないため。
    また設定値の算出方法についても情報が見つからない上に、設定変更して反映するにはSteamVRの再起動が必要となり、設定値を変えながら探っていくのも非常に手間がかかるため。

    IPDが適切に設定できないと、VR体験自体の品質が大きく損なわれるほか、斜視の原因となる場合があると言われるなど健康上の懸念もあります。
    ご自身で設定値を探る場合は、上記のリスクを理解した上で休憩をとりながら行ってください。

    そのほかにも、映像やカメラの世界に明るい人の方がよく分かりそうな設定がいくつかあります。
    私はその方面はよく知らなくて雰囲気で設定してるので参考程度に見て下さい。

  • 【!】AirはそもそもVR向きのデバイスではありません
    一般的なVRHMDにおいては、なるべく画面を目に近づけることでより自然な視界を実現しますが、Airはむしろ少し離れた位置にモニターが浮かぶような見え方をするように作られており、距離感の調整も効きません。
    自然な見え方の視野角にすると30°~40°くらいの非常に狭い値となり、例えるなら「少し前に浮かんでいるモニター大の窓越しに世界を見ている」ような見え方になります。正直かなり視野が狭いです。

  • 【!】操作入力手段は別途考える必要があります
    多くのVRゲームは、両手に持つハンドトラッキングできるコントローラを使って遊ぶことが前提になっています。
    そして大抵のVRコントローラはVRHMDと組み合わせて(VRHMDと通信して)使うため、(回避方法はあるかもしれないが)基本的に今回の構成では使用できません。

    そのため、実質的に遊べるのは普通のゲームパッドで操作できるタイトル(乗り物操縦系とか)か、操作入力が必要ない映像コンテンツに限られます。
    またSteamVRのUIはゲームパッドではうまく操作できなかったりするので、その点でも不便です。

  • 【!】動かせるのは基本的に3DoF(というか2DoF)だけです
    まずAirのセンサーが3DoFなので、Airだけ使う場合XYZ(左右上下前後)の移動はできません。
    またツールの都合上、現状ロール(首をかしげる動き)の値が使えないため実質的には2DoFになります。

    ただし、opentrackにそれぞれ別々の入力で得たrotation値(3DoF)とposition値(XYZ)を合成できる機能があるため、Airの他にXYZが取れるトラッキング方法を用意出来れば6DoF(Airをrotationに使うなら5DoF)に対応することも一応可能です。



1.準備

1-1.前提記事の内容を実施する

0-2.(1)で示した前提記事の内容を、少なくとも「3-2-3.で[Options]-[Shortcuts]タブの設定をした状態」まで実施します。
実施したらPhoenixHeadTrackerは止めて閉じておいてください。

1-2.opentrackの設定を変更する

opentrackの動作を止め、新しい設定プロファイルを作ります。「SteamVR.ini」とか適当に命名しておきましょう。
以下の設定を変更します。

(1)[Options]の[Output]タブ
①[Yaw]の[Invert]のチェックを外す。
②[Pitch]の[Invert]にチェックを入れる。
③[OK]で閉じる。
もしVR上で実際に動かして逆だったら戻してください。

(2)[Mapping]の[Yaw]と[Pitch]タブ
①[Yaw]の[Max input]を"180°"にし、点を全て削除する。
(180°のとき180°となる、完全なリニア(直線)マッピングにする)
②[Pitch]の[Max input], [Max output]ともに"90°"にし、点を全て削除する。
(90°のとき90°の完全なリニアマッピング)
③[OK]で閉じる。
⇒VRにおいては、現実の回転角度とゲーム内の回転角度が完全に一致することが望ましいため、rotationをすべてリニアマッピングに設定します。

設定したら、opentrackも止めたままにしておいてください。

1-3.ディスプレイ設定を変更する

これ以降の手順の中で、モニターを認識しなおす操作が何度か発生します。
その都度デスクトップがチカチカして再配置されたりしますが、そういうものなので認識しておいてください。
その際ほかのウィンドウのサイズや表示が変になったりすることがあるので、なるべく関係ないソフトは閉じておいてください。

(1)
Airの複製設定を解除します。
メインモニタのアイコンを選んで、"1※にのみ表示する"を選択してください。
※あるいはメインモニタの番号
次のようにAirが独立したモニターになります。

ディスプレイ設定の画面1
3がAir。ここでは右端にいますが、実際の位置は環境によると思います。
無効化されているので小さくなっています。

この時点で、Airが"このディスプレイを切断する"の状態になっている場合は、"デスクトップをこのディスプレイに拡張する"に変更して有効化してください。

(2)
Airの位置を右端に移動します。右端であることは必須ではありませんが、この後の設定で分かりやすいので今回はそれで説明します。
また、この時点で解像度が1920x1080で認識されていることを確認してください。
別の解像度になっている場合は変更してください。変更できない場合は抜いて挿し直したりしてみてください。

ディスプレイ設定の画面2
私は元々トリプルモニターなので4枚並ぶ形になりました。

1-4.AirをSBSモードに切り替える

Airの右テンプルにある、輝度調整+ボタン(長いボタンの画面側)を2秒以上4秒未満長押しして、離します。
目安として、2秒時点で一度「ポッ」と鳴るのでそれが聞こえたら離してください。
4秒経つともう一度「ポッ」と鳴って別のモードが発動するので気をつけてください。
間違えたときは、抜いて挿し直せば状態がリセットされるので、それでやり直してください。
うまくいったらAirがSBSモードに切り替わり、次のように3840x1080の横長モニターとして認識されているはずです。

ディスプレイ設定の画面3
ちょうどFHD2枚分のサイズです。
Airを覗くと左のレンズに画面の左半分が、右のレンズに右半分が表示されています。

【注意!】
これ以降、特にSteamVR実行中、このAirの画面には何もウィンドウを持ってこないでください。
ウィンドウを移動中に一部入ってしまうのもダメです。VR画面が映らなくなったり真っ赤になったりします。
もしそうなったらSteamVRを再起動してください。



2.アドオンの導入と設定

2-1.SteamVRのインストール

まず普通にSteamVRをインストールします。
もし勝手に起動してセットアップとかが始まったら、適当に閉じて一旦SteamVRを終了してください。

2-1.アドオンのダウンロード

次のページから最新版をダウンロードします。
https://github.com/r57zone/OpenVR-OpenTrack/releases
「SteamVR.OpenTrack.FreeTrack.バージョン.zip」のファイルです。
今回は「1.1」でやりました。

「~UDP」の方はfreetrackデータではなくopentrack UDPを受信して同じことが出来るようですが、今回の構成ではAirの入力を取るPhoenixHeadTrackerと競合するので使いません。
どうしてもUDPがいいならどっちかで使うポート番号を変えれば当然使えると思います。

2-2.アドオンのインストール

先ほどダウンロードしたzipを展開します。中に「opentrack」フォルダが入っていると思います。

上記の「opentrack」フォルダを、SteamVRの「drivers」フォルダ下にコピーします。
普通にインストールすると次のパスにあるはずです。
"C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers"
次のようなディレクトリ構成になっていることを確認してください

SteamVR
└─drivers
    └─opentrackdriver.vrdrivermanifest
        │  
        ├─bin
        │  ├─win32
        │  │      driver_opentrack.dll
        │  │      
        │  └─win64driver_opentrack.dll
        │          
        └─resources
            └─settings
                    default.vrsettings

2-3.アドオンの設定

先ほどコピーした、"~\opentrack\resources\settings"フォルダにある「default.vrsettings」ファイルを編集します。
適当な場所にコピーしてバックアップを取ってから、任意のテキストエディタで開いてください。

次の内容を参考に編集してください。
重要な設定項目についてはそれぞれ下で説明しますが、私も設定値の決め方がよく分かってないものもいくつかあります。さらなる研究が待たれます。あるいは詳しい人がいたら是非教えてください。

SteamVRを実行中でもこのファイルは編集できますが、変更を反映するにはSteamVRの再起動が必要です。

{
   "opentrack" : {
      "DebugMode" : false,
      "CrouchPressKey" : "PAUSE",
      "CrouchOffset" : 0.7,
      "DistanceBetweenEyes" : 1,
      "DistortionK1" : -0.077,
      "DistortionK2" : -0.033,
      "ScreenOffsetX" : 0,
      "ZoomHeight" : 0.8,
      "ZoomWidth" : 0.8,
      "FOV" : 33,
      "displayFrequency" : 60,
      "renderHeight" : 1080,
      "renderWidth" : 1920,
      "secondsFromVsyncToPhotons" : 0.004999999888241291,
      "serialNumber" : "1001",
      "windowHeight" : 1080,
      "windowWidth" : 3840,
      "windowX" : 1920,
      "windowY" : 0
   }
}
  • CrouchPressKey
    「しゃがむ」ためのキーを設定できます。
    次のページの対応表で設定したいキーを探して、「Value」の値をコピーしてください。
    https://github.com/r57zone/DualShock4-emulator/blob/master/BINDINGS.md

  • CrouchOffset
    上記キーでしゃがんだときの高さを設定します。
    おそらく単位はmで、offsetということで「しゃがんだとき何mか」ではなく「立ってる状態から何m下にずれるか」の設定だと思います。

    立ってる状態の高さはこの後のSteamVRルームセットアップで設定しますが、例えばそこで"1.7m"に設定してこの設定値を"0.7"にしていたら、しゃがんだとき1.0mの高さになる……んだと思いますが、私は使ってないのでよく知りません。

  • DistanceBetweenEyes(超重要!)
    0-2.(3)でも触れた、左右の映像間の距離を設定します。
    大きい値ほど近くなるそうです。
    が、値の単位とかも分からず、どうやって適正値を求めるのか分かりません。
    私が値を変えながら弄ってみた感じ、"1"付近かなあという感じになりましたが、まだ何か変な気がします。
    いい設定値が見つかった方はぜひ教えてください。

  • DistortionK1, K2
    映像の”歪み”を設定します。
    カメラとか映像の世界では歪曲収差というみたいです。
    K1とK2の違いは、すみませんがその方面に明るくなくて分かりません。
    横と縦とか?知ってる人がいたら是非教えてください。

    正の値で外側に広がるような感じ(たる型?)に、
    負の値で内側にしぼむような感じ(糸巻き型?)になります。

    ちゃんと適正値の算出方法があるのかもしれませんが、私は知らないので上記例は見ながら雰囲気で決めました。変だなと思ったら弄ってみて下さい。
    あと、求め方を知っている人がいたら是非教えてください。

  • ZoomHeight, ZoomWidth
    映像のスケーリングが設定できるそうですが、とりあえず初期値"0.8"のままにしてます。
    解像度のスケーリングじゃなくてその名の通りズーム倍率のように見えます。

  • FOV(重要)
    視野角を設定します。
    Airは画面が少し離れて見えるので、自然な距離感にしようとするとかなり狭めの値になると思います。
    何となく33°にしてますが、40°にしてるという人も見たのでそれくらいでもいいかもしれません。

  • displayFrequency
    画面のリフレッシュレートを設定します。Airのリフレッシュレートに合わせてください。
    Airは普通のモードなら120Hzまで対応してますが、SBSモードだと60Hzしか選べないように見えます。

  • renderHeight, renderWidth(重要)
    3D映像の片目あたりの描画解像度を設定します。
    Airだと片目が1920x1080になるのでそれと同じで良いと思いますが、もう少し大きくして左右で重なる部分ができるようにするのもアリな気がします。
    VR畑でノウハウがある人は是非教えて下さい。

  • windowHeight, windowWidth(重要)
    左右両方合わせた画面の解像度を設定します。
    Airだと3840x1080です。

  • windowX, windowY(超重要)
    VR画面を描画するモニターの位置を設定します。
    今回はAirの画面の位置を指定するわけですが、これは各位の環境によって違うので注意してください。

    「プライマリディスプレイの左上の座標を"0, 0"としたとき、Airの画面の左上の座標はどこか」を考えます。

    例:
    1-3.(2)でAirを一番右に置いたと思います。
    あなたが普段1920x1080のモニター1枚を使っていて、その真右にAirを置いたのなら、設定値は"X=1920, Y=0"となります。
    もし真右でなく真上に置いたなら、"X=0, Y=-1080"となります。
    私の場合は普段FHDのトリプルモニターを使っていて、さらにその右に置いたので、Airの位置(設定値)はFHDを2枚挟んで"X=3840, Y=0"となります。

    この値を変更した際は、SteamVRを2回再起動しないと反映されないときがあります。
    理由は不明です。

以上、設定できたら保存してファイルを閉じます。



3.SteamVRの設定

3-1.SteamVRを起動する

(1)
opentrackを起動し、PhoenixHeadTrackerはデータ送信してない状態でopentrackを[Start]します。位置リセットキーを押してトラッキングデータをデフォルト位置に戻しておいてください。
(最初ルームセットアップをするのに、HMDが基準点にありかつ動かない状態が望ましいため)

(2)
SteamVRを起動します。
次のように「ダイレクトディスプレイモード」に切り替えるよう言われますが、無視してください。
左下に「H」のアイコンでHMDが認識されていることを確認してください。

SteamVRの画面1
ダイレクトディスプレイモードの警告は毎回出ちゃいます。

出てこない場合、
SteamVRの 設定>スタートアップ/シャットダウン > アドオンの管理
でopentrackが認識されていること、オンになっていることを確認してください。

SteamVRの画面2
この画面は関係ないアドオンも入ってますが気にしないでください。

また、設定 > 一般 からSteamVRホームをオフにしておくのがオススメです。

3-2.ルームセットアップをする

opentackが送っているデータが中央にリセットしてあり、動かないことを確認します。
ルームセットアップを開始し、次のように進めてください。
「立位」→「次へ」→「中央を測定」「次へ」→「170cm」「床をキャリブレーション」「次へ」→「終了」

終わったら一応SteamVRを再起動してください。

これでもうVRの画面が見えるはずです。
何も映らない場合、2-3.の「windowX, windowY」の設定などを見直してください。

また、1-4.で触れたように、Airのデスクトップに何かウィンドウを持っていくと画面が赤くなって何も見えなくなってしまいます。
こうなったらSteamVRを再起動してください。
海外情報で「Airの画面にマウスを持って行ってSteamVR display windowをクリックしろ」みたいな情報を見ますが、私にはどういう意味か分からなかったので再起動が無難だと思います。

PhoenixHeadTrackerをオンにして、Airの動きに合わせてVR内の視界も動くことを確認してください。



4.実際に遊ぶ

好きなゲームで遊んでみて下さい。
見え方が変だったら2-3.を参考に設定を変えてみてください。

VRコントローラーが無い場合、VR内のメニューを操作するのも大変だと思います。
その場合は普通にデスクトップのSteamから目的のゲームを選んで起動しようとすると、「VRで起動する」みたいなオプションが選べると思うのでそれで起動すると楽だと思います。



5.あとがき

AirでVRは、試みとしては興味深いのですが、やはりAir自体がVR向けに作られていないため、VR体験自体の品質としてはイマイチかなという感じです。

とはいえVRよりもいくらか手軽な点は魅力ではあるのかなーと思いつつも、最近はもうVR自体の導入ハードルも黎明期よりだいぶ下がってきた気がするので、やはりちゃんとしたVRデバイスで体験するのがいいよなーとも思う次第です。

遊ぶなら、やはり乗り物系みたいにあまり首以外が動かないタイトルか、あるいはVRChatみたいにVR以外も含めたいろんな構成を受け入れているタイトルの方が、操作とかの自由も効いて向いてるのかなと思いました。

また、私の知識不足によるところもあり、表示設定などがまだ最適化できていない感もあります。
その辺りは、勘所がある方ならすぐ分かったりするかもしれませんから、ノウハウ共有してくださるととても嬉しいです。
何よりほかの方の助けにもなると思います。みんなで集合知をつくりましょう!