プロジェクションシューティングゲームを作ってみた
モバイルプロジェクターとスマホを組み合わせて投影式の3Dシューティングゲームを作ってみた。
まずは動画から。
暗くてわかりにくいが、壁の中を懐中電灯で照らして、敵を撃破するようなゲームになっている。
ゲームルール
実験なのでゲームと呼ぶにはあまりにも単純だが、
前方から迫ってくる敵の方にカメラを向けて狙い、画面をタッチでショット発射。
目の前まで敵が迫ってくるとダメージ。
3回ダメージを食らうとゲームオーバー。
一応徐々に敵が増えて難しくなるようにはしている。
仕組み
仕組みは非常に単純。
スマホとモバイルプロジェクターを一緒に持つ。
スマホの傾きをジャイロセンサで検出し、ゲーム中のカメラの向きに反映させる。
その映像をスマホからHDMIケーブルで接続したモバイルプロジェクターで壁に投影。
見たい方向にスマホとプロジェクターを向けることで、懐中電灯の光で壁の中の世界を覗いているような感覚を味わえる(当社比)
ゲーム部分はUnity製。
最大の利点は、必要機材がモバイルプロジェクターとスマホと接続ケーブルだけなので取り回しが非常に楽な点。
壁と暗闇があればどこでもプレイ可能。
今回はiPhone6Plusを使用した。
ちなみに、画面の左下に見えるのはカメラの向きのリセットボタン。
作ってみて
壁の中を覗いてるような感覚はまぁまぁ出せたと思う(動画ではわかりにくいのが辛い)
iPhone6Plusのジャイロセンサはそこそこ精度はいいが、やはり急激な変化には追従できないようで若干ずれる。
まぁ簡単に作れるのでそこら辺はトレードオフか。
当初はスマホにヘッドホンを付けて左右の音で敵が出てくる方向を察知できるようにしたかったが、HDMI接続のせいで音声がプロジェクターのモノラルスピーカーで再生されてしまった。
プロジェクターにもヘッドホン端子はあったがノイズが酷いのと音声がモノラルになってしまっていて聞き分けできなかった。
敵の出現音がソナー音っぽいのはその名残。
まぁ簡単に作れるのでそこら辺はトレードオフか(2回目)
初めはメディアアート的な作品にするつもりだったが、気がついたらゲームになっていたのは職業病だと思う。
使用素材など
シェーダー
壁や敵の格子状の模様は、こちらのシェーダーを参考に頂点&フラグメントシェーダーに書き起こし、輪郭線を追加した。
効果音
Rez Infinite with シナスタジアスーツ体験
Rez Infinite
去年の12月に開催されたPlayStation Experience 2015にて、発表されたRez Infinite。
RezがPlayStation VRで蘇ることよりも、音に合わせて全身がピカピカ光る銀色の『シナスタジアスーツ』とPlayStation VRを身につけた水口哲也氏の姿が、レトロフューチャーが一周回って現実に現れたような感じで心を奪われた。
自分はレトロフューチャー好きでLED好きなのでシナスタジアスーツがすっごく欲しいと思ったが、市販する見込みは無いらしいと聞いてがっかりした。
シナスタジアスーツを体験するチャンス
それから数カ月後、六本木ヒルズで開催される MEDIA AMBITION TOKYOにてRez Infiniteとシナスタジアスーツの体験が出来ると知って行ってみた。それが昨日。
シナスタジアスーツは2層構造になっていて、音に合わせて振動させる振動素子が全身に散りばめられている内層と、音に合わせてLEDが光る外層がある。
今回は振動する内層のみを装着して体験することが出来た。
それでも、スタッフ二人がかりで全身に振動素子のバンドを装着していく必要があり、ちょっと宇宙飛行士になったような気分だった。
シナスタジアスーツを装着した後は、PlayStation VRを頭にかぶる。
メガネをつけていたのでちょっと圧迫感があった。
左右の目の距離や高さなどを調整し、さらにヘッドホンを装着する。
PlayStation VRとヘッドホンで外界からほぼシャットダウンされた状態でプレステのコントロラーを渡される。
目の前には、Rez ∞のロゴが表示されており、頭を左右に振ると視界が動かせた。
Press Any Buttonと表示されているので適当にボタンを押してゲームスタート。
頭の動きでロックカーソルが動かせるのが凄く直感的で楽しい。
振動は序盤は割と静かだが、音楽の低音に合わせてドッドッドッドッと揺らされる感覚は、ライブやクラブ等で大音量のスピーカーから発せられる音圧で全身が揺さぶられるような感覚に近い。
しばらく進むとボス戦に突入。
途中、ボスが後ろに回り込むが、ただの演出かと思って前を向き続けていたら一向に前に戻ってこないので、あれ?と思い振り返ったらずっと後ろで走り続けていた。
あぁ、振り向いて戦わなきゃいけないのかーと元のRezとの違いにちょっと戸惑いつつもクリア。
時間にしたら5分くらいだと思うが、はじめは振動を感じていたが、途中から振動に慣れたというか音楽と一体化してるかのような不思議な浮遊感があった。
プレイ後そんなに動いていないはずなのに結構汗をかいていた。
正直VRはあまり興味がなかったが、Rez Infiniteを体験したらPlayStation VRが欲しくなった。
というか、シナスタジアスーツ欲しいなぁ。
でも、後ろの配線とか機材を見ると一般販売は難しそうだ。
シナスタジアスーツを体験したい人向けの注意
MEDIA AMBITION TOKEYOでは、他の展示品は自由に閲覧できるが、Rez Infiniteは整理券を持っている人間のみが体験できるので注意が必要。
整理券は、当日17時半頃に配られる事になっているが、自分が行った時は、16時頃から既に並び始めてる人がいた。
また、スーツの装着の手間が掛かることから1日8人位しか体験できないらしいので、どうしても体験したい人は17時半よりも早めに行くことをお勧めする。
ちなみに、MEDIA AMBITION TOKEYOは3月21日までなので、猶予は今日明日しかない。
まだの人は急げ!
写真
あとは現地で撮った写真をどうぞ。
Rez Infinite - Synesthesia suit
リンク
Raspberry piにゴミの日を喋らせる機能を改良した
機械に話しかけられるということ
前回、slack経由でRaspberry piに喋らせる機能を追加した。
それを使ってゴミの日を通知するようにして、しばらく運用してみた結果、わかったことがある。
人はわかっていても、突然機械に喋られるとビビるし、理解が追いつかない。
実際運用してみて、突然ラズパイに「今日は可燃ごみの日です」と言われても、心の準備が出来ず「え!?なんだって?」となった。
まぁ機械に限らず、突然用件だけ言われたら、理解できずに聞き返してしまうもんだよなぁ。
考えてみれば当然だった。
人に話しかける時も「すみません」とか「もしもし」とか「Excuse me」とか1クッション置いてから用件を言う。
さらに、siriなども用件を言う前に何かしらの音が鳴る。
ちゃんと意味があったんだなぁ、と当たり前のことを再認識した。
心の準備大事。
ゴミの日に警告音を鳴らす
前述のことから、ゴミの日を音声で知らせる前にちょっとした警告音を鳴らすようにしてみた。
hubotに、普通に喋らせるtalkコマンドの他に、警告音付きのwarningコマンドを追加した。
child_process = require 'child_process' module.exports = (robot) -> robot.respond /talk (.*)/i, (msg) -> atalk robot, msg, msg.match[1] robot.respond /warning (.*)/i, (msg) -> child_process.exec "aplay /home/pi/sound/warning.wav", (error, stdout, stderr) -> if !error atalk robot, msg, msg.match[1] else msg.reply error atalk = (robot, msg, message) -> child_process.exec process.env.AQUESTALK_PATH + "/AquesTalkPi " + message + " | aplay -q", (error, stdout, stderr) -> if !error msg.reply 'OK' else msg.reply error
warningコマンドは、先に用意したwavファイルを再生させた後に、目的のメッセージを喋らせているだけ。
で、出来上がったのがこちら
これでもう聞き逃さない。
ダイレクトマーケティング
警告音といえばダライアス。
シリーズ最新作「ダライアスバースト クロニクルセイバーズ」PS4, PSVita, Windows(Steam)で発売中!
【聖帝】3Dプリンタで色んなチョコ型を作ってみたかった【イカ】
今週のお題「バレンタインデー」
今日は2月14日、バレンタインデー。
うちには3Dプリンタがあるので、チョコの型が作れるんじゃないかと思い、色々挑戦してみた。
チョコの素
型に流し込むチョコはNUT2decoのキャンディライターというものを使用した。
電子レンジで温めるだけという手軽さから、今回チョコを作ってみる動機になったといっても過言ではない。
とりあえず、普通のチョコ色、赤、白、黄色、緑、水色の6色を購入した。
アメリカ産なので、チョコの色がかなりケバい。
六角形
まず最初に、簡単なものからということで「六角形」の型を作ってみた。
これはうまく出来た。
複数並べるとボードゲームか大戦略を思い出す。
食べられるボードゲームとか面白そう。
しかし、積層式の欠点である、積層痕がそのままチョコにもついてしまうので見た目があまり美味しく見えないかもしれない。
また、六角形を作っている最中アクシデントがあり、2本のキャンディライターが犠牲になった。
普通のチョコ色のキャンディライターを使っていたが、電子レンジで温めすぎてチューブに穴が開いてしまい使えなくなってしまった…。
次に、白色のキャンディライターを使っていたが、チューブの出口の穴が小さすぎていくら握っても出ず、力を入れすぎたら後ろ側に穴が開いて飛び出てしまった…。
以後、温めすぎるのとチューブ口の穴の大きさには細心の注意を払うようにした。
聖帝サウザー
六角形で気を良くして複雑な形状に挑戦してみた。
題材はなぜか聖帝サウザー。
作り方は、
それを、123D Designでインポートし、Excude等で立体化。
立体化したドヤ顔を"Combine"->"Subtract"で立方体から型抜き。
"Shell"で余分な領域を削って1mm程の厚みにする。
いっぱい並べて出力。
チョコを流し込んで30分ほど冷蔵庫で冷やして完成。 恐い…。
結果は、大失敗。
辛うじて口元でサウザーっぽく見えるが、離れてみるとウホッいい男の阿部さんに見えてくる。
最初は、溝の深さを1mmにして出力するも、溝にチョコがハマって抜けなくなって失敗。
次に、溝の深さを0.5mmにして出力してみたが、精度の問題からかほとんど高低差がなくなって顔の表情がほとんどわからなくなってしまった。
あと、型の傾斜が急すぎて衝撃を与えても中々抜けなかった。
衝撃を与えすぎて青は割れてしまった。
スプラトゥーンのイカ
聖帝を複数作ってもまだまだチョコが余っている状況。
このまま捨てるのはもったいない…。
せっかくカラフルなチョコがあるので、スプラトゥーンのイカアイコンも作ってみた。
聖帝の時と同じようにイラレでパスを引いてSVGで出力したものを、123D Designにインポートして立体化して出力。
それにチョコを流し込む。
イカなので、イカ入りで。
半分くらいまでチョコを流し込み、千切りした裂きイカを入れ、その上からチョコをかけて閉じ込める。
冷蔵庫で30分冷やして完成!
パッと見おいしそう。
食べてみたが、意外とうまかった。
が、一緒に食べた人は凄い顔になっていた。
自分の味覚はおかしいらしい。
まとめ
結論としては、積層式の3Dプリンタでは綺麗に型作りは出来なかった。
課題
- 積層痕が目立って美味しそうに見えない
- フィラメントPLAは硬すぎてチョコを型から抜くときに苦労する
- 細い溝に空気が詰まって穴になってしまった。溝に行き止まりを作らないほうがいいかも
- 型の傾斜は45~60度程度がいいかも。急すぎると型から抜くときに苦労する
以上のことから、3Dプリンタで型を直接出力するより、出力したものを表面処理して、そこから食品用シリコンで型をとったほうが完成度が上がると思う。
簡単な方法なんて無かったんや…。
参考
2DイラストをSVG形式で123D Designにインポートするアイデアはこちらを参考にさせていただきました。
キャンディライターの販売元、NUT2deco
クッキー型(クッキーカッター)やチョコレート型などの抜き型、バレンタイン、ケーキポップス、カップケーキのスイーツデコレーション食材料と製菓道具、パーティ、ラッピング包装用品通販サイト
slackからRaspberry Piに喋らせてみた
D級アンプ
秋月でこんなものを見つけた。
D級アンプといって、アナログではなくPWMで増幅するらしい。
以前、Raspberry Piに100均で買ったスピーカーをつけて音声を再生させてみたが、あまりにも音が小さすぎて使い物にならなかった。
今回は、このD級アンプモジュールを使って、Raspberry Piの音声再生にリベンジしてみた。
USBカップウォーマーを作ってみた
あけましておめでとうございます。
本年もよろしくお願いします。
大晦日ハッカソン
ここ3年ほどだが、毎年年末になると年が明けるまでに、何かしらの電子工作を作り上げるという趣味を続けている。
2013年、2014年と光るLEDマフラーを作成した。
それについてはいずれブログにまとめたい。
去年(2015年)はUSBカップウォーマーを作っていた。
ちょうどtwitterで #大晦日ハッカソン というタグが流れていたので、それに乗じて進捗を報告していた。
完成品の見た目はこんな感じ。
完成品の動画は下記から。
2016年の抱負
去年以上にモノづくりのイベントやハッカソンなどに参加して、知識や交友を深めたい。
去年から作り続けているオリジナルラジコン戦車を完成させたい。
室内の湿度を監視して加湿を促すシステムを作った
この記事は、Raspberry Pi Advent Callender 2015の23日目の記事です。
22日目はCS_Tokuさんの「Raspberry PiとRGBマトリクスで電光掲示板作ってアニメ流したった」でした。
自分もLEDが好きなので、そのうちLEDマトリックスで色々遊んでみたいと思います。
Raspberry Pi + slack + hubot + 温湿度センサ
以前、Raspberry Piとslackとhubotと温湿度センサで室内の温湿度を測定してslackに投稿する仕組みを作ったが、それを更に改良した。
構築方法に付いては過去記事を参照。
湿度監視システム
せっかく室内の温湿度が測定出来るようになったので、定期的に湿度を測定して快適な湿度をはみ出してしまったら通知するように改良した。
ちなみに快適な湿度とは、45%〜65%の間らしい。*1
さらに、室内灯にPhilips Hueを使っているので、湿度に応じて灯りの色を変えて目でもわかるようにしてみた。
ざっくりとした仕組みは下記の通り
- node-cronで毎時間温湿度を測定しslackに投稿する
- 湿度が45%を下回っていたら「湿度低すぎ」と判断し、加湿を促すメッセージをslackに投稿し、Philips Hueを赤くする
- 湿度が65%を上回っていたら「湿度高すぎ」と判断し、除湿を促すメッセージをslackに投稿し、Philips Hueを青くする
Philips HueをRaspberry Piから制御する方法は過去記事を参照。
一定時間毎に温湿度を監視して通知するスクリプト
hubotは(というかnode.jsは)受動的に処理を行うのは得意だが能動的に処理を行うのは苦手。
定期的に処理をするために、node-cron をインストールする。
$ npm install cron
続いて、温湿度を監視するCoffeeScriptを作成。
湿度を監視するジョブの起動と停止は、slackからできるようにしている。
# Description: # 温湿度を監視する # # Commands: # hubot 湿度監視して 湿度監視をする # hubot 湿度監視やめて 湿度監視をやめる uc = require('../libs/usercheck') # 特定のユーザーかどうかチェックする自作ライブラリ tmp = require('../libs/temperature') hue = require('../libs/hue') CronJob = require("cron").CronJob STORE_KEY = 'hue_hudi_key' request = require('request') exec = require('child_process').exec envelope = room: "#general" module.exports = (robot) -> # 温湿度をチェックする関数 tempCheck = () => tmp.get_temperature((err, temp, hudi) -> if !err robot.send envelope, "現在の室温は#{temp}℃、湿度は#{hudi}%です" if hudi < 45 hue.set_hue_color(128, 255, 6375) # Hueを赤くする robot.send envelope, "室内が乾燥し過ぎのようです。加湿したほうがよろしいかと思います" else if hudi > 65 hue.set_hue_color(128, 255, 47000) # Hueを青くする robot.send envelope, "室内の湿度が高すぎるようです。除湿したほうがよろしいかと思います" else robot.send envelope, "#{err}" ) # 湿度をチェックする命令 robot.respond /湿度チェック/i, (msg) -> if uc.user_check(msg.message.user.id) tempCheck() else msg.reply 'ご主人様以外のお方からのご命令はお受けできません' # 1時間毎に温湿度をチェックするCronジョブ(午前2時〜9時までは計測しない) tempJob = new CronJob('0 0 0-1,9-23 * * *', tempCheck) # redis.brainの読み込み時に監視設定を読み込む robot.brain.on 'loaded', => flag = (robot.brain.get STORE_KEY ) or "false" if flag == "true" robot.send envelope, "湿度の監視を開始します" tempJob.start() # 湿度監視開始リクエスト robot.respond /湿度監視して/i, (msg) -> robot.brain.set STORE_KEY, "true" # 湿度監視停止リクエスト robot.respond /湿度監視やめて/i, (msg) -> msg.send "湿度の監視を停止しました" tempJob.stop() robot.brain.set STORE_KEY, "false"
実際に使用してみて
自宅湿度監視システムのおかげで、室内が乾燥しているのが目でもわかるようになったのはいいが、加湿器が無いのでどうすることも出来ないという致命的な欠陥が発覚した。
加湿器を購入して、それをRaspberry Piから制御できるようにするといいかもしれない。
「オレはようやくのぼりはじめたばかりだからな このはてしなく遠いおうちハック坂をよ…」
カイワレ先生の次回作にご期待ください。
明日は、kinpiraさんです。