iPhoneからOSC送信されたジャイロ情報でCoDの視線(照準)を動かします。ちょっと回り道したものの、意外にあっさりできました。
はじめにWin32のSendInput関数によるマウス制御を試してみました。OSCで受信したiPhoneの傾きをマウス移動量に変換してSendInputに与えます。実行してみると、Windowsデスクトップ上ではちゃんとマウスカーソルが動きました。が、CoDは反応してくれません。
CoDはおそらくゲーム用のAPIで入力を処理しており、そこへはSendInputは作用しないのでしょう。このように、用いられる入力APIはゲーム/アプリケーションによってまちまちです。ケースを問わず対応するには、どのAPIよりも下位の(よりハードウェアに使い)レベルへうまいこと入力情報を与えてPCを騙してやらなければなりません。しかしそのようなソフトの開発には特殊な知識が要り、一から始めるのは面倒くさい。
そこでいっそのこと、それらよりさらに下位のレベル、PCの外からUSB入力信号を生成して送ることを考えます。つまり、マウスそのもの(として振る舞うデバイス)を作る。調べてみると、『Arduino Leonardo』が単体でUSB入力デバイスとして機能することがわかりました。Arduinoなら簡単に扱え、いざとなってもググればなんとかなる安心感があります。OSCを受信するためのイーサネットシールドと併せて購入しました。
Arduinoをプログラム。今回もやっぱりほとんどコピペです。イーサネットシールドからのOSC受信には『ArdOSC』を使い、そのサンプルソースをコピペ(ただし現バージョンのArduinoIDEではエラーが出て、ライブラリソース中の明示的な名前空間指定を省く必要があった)。PCへのマウス情報送出は標準ライブラリのMouse.move関数で。肝心のiPhone姿勢→マウス座標変換は、ジャイロのヨーとロールをXY軸に置き換えただけ。適当な係数を掛けて速さを調整します。
調整といえば、iPhoneを傾ける勢いが角度に影響しないよう、PC側ではマウスの加速度設定をオフにします。わかりにくい項目名ですが、マウスのプロパティの「ポインターの精度を高める」がそれ。メーカー固有のマウスドライバも独自の加速機能を備えていることがあります。
で、下図の通り接続して、完成。
FPSはふつう、視線方向のロールはできないし、ピッチは真下から真上まで(でんぐり返しできない)、ヨーも場面によって限定されたりするので、iPhoneの傾き=顔の向きが常に正しくゲーム内の視線に反映されるとは限らず、ときどき修正が必要です。しかしそれでも、一人称視点のゲームをHMDでプレイするのはとても臨場感があり新鮮な体験でした。もっとも、リッチなHMD用FPSはPC+Oculus RiftやPS4+Morpheusで間違いなく登場するでしょうし、ライトなものならスマホ(ハコスコ)+Bluetoothコントローラとかで実現できるので、どっちつかずの仕組みをわざわざ作る意味があるかといえば微妙ですが…。
ところで、NVIDIA 3D VISIONにはサイドバイサイド表示モードはないんでしょうか? それがあれば二眼レンズにも対応(魚眼歪みは別として)できるのに。と思ったのですが、試してみたところGameStreamと3D VISIONとはそもそも両立しないようです。少なくともアナグリフで立体視できるかと期待しましたが、残念。