鉄騎コントローラを使ってロボットを操縦して戦うOculusコンテンツを作った

去る9/14(日) Ocufes名古屋 http://ocufesnagoya.jimdo.com/ に表題の物を作って展示してきました。
このエントリは備忘録と技術要素が半々くらいです

f:id:izm_11:20140916224644p:plain

製作動機

お世話になっているフィーバー柳橋 https://ja-jp.facebook.com/fever.yanagibashi のオーナーさんが、中古で鉄騎コントローラを入手したと連絡があり、僕自身もロボット物が好きなので、鉄騎リスペクトなコンテンツを作ろうと言うのが最初の取っ掛かりです。

コンテンツ設計指針

酔わない、没入感がある。と言うのを意識して設計しました。

VR酔い対策

例えば高速で飛び回るアーマードコア系のゲームをゲームパッド+OculusRiftでプレイすると、大体酔うことが先行研究から明らかになっています。また、乗り物に乗って移動する系のコンテンツはVR酔いを起こしやすい傾向があります。
今回は「なるべくVR酔いを起こす要素を消していく」「ゲームとして成立させる」と言うのが主な設計指針です。

ゲーム展開速度

一般にVR上でプレーヤーが高速で移動する場合は、人の目から得た加速度と、体が感じている加速度(停止してる)の差が大きいと酔います。なので今回は「鈍重なロボットを操作する」というゲームに仕立てました。イメージ的には鉄騎の第一世代くらいです。

注視点の設計

Ocufesで展示するということは、普段VR-HMDを被っていない人が多く遊ぶ可能性があります。この時に全周を見渡せると言う事実で調子に乗ってグルグル首を振って遊ぶと一気に酔います。
なので今回はコクピットに座って、前の方(視野角で言うと水平70度程度)だけ外の景色が見えるようにして、横や後ろはコクピット内部を表示していました。
これによって自然にプレーヤーが前を見続けるように仕向けています。

f:id:izm_11:20140916225735p:plain

操作の複雑さ

これは棚から牡丹餅的な部分もありますが、鉄騎コントローラは両手両足を使うコントローラで、初見のプレーヤーは操作するのに精一杯になる傾向にあります。逆に言うと、それだけ操作に集中して、前方を注視しているとVR酔いが起きにくいという効果が期待できます。
また、Twitter上で仮説として教えてもらったのが、「足を使って操作すると酔いにくい」という説があります。足を動かして操作すると体が揺れて、それが見た目と体感の加速度差という違和感の解消に役立つかもしれない。とのことです。

f:id:izm_11:20140916225307j:plain

75FPSの死守

OculusRift DK2のSDK0.4.2時点では、少しでも75FPSを切ると、ジャイロセンサによる先読み遅延軽減を行った遅れ補償描画が機能しなくなります。
これは有ると無いでは大幅な差があるので、Unity上で色々と小細工をしてFPSを稼いでいます。 (大体200万ポリゴン、1000ドローコールです)

没入感

プレーヤーの描画

プレーヤーの分身としてキャラクターを一人称視点位置に描画しています。 株式会社インフィニットループ様の「あいえるたん」を使用しました。 (可愛いです!!!!デモ使用に許諾が不要でとても有難かったです。 http://www.infiniteloop.co.jp/special/iltan/3d-dl.php )   また、椅子に座ったプレーヤーの頭と両手首の位置を斜め前に設置したKinect v2でトラッキングして、このあいえるたんの動きを同期させています。 これで自分の手の動きに合わせてCGの自キャラの絵も動くので、没入感を稼げるのではないか、と思い採用しました。
Kinect v2がベストの解だったわけではなく、指の形等が取得できないので、大雑把になってしまっています。このデバイス選定については調査結果を先日のエントリでまとめています。
http://izm-11.hatenablog.com/entry/2014/08/09/172147

また、Kinect v2で取得できる細かい関節をそのまま使うのではなく、一旦頭と両手先だけを使い、時分割でフィルタを掛けて鈍らせて、Unity上でFinal IKと言うアセットを使って、IK GoalとしてKinectからの値を使っています。これによってCGモデルのポーズ破綻を防いでいます。

余談ですが鉄騎コントローラ自体もCGでコクピット内に描画しています。

座面の振動

ロボットに乗ってガションガションと歩き回るのに足元が一切揺れないと、没入感を損ないます。
なので座面をロボットの歩行に合わせて揺らしてやる事で、これに対処しました。
どちらかと言うと、「正確なフィードバックで没入感を足す」と言うより「それっぽく揺らしてやることで無振動の違和感を消す」と言う意図です。

今回は 50Wハイパワー振動ユニット ボディソニック トランスデューサ http://www.donya.jp/item/23738.html を椅子の座面裏に固定しています。
こういった振動ユニットの素晴らしい点は、ゲーム内で低音のSE(ロボットのガションガション言う音や、武器の発射音)を再生すると、ノンコーディングで勝手にブルブルと、「それっぽく」震えてくれる事です。
この製品は50Wと比較的パワーがあり、同等製品は軒並み1万円以上する中で、わずか4000円で購入出来て非常にコストパフォーマンスが高い逸品です。お勧めします。

反省

良かったこと

  • 会場では鉄騎プレイ済みのオジサマがいっぱい来てくれて、同窓会みたいになりました。
    刺さる人には刺さるコンテンツになったのではないかと思います。
  • プレイ後に汗をかいている人が多かったのは、会場の気温を別にしても没入してプレイをしてもらえたのだと思います。
  • ヒアリングした限りでは、VR酔いになっている人はいませんでした。良かったです。
  • ロボット操縦するの楽しい!!! 

(体験中に目元は分からないけど口元に笑みを浮かべてくれる人が割と居てくれたのは、やったぜ感あります)

悪かったこと

  • 会場の体験時間制限を大幅に超過するコンテンツになってしまって、スタッフさんやお客さんに迷惑を掛けました。(導入とロボットの操作説明をフルボイスで収録したらこれだけで4分ありました…)
  • 上記対策の為、操作方法を僕が口頭で説明していきなり戦闘、と言う形になってしまって、慌ただしくなってしまいました。
  • 当日、僕の体調が良くないおかげで、説明が投げやりになってしまっていた可能性があります。不快に思われた方がいたら申し訳なかったです。
  • 敵のAIがしょぼいので、もっと緊張感を与えられるようにすべきでした。
  • 制作スケジュールが完全に修羅場っぽくてかなり汚いコードになってしまって、改修が困難になっています。リファクタリングします…

OculusRift DK2(0.4.2-0.4.4)をUnity(windows)でデバッグする時に楽できるエディタ拡張を作った

概要

OculusRift DK2を使ったコンテンツをUnityで作っているとき、「拡張ディスプレイ扱いのDK2側に、今のシーンを全画面表示したい」 ことが良くあります。
そんな感じの事を行うUnityのエディタ拡張スクリプトを先人が書いていた(DK1用)ので、それをアップデートしました。
GameViewをフローティングにして、右側のRift画面に持っていって、頑張って右上の最大化ボタンをマウスで押す、と言うのが辛すぎたのが製作動機です。

個人的にはDK2をUnityで開発する上では、使うと結構楽になると思うので、お試し頂けると嬉しいです。
DK2がExtendモードで、セカンダリモニタ、右側にある前提です。

  • Unity 4.5.5pro -4.6.1
  • Windows8.1Pro(64bit)
  • OculusSDK0.4.2-0.4.4(0.4.3以上を推奨) で動作確認済


"Rift DK2 Extend Display" editor script demo YouTube

きゅーこん@自作シリコン型でチョコ作り中 (@cubic9com) | Twitter
スペシャルサンクスきゅーこんさん
再生中のEscキーによる通常モードへの復帰が追加されました!

スペシャルサンクスgtk2kさん

追記ここまで

インストール方法

neon-izm/OculusRiftDK2ExtendPreview · GitHub

Download Zipを選んで解凍して、unitypackageをインポート

pullreqや動作報告歓迎です!

使い方

  1. UnityEditor上でWindow → Rift VR Game Modeをクリック f:id:izm_11:20140813183516p:plain
  2. 通常通りUnityEditor上でPlayすると、自動的にGameViewが拡張モニタ側のDK2でほぼ全画面で表示されます。 f:id:izm_11:20140813183535p:plain
  3. RiftMode の右上の×を押すと通常の処理に戻ります。 f:id:izm_11:20140813183559p:plain

補足

GameViewの実質解像度(Rift Display Size)及びGameViewを表示する座標(Rift Display Position)は、僕の環境での決め打ちの値を入れてしまっているので、見え方がおかしい場合は調整を行ってください。

f:id:izm_11:20140813183526p:plain

OculusSDK0.4.2以前で、うまく動かなかった場合の旧バージョンはこちら

https://copy.com/3rcEmiEYlQnMNu1L

ビジョンベースのジェスチャコントロール系デバイスの使い分けメモ

概要

ユーザの腕の動きや指の動きを取得したい事はとてもよくあるシチュエーションで、それを安価に済ませるには幾つかのデバイスの選択肢があります。
それらデバイスの腕や指のトラッキングの面から見た場合の使い分けについて、個人的にメモを兼ねて書きます。
VRHMDを被ったユーザが、例えば椅子に座ってドライブシミュレータみたいなソフトウェアを体験 することを想定しています。
DepthSense DS325は実質的にIntel Creative* Interactive Gesture Camera Developer Kit( http://click.intel.com/creative-interactive-gesture-camera-developer-kit.html )が上位互換と言うかOEMなので、1個に纏めました。

Kinect v1

人に正対した数m離れた手前に設置。HMDマウントは現実的ではない(トラッキング出来ない)
2万円くらい 関連情報:各種書籍

良いところ

  • 枯れてる
  • PCスペックのハードルが低い

悪いところ

  • 指は取得できない
  • 今後の入手性が怖い

Kinect v2

人に正対した数m離れた手前に設置。HMDマウントは現実的ではない(トラッキング出来ない)
2万円くらい 三脚必須(だと思う)
関連情報: Kinect for Windows v2 Developer Preview入門 ― C++プログラマー向け連載 http://www.buildinsider.net/small/kinectv2cpp

良いところ

  • 全身の骨格推定が出来る。v1よりは高精度
  • 音声認識、顔認識も(調べてないですが)出来る

悪いところ

  • OSやハードウェアの要求が厳しい(USB3.0のチップ相性が厳しい…)
  • まだSDKがバギー
  • 体積が大きい
  • 指の骨格推定は出来ない

LeapMotion

机の上に設置。あるいは最新版のSDKではHMDマウントも対応。有効認識範囲-1mくらい。
正体はかなり広角の赤外線カメラ
1万円くらい

良いところ

  • 指の骨格推定が一番簡単に取得出来る(最新SDK
  • 腕の骨格推定も、あまり精度が良くないが取得できる
  • 安価、軽量

悪いところ

  • HMDマウントして、椅子に座る場合、机の材質等のノイズによって指の認識率が落ちる(Leapの視界に、腕以外が見えないのをSDKは想定しています)
  • 机の上に設置した場合、机の上20cm以上の高さが無いとマトモに使えない(つまり、常に手を空中に出していないと認識しない。疲れます)

Intel Creative* Interactive Gesture Camera Developer Kit

ノートPCのwebcamのように設置。有効範囲 -1mくらい。軽量。HMDマウントも可能
2万円くらい
SDKがiisuSDKとIntel PCSDKの2種類あるので個別に

Intel PCSDK

関連情報:連載:Intel Perceptual Computing(PerCSDK入門 http://www.buildinsider.net/small/perc

良いところ

悪いところ

iisu SDK

関連情報:Oculus Rift + Senz3D + iisu で VR 空間内に手を入れて遊んでみた  http://tips.hecomi.com/entry/2014/05/15/025129

良いところ

  • 腕の骨格推定は比較的高精度に取れる(Leapくらい)
  • 他のデバイスも使いまわせる

悪いところ

  • Free版では商用利用不可、6時間以上の連続稼働不可、商用版高い
  • 音声認識や顔認識は出来ない
  • SDKの関連情報が少ない

結論

これ買いましょう https://www.kickstarter.com/projects/controlvr/control-vr-motion-capture-for-vr-animation-and-mor

OculusRift DK2 memo

概要

本当に自分用のメモ。

導入

楽しく使うOculus Rift DK2
https://docs.google.com/spreadsheets/d/1PtYxl2VmlNTJIxU-yrwEXCwGhYaT7bihKGqvfL7k5oE/edit#gid=0

DisplayLink Uninstaller
http://displaylink.com/support/sla.php?fileid=121

memo

  • 一部Unity製デモは -force-d3d11 オプションで起動する必要がある
  • 体験会等のときのIPDは60mmくらいが大体の人に合う

  • DK2のレンダーターゲット解像度(FBOサイズ)は2364x1461なので、UnityAAは切って良い 野生の男さんがリサーチ http://togetter.com/li/701523

  • extend mode+Unity4.5.2の場合、プライマリモニタをDK2にする必要があり、それはDisMon とかで湾クリック切り替えを用意しておくと良い http://dualmonitortool.sourceforge.net/dismon.html

openFrameworks0.8xをWindowsで触った感想

概要

ちょっとopenFrameworks(以下oFと略す)を触る機会があったので、得られた話をメモします。
バージョンは0.7xについては本も出ているのですが、最近の0.8x系の方がバグフィックスもされてて良いと思います。

僕自身も最初にoFを始めた時 http://trick7.com/2014/02/opneframeworks_memo/
こういった先達のメモがあるおかげでとっかかりになったので、それに末筆ながら追加するつもりで書きます。

目を通すと良い資料

環境

  • openFrameworks 0.8x
  • windows 7
  • VisualStudio 2012Pro
  • C++は、Effective C++を読んで「なるほど~~」って言ってるくらいの力量

ざっくり

標準で付いてくるAdd-onはともかく、他の事をしようと思うと、色々定番があったり、メンテされてない古いのがあったり、Macでしか動作確認してなくてwindowsだとメンテしないと動かなかったり(ハイ、oFはMacユーザー多いですね) するので、VisualStudio自体の使い方を聞ける、分かる環境でないとwindowsでは辛いと思います。
後方互換性とか、移植性とか、そういうのより、動くこと、カッコイイ物が作れるのが正義、みたいな感じは(Add-onによっては)かなり感じます。

Add-on

全体的な選び方と、それぞれのオススメを書きます。

選び方

http://ofxaddons.com/
のサイトを検索して、やりたいことに合わせて探します。 複数の候補があるときは

  • examplesが充実している方
  • リポジトリを見て、活発な方(issueが多いとか)

を選びましょう。
また候補が一つでも、ソースを見てみて嫌な予感がしたら、素直に自前で実装するというのも検討した方が良いように思います(高速でシリアル通信を行う場合、oFアドオンを探すより、他のライブラリを直接使ったほうが安定したりします)

GUI

ofxUIを勧めます。おそらく一番色々出来ます。
標準で付いてくるofxGUIは、基本的なパーツしかない上に、トグルとボタンのデザインが同じで、ユーザーに分かりにくいです。

OpenCV

ofxCvを絶対追加で使いましょう。楽に書けます。ofxOpenCvだけだと、チャラく書けないです。 物体検出とかエフェクトとか、思いつきそうなネタはofxCvにexampleで入ってたりして便利です。
ただ、依存先のOpenCVバージョンが2.3.1と恐ろしく古いので注意が必要です。自前で最新版にする等も検討する必要があります。

MultiWindow

MacだとofxSyphonが強そうですが、僕としてはofxMultiGLFWWindowがオススメです。windowsでも動きます。

https://github.com/charlesveasey/ofxMultiGLFWWindow

以前( http://izm-11.hatenablog.com/entry/2014/07/23/213158 )ofxFensterと戦いましたが、最近のoF環境ではofxMultiGLFWの方が作りが良いです。うまくGLFWを使っているのでコード量も少なく、処理を追いやすいです。

Kinect

WindowsではofxKinectNuiが一番安定していて、またKinectForWindowsとの相性も良いです。 いわゆるKinectSDKでやってることをそのまま書ける感じが良いです。 https://github.com/sadmb/ofxKinectNui

日本語表示

ofxTrueTypeFontUCの、fork先のこれが一番ハマりにくいです。 ofxUIと合わせて使う時には、ofxUI側のofxTrueType依存部分をこちらを参照するようにして、GUIに日本語を追加しています。

https://github.com/iniwap/ofxTrueTypeFontUC

Shader

標準のofShaderでも十分な気がします。glslの使い方を勉強する時も、このofShader越しに触った方が楽かもしれません。

最近困っている事