Unity+Oculus Rift+ArduinoでVRちゃぶ台返しを作った

2014年12月17日

ゆーじさんからバトンタッチされました。Oculus Rift Advent Calendar 2014 17日目の記事です。

さて、突然ですが、ちゃぶ台返し、ありますよね?

(ノ`Д)ノ彡┻━┻∴

これです。みんな知ってると思います。

でも、実際にちゃぶ台返しをやったことのある人はほとんどいないと思います。普通に考えて危ないし、やったところで後片付けが大変です。なんか、ちゃぶ台返し世界大会というのがあるそうなんですが、まあ一部の例外です。

というわけで、Oculus RiftとArduinoでいくらでも好きなだけちゃぶ台返しができる「VRちゃぶ台返し」をでっちあげました。こんな感じです。

(2015年5月追記)ニコニコ超会議2015での展示光景です。

ねとらぼで取り上げていただきました。

以下、メイキングのようなものをざっと書き残したいと思います。

制作の経緯

作った動機としては、何かVRアトラクションっぽいものを一つ作りたいと思ったことになります。

前回、前々回のOcuFesでシューティングゲームを作って展示したんですが(「Oculus Rift用シューティングの制作・展示メモ」)、VRゲームとしてはともかく、Oculus Rift体験会で展示するにはちょっと微妙な感じでした。

手妻師さんの「VRソフトのプロデュース」というスライドで、VR体験ソフトの6つの評価軸が提示されています。各評価軸についてはスライドの26ページ目以降に説明がありますが、VR空間に完全没入して、しかもゲームコントローラで遊ぶようなものだと、6番目の「体験光景の魅力」が低いんですね。遊ぶ人が現実世界と切り離されてしまうというか。

さらに、自分は基本的にソフトウェアしかできない人間なので、Oculus Rift単体でやって行きたいと思ってたんですが、OcuFesの展示だとみんな相当な割合で変な自作デバイスを持ち込んでます。楽しそうだし、実際楽しいです。なんだか悔しいので、自分もそういうのをひとつ作りたいなと考えてたら、ちゃぶ台返しというわりと簡単そうなネタが下りてきました。

物理シミュでオブジェクトを吹っ飛ばせて、板を2枚蝶番で繋いでコントローラにするところまではすぐイメージできたんですが、問題は板の角度の取得です。ソフトの範囲でできることとして、スマートフォンでジャイロセンサのデータを取ってWiFiで送信するのを最初に考えたんですが、イベント会場だと無線は使えるかどうか分かりません。で、有線となると、Arduinoでジャイロセンサを使えばいいのかなと思いました。

Arduinoは何年も前から手を出そうと思いつつ積みっぱなしだったんですが、具体的な使用目的があれば学習が速いはずだと思いました。Unity、Arduino、コントローラの制作、それぞれとても簡単な(簡単そうに見える)作業で済むのは魅力的です。そんな感じで題材が決まリました。

Arduino

最大の不確定要素から片付けようということで、まずは初めてのArduinoです。

オライリーの「Arduinoをはじめよう 第2版」のPDF版を買ってざっと流し読みして、スイッチサイエンスのArduinoをはじめようキットをぽちり。

Arduinoとか電子工作めいたことは掛け値なしに初めてで、1週間前の情勢がこれです。

UnityでArduino Unoに繋げたモーションセンサのデータを読む方法については、きゅーこんさんの記事にお世話になりました。IDEのダウンロード、ドライバのインストール、スケッチの書き換え、Unityからセンサのデータを読む方法など、ほぼ書かれている通りにやっただけですので(圧倒的感謝!)、詳しくはそちらを参照してください。

ただ、自分はモジュールに、同じ9軸センサのMPU-9150ベースですが、共立のKP-9150を使いました。KP-9150の場合、このようにCN1側の5本を接続します。

KP-9150 Arduino Uno
VCC 3.3V
SDA A4
SCL A5
GND GND
INT DIGITAL 2

とりあえずこんな感じでジャンパピンでジャイロのデータが来ました。ただ、接触が悪いためなかなか接続に成功せず、繋がっても数秒で途切れます。

これをどうすれば安定接続できるのか、また、どうやって板にくっつけて使えるようにするか、Arduinoごと載せるかどうか、まったくイメージが湧かない感じでした。

で、パーツショップの店内をうろうろしながら2時間くらい考えこんだりしたんですが、たぶん動くセンサ側だけがきちんと板に繋がっていればいいだろうということで、KP-9150付属のピンヘッダを上向きにハンダ付けして、5ピンコネクタのケーブルを経由してジャンパピンでArduino Unoに繋げました。ハンダ付けは大昔に学校の授業で一度やったきりで、2.54mmの狭いピン幅でできるかどうか不安だったんですが、少し練習してなんとかなりました。

センサを乱暴に振ったり、机に軽く叩きつけたりしてジャイロのデータが途切れないのを確認。これでとりあえず完了です。

ちゃぶ台コントローラ

さて、コントローラです。材料としては、ホームセンターで、自分で組み合わせて作るタイプのテーブルのパーツと、回転のスムーズな蝶番、ネジを購入。跳ね上げた板を音を出さずにストップするためにクッションを置いて、下に振動抑制用のウレタンスポンジ。これだけです。DIYとも言えないような超原始的な工作ですが、これにセンサを貼り付けると立派?なちゃぶ台コントローラと化します。

ちなみに、こういうやり方でたぶんちゃぶ台コントローラとして機能するだろうという感覚は、前回のシューティングゲームのときにフライトコントローラの固定に使った安定板で得た感じです。

Unityでの物理セットアップ

コントローラはできたので、Unity作業に移ります。板を寝かせた状態でジャイロセンサのクォータニオン値をリセットできるようにして、板のピッチ角に変換して、それをシーン内のちゃぶ台に反映するように物理のセットアップをします。

さて、「プログラムは思った通りに動かない。書いた通りに動く」という有名なフレーズがあります。それと同じように**「物理エンジンは思った通りに動かない。セットアップした通りに動く」**というのが言えるんじゃないかと思います。物理エンジンを使ったからといって、何でもすぐリアルに動いてくれると思ったら大間違いで、むしろごまかしが効かず、現実世界で物を動かすときと同じようにちゃんと考えてセットアップしてやらなければ、すぐによくあるゲームの面白バグ動画のようになってしまいます。例えば機械を動かすなら、ゲーム空間内で機械をきちんと「設計」してやらないといけないのです。

とはいえ、さすがにちゃぶ台をひっくり返すくらいすぐできるでしょ、と思ってました。思ってたんですが……。

まず、コントローラの板の角度をシーン内のちゃぶ台に反映させるのだから、当然のように、ちゃぶ台を直接回転させようとしました。が、思うように動きません。1時間くらい悩んだ末に、考え方が根本的に間違っていて、手を動かしてその結果ちゃぶ台が持ち上がるんだと気付いて、手に相当するキューブを作ってちゃぶ台を間接的に持ち上げるようにしました。が、これも上手くいきません。オブジェクトが剛体なので、コントローラをちょっと動かしただけでちゃぶ台が跳ねて手から浮いてしまいます。板を軽く上げたり下ろしたりできるようにしたいのですが、それができません。

で、バネを仕込んだりなどしていろいろ試行錯誤したんですが、結局、親指に相当するオブジェクトでちゃぶ台を挟んで、ある程度以上角度が上がると消えるようにしました。あと、インチキですが、ちゃぶ台が飛ぶ前に奥にずれないように脚の前に不可視のボックスを置きました。最終的にはこんな感じです。

何かもう少しましなセットアップがあるだろうという感じがしますが、とりあえずこれでちゃぶ台返しっぽい動作をするようになりました。

アセット

懸案は一通りクリアしたので見た目に取り掛かります。Asset Store様々です。

シーンはStudioBloodyBloomさんのJapanese Tearoom Setです。サンプルシーンそのままだとMacBook Proではフレームレートが厳しかったので、オブジェクトやライトなどだいぶ削りました。

あとは、ちゃぶ台の上に何を載せようかと探しまわっていたところ、Sushiを発見! みんな大好きSushiです。ちゃぶ台返しで吹っ飛ばすならできるだけリアル世界ではできない豪華なもののほうが楽しいはず、とざっと構成をチェックして10秒後にはぽちってました。

手はFPS Handy Handsがちょうど良さそうだったのでぽちっと。

と、こんな風に、次々と課金してしまうのがUnityの恐ろしいところです。おかげでこういうネタVRアプリがあっという間に組み立てられるのはありがたいですけど……。

テストプレイ

作ったものはやはりテストする必要があります。今回は定点カメラなのでVR酔いの心配はないんですが、ちゃぶ台コントローラの安全性と、オペレーションを確認しなければというのがありました。

ということで、UE4背景アーティスト勉強会にとても関心があって参加登録していたんですが、懇親会がどう考えてもOculus Rift体験会になりそうだったので持ち込みました。というか空気を読まずにUnity製で申し訳ないです(もう少し時間的な余裕があれば、関西ゲーム制作部Biz Libraryさんのところで試してもらおうと思ってたんですが……)。

題材的には、アセットを除けば、Unreal Engineのほうがいいような気がします。デフォルト状態で現実感のある絵を出しやすいですし、エンジン本体の機能でメッシュの破壊とかあるようなので、食器を割ったりできるかなと。Unreal EngineでArduinoの出力を読む方法も調べないといけないなと思ってます。通常のシリアルデータだと、AnswerHubに「UE4とarduinoの連携」というのがひとつだけ見つかるくらいで情報がほとんどないんですが、inokさんから、Arduinoにイーサネットシールドを載せてOSCで読めばいいんじゃないかというアドバイスをいただいてます。UE4-OSCを使えばBlueprintで読めそうですね。

反応

なかなか好評だったと思います。一部ツイートを紹介します。

だいぶ粗があるにも関わらず、いきなり望外の評価をいただけて嬉しいです。

ちなみに、手が左右逆になっててツッコミを喰らいました……。単に座標を変えて動かしているだけという問題もあるので、きちんとIKで動くようにしたいです。

安全性について

先ほどもちょっと触れましたが、特殊な機材をイベントで展示する上で気になるのは安全性です。Oculus Rift体験会で事故などということは絶対に避けたいです。謎の怪しいゴーグルをかぶって遊ぶ謎の怪しい集会でけが人が出たとか洒落になりませんし、他のOculus勢の方々にも迷惑がかかります。

例えば、今回のちゃぶ台コントローラだと、板ごとすっ飛んで行ったりすると非常にまずいです。

そんなわけで、持ち込んだのは、安全性の検証という面もあったんですが、そこそこ強くちゃぶ台返ししてもどうやら大丈夫っぽいかな? という感触でした。ただ、これまでOcuFesの展示でステアリングコントローラとフライトコントローラを使用したんですが、経験的に、わりと全力で操作する方が100人に数人くらいいるので、やや不安があります。

また、VR体験の向上という面でも安全確保は重要です。ちゃぶ台返しという題材上、できればちゃぶ台を全力でひっくり返したいところです。もし板をがっちり固定できれば、現実世界のコントローラのことを忘れて、VR空間で思いっきりちゃぶ台を飛ばせて、楽しさが増すでしょう。

たぶん、フライトコントローラの固定のときに使った衝撃吸収パッドや、錘、ガード、ロープなどでの固定、最終手段として手で押さえるなど、いろいろ考えられると思いますが、何かいい方法を考えたいです。

課題としては「実際に安全を確保すること」、その上で「思いっきり跳ね上げても大丈夫だということを、遊ぶ人に理解してもらうこと」の2つだと思っています。今のところ、これだという案がないんですが、ゆっくり考えてみたいです。

結び

というわけで、まあ一発ネタですが、Advent Calendarのおかげで、VRソフトのポートフォリオというかネタがひとつ増えました。また、Arduinoに手を出して実際に活用してみて、できることの幅が確実に広がったと思います。他にも面白いことができないか考えてみたいです。

思えば、Oculus Riftの最初の開発キットが届いてからもう1年半になりますが、ずっとモニタの向こうにしか興味のなかった自分がこんな妙なものを作ったりするようになったのは、Oculus Riftというデバイスのおかげ、また国内のOculusコミュニティの方々の刺激のおかげです。本当に感謝の限りです。

それから、イベントで展示するのかとすでに何人かに尋ねられてるんですが、機会があればOcuFesにぜひ持って行きたいです。どこかで見かけたら (ノ`Д)ノ彡┻━┻∴ してやってください。クオリティも改善して、「このちゃぶ台返しを作ったのは誰だあっ!」などとちゃぶ台返しされないようにしたいですw

あと、すでにチケットが売り切れになってしまったようなんですが、関西CEDEC 2015のOculusパネルディスカッションに登壇の予定です。Oculus勢の末席として何か面白いお話ができればと思っています(喋る練習しないと……)。

Oculus Rift Advent Calendar 2014の記事でした。明日はfaifxさんの「Oculus Riftで視差無し立体視」です。どうぞよろしくお願いいたします。

展示(2015年5月追記)

グランフロント大阪のROBO&PEACEと、幕張メッセのニコニコ超会議2015にて本作の展示を行いました。遊んでくださった方々に感謝です。

ちゃぶ台返しはお向かいの展示だったのですが、体験者のリアクションがやたらと良いので、僕もやらせてもらいました。
結果、思わずナイスリアクションしてしまいました。外から見ている以上にちゃぶ台をひっくり返す感じがリアルです。

想定外だったのが、全力で容赦なくひっくり返す人が考えていたよりもずっと多かったですね……。ROBO&PEACEではずっと手で板を押さえ続けるはめになったのですが、板が手の甲に何度も当たって、イベント終了後には腫れてしまいました。

そこで、ニコニコ超会議ではクランプを使ってちゃぶ台コントローラをテーブルに固定したのですが、これは上手くいきました。また、ストッパーにクッションではなくスポンジを使っています。

「思いっきり跳ね上げても大丈夫だということを、遊ぶ人に理解してもらうこと」については、Oculus Riftをかぶせる前に一度お手本で跳ね上げてみせるのと、合計3~5回ほどひっくり返してもらって、1回目の後に「もっと強くやっても大丈夫ですよ」などとアドバイスすることでなんとかしました。

ちゃぶ台コントローラの重量感がやはり本物と比べると足りないので、そこをどうにかできないかが考えどころです。

(書いた人: こりん

ブログトップへ