まっつん◆SW1/SWF8io が再起動するようです

ブログを使って日々勉強するよ!

OculusでPS3コントローラのSIXAXISと振動機能を使う方法

この記事はOculus Rift Advent Calendar 2014の2日目です。

■1日目の記事その1

野生の男さん「Oculus Rift x LEAP Motion x JOBA x Wiiリモコンでドラゴンに乗ってみた

■1日目の記事その2:

@hiroyuki_honさん「ニート・無職のためのOculus Riftを用いて就職する方法

■今日のもう1つの記事:

@dvorakさん「Oculus Rift DK2初期不良と接続の戦記 - 銀の弾丸、はじめました

※その他の記事へはカレンダーのリンクからどうぞ。Oculusはさすがに旬の技術だけあってAdvent Calendarが2本立ってます、すげー。

 

こんにちは、OculusRift界隈で遊び回っている まっつん◆SW1/SWF8io(@n_mattun)です。直近では先月末のOculusGameJamにて友人の@faultierと「どうやら軍人らしい人が何らかの力により手から焔を出して全てを燃やし尽くす」ゲームを作ったりもしました。

 

さて、今回はそっちではなく別の拙作品、OculusRiftを駆使したロケットベルト体験ゲーム『飛べると!』*1で、PS3コントローラをどうやって設定をしたのかという部分を、ゲームのコンセプトも交えて具体的に解説していきます。ゲームの全体像をザっと確認したい方は、先に紹介動画をご覧ください。

 

PS3コントローラにたどりついた経緯 

今回自分で定めたコンセプトは「空を自由に飛びまわる」でした。

最初はアヌビスが超高速で飛ぶときに二の腕に仕込んでる(?)加速装置から出力を得て飛ぶようなイメージで、wiiリモコンプラス二刀流で翼を広げるような腕の動きと、手首のひねりで行きたい方向に進むというモノを考えたのですが、その操作方法だとアヌビスのような『鳥のように体を前に傾ける操作』をする必然性がないので、ちょっと体験ゲームとしての面白みに欠けます。

 

そこで発想を「ユーザーの体を強制的に傾かせるにはどうすればいいか?」という逆からのアプローチにして、

 

ユーザーの体を強制的に傾かせるにはどうすればいいか?

 ↓

体の傾きを操作方法に取り入れればいい

 ↓

じゃあモーションセンサーを物理的に背負わせてしまえばいい

 ↓

モーションセンサーを背負っても納得できるモチーフは何だろう?

 ↓

ロケットベルトだ!

 

という思考順序でゲームデザインの基本方針が決定しました。アヌビスどこいったw

またここには「ユーザ自身が意識的に行きたい方向に体を動かして、そっちにVR上の画面もついてくる」という操作系の方がVR酔いがしにくいのではという読みも含んでいます、「運転者は助手席や後部差席に比べて車酔いしにくい理論」に沿う形ですね。

 

続いて、wiiリモコンを背中に背負わせるというアプローチで調査も進めていたのですが、どうもPCやUnityでのwiiリモコンの制御方法に様々な方法論があり、またそれらの技術ブログを見る限りなんだか苦戦の匂いが漂っていたので、他の取得方法はないだろうか・・と思っていたところ、PS3コントローラに誰も見向きもしなかったSIXAXISというモーションセンサーがあったことを思い出しました。用途も前後と左右の傾きを取得する想定っぽかったので、かなりいいソリューションでした。

 

PCでPS3コントローラ(SIXAXIS)を使えるドライバ探し

 

※注 ここから下の説明はすべてWindows7上(+Unity 4.5.5 C#環境)での導入実績になります

Win8はなんとかなるかもしれないけど、Macは無理じゃないかなぁ・・・)

 

続いてはSIXAXISも検知してくれるPS3コントローラのドライバ探しです。

ググってみるといちばん使われているのは「MotionJoy」というソフトで、ひとまずOculus+Unity側での実装は抜きでPC上でテストしてみるとBluetooth接続もサポートし、振動機能もサポートしてて、SIXAXISの傾き検知も対応している風でした。しかし

  • MotionJoyの画面UIが使いにくい
  • 他のBT接続機器との相性がよろしくない
  • アンインストールしてもBTドライバを差すとソフトが復活する(!)

というやたら怪しい挙動をするソフトだったので、別のソフトは無いものかと探しまくった*2ところ、これらのMotionJoyの謎挙動にキレた人が作ったらしい『Better DS3』というソフトにたどり着きました。

 

■Better DS3

http://betterds3.ciebiera.net/

※注:ソフト単体だけでは動いてくれないので、以下の解説動画からDLLも合わせて入手しましょう。

解説動画(Youtubeリンク先にBetter DS3内で使うDllファイル単体のダウンロードリンク付き)

 

 このソフトならUIもとても見やすく、Bluetooth、振動、SIXAXIS、キーコンフィグとすべて問題なく動いてくれました。

 

ゲームパッドの入力形式は実は2通りある

コントローラ周りの情報を探しているうちに、実はゲームパッドの入力形式には『DirectInput形式』と『XInput形式』の2つの入力方法が存在することを知りました。

 

DirectInput形式は、一般的なUSB接続のゲームパッド等で使われている入力形式で、Unity のメニュー[Edit]-[Project Settings]-[Input]のインスペクタパネルから、入力ボタンと機能のマッピングができます。

 

Xinput形式は、XBOXコントローラの入力に特化した形式で、Microsoftが提供する公式のドライバを導入することによって利用可能になります。Unity・・というよりもOculusでは、OVR/Scripts/Util内OVRGamepadController.csでこの入力を常時監視していて(SDKバージョン0.4.3.1の場合)、XBOXコントローラの入力が使えるPCの場合、OVRPlayerController.csの後半あたりでこのクラス経由で各キーの入力情報を見て、操作を割り当てています。

 

振動も使いたい

せっかくロケットベルトにあたるものを物理的に背負ってもらっているので、

「背中にエンジンの『振動』が伝わる」

という機能も提供したい所です。正直この機能に関しては調べてる最中に面倒くさくなってやめようかなーという気になったのですが、PS3コントローラを入れたカメラバッグを背負って振動だけのテストをしてみたところものすごいロケットベルト感があったので「これは絶対に導入すべき!」と気が変わり、がんばって調べ込みました。

 

振動機能自体はメジャーな技術なのでどうにかしてる人はいるだろうと探し回っていたのですが、少なくともPS3コントローラの振動機能をUnity上でそのまま使っている情報にはたどり着けませんでした。その代わり、XBOXコントローラ(XInput形式)を使った振動機能のライブラリ「XInputDotNet」を見つけました。

 


speps/XInputDotNet · GitHub

 

それと前述の通り、XInput形式の入力を受け取るにはドライバも必要になるので、合わせて以下のMicrosoft公式サイトからダウンロード+インストール。


ソフトウェアのダウンロード:Xbox 360 Controller for Windows

 

あとはPS3コントローラがXInput形式の入出力を受け取れば良くて、幸いにもBetter DS3はDirectInput形式、Xinput形式の入力切り替え機能までもサポートしていたので、これで全て整いました。

 

本題の「SIXAXISと振動を使う」の手順まとめ

  1. PCにBetter DS3をインストールする
  2. Better DS3の解説動画を見て、Better DS3内で使うDLLファイルを入れる
  3. PCにXInput入力形式のドライバを入れる
  4. Better DS3上の入出力形式でXInputを選択し、SIXAXISの入力を他のキーにマッピングする
  5. XInputDotNetPureを使い、XInput形式としてBetter DS3経由でPS3コントローラに入力信号を伝え、振動させる。

 

f:id:n_mattun:20141202055002j:plain

こちらは現バージョンの『飛べると!』でのBetter DS3上のキーマッピングSIXAXISを右スティックの入力に割り当てて、他はブランクというなんとも漢らしい設定w ソフトを外に公開する際には普通にコントローラを持った形もサポートさせるために、もっと普通のキーマッピングにする予定です。

 

PS3コントローラ以外で取得した、最後の1軸

SIXAXISで取得できるのは「体の前後の傾き」と「体の左右の傾き」の合計2軸までしか取得できません。せっかく体の操作で2軸までコントロールしているので、「体の左右の回転」となるY軸もなんとかモーション的な操作方法で取得できないか・・・と思案した結果、こうなりました。

 

 

 

最終的に、手元で操作する本来のゲームコントローラは「wiiのヌンチャク*3のボタン1コだけ(ジェット噴射)」というものすごいエコな操作方法になりましたw

 

これなら将来的にゲームを拡張しよう!となった場合もキー割り当てに苦労しません。それこそ地球防衛軍4のウィングダイバーみたいに「飛び回りながら武器を切り替えて攻撃する」という操作も簡単にできるだろうし、なんならフェンサーの二刀流も組み合わせて、従来のFPSでは実現不可能だった『照準を二箇所にして左右別々に乱射しまくる』ということもやろうと思えば実現できるでしょう。

 

っていうかそこまでいくと自分で作るよりもオフィシャルで作って欲しいので、D3パブリッシャー地球防衛軍4.1をProject Morpheusにフル対応してこの願いを叶えてください。もしやってくれたらPS4+モーフィアス+Move二刀流ですげぇ高くつくけど全部まとめて買うから!!斬撃のレギンレイヴの次回作もやりたいけどその次まで我慢するからさぁ!

 

明日(12/03)は、@blkcatmanさんの「Unityから全球画像をつくるしくみ」と、@soyliquidさんの「OculusRift対応メタバース的なものをつくるかも」の予定です。

 

*1:正式名称決めました。仮名の「Flying Booster 2」も10年前に作ったFlashゲームの続編というタイトルの位置付けという愛着があるので、英語圏でリリースする時はこっちを引き続き使うかもw

*2:参考にしまくった記事

新生FF14 PlayStaion Move ナビゲーションコントローラーでプレイ XInput wrapper for ds3 編 - cartesiaの日記

Xbox360 コントローラーや DUALSHOCK 3 を PC で使うために非公式ドライバやツール、設定に関するネット情報を集めてみました 【 awgs Foundry 】

*3:ヌンチャクの接続はこれを使いました