Android(Nexus One)のFirefox for MobileでWebGLが動く件に関して

Firefox 4 for Mobile: Demos! ✩ Mozilla Hacks – the Web developer blog
http://hacks.mozilla.org/2011/03/webowonder-mobile/

上記のページを見て、WebGLはどうだろうと思ってFirefox for Mobile4.0b1で試したら動いた。・・・ただし、なぜか逆さま。

まずはLearning WebGLのLesson2(http://learningwebgl.com/lessons/lesson02/index.html)。
http://ndruger.lolipop.jp/hatena/20110329/learning_webgl_lession2.png

次にScene.jsのティーポット(http://scenejs.org/dist/curr/extr/examples/hello-teapot/index.html)。
http://ndruger.lolipop.jp/hatena/20110329/scene_js_basic.png

最後に自作のWebGLサンプルゲーム(http://www.syspri.org/test/websocket_tile_nodejs_demo_socketio/webgl/src/websocket_tile_3d.html)
http://ndruger.lolipop.jp/hatena/20110329/3d_tile.png

最後のは恐ろしく遅かったので、速度的には相当問題がある模様。今後まとめてFPS取ってみる。

[2011/03/30 追記] さっそくダウンロードした4.0では逆さまの問題が起こらなくなっていた

Learning WebGLのLesson2(http://learningwebgl.com/lessons/lesson02/index.html)。
http://ndruger.lolipop.jp/hatena/20110329/learning_webgl_lession2_2.png

Scene.jsのティーポット(http://scenejs.org/dist/curr/extr/examples/hello-teapot/index.html)。
http://ndruger.lolipop.jp/hatena/20110329/scene_js_basic_2.png

自作のWebGLサンプルゲーム(http://www.syspri.org/test/websocket_tile_nodejs_demo_socketio/webgl/src/websocket_tile_3d.html)
http://ndruger.lolipop.jp/hatena/20110329/3d_tile_2.png

最後のゲームは色が逆になってる?

zsh環境でのnvm利用時のエラーと対応

さくらVPSにてzshの環境でnvmを使ってnode.jsをインストールしたら、エラーが2つ発生したので対応方法をメモ

source ~/.nvm/nvm.shでのエラー

$ source ~/.nvm/nvm.sh
error message: /home/snow/.nvm/nvm.sh:175: parse error near `|'

私がPをperl用のパイプとして定義してたためのエラー。

-      for P in {stable,latest,current}; do
-          echo -ne "$P: \t"; nvm_version $P
+      for k in {stable,latest,current}; do
+          echo -ne "$k: \t"; nvm_version $k

~/.nvm/nvm.shを修正。

nvm install v0.4.2でのエラー

$ nvm install v0.4.2
nvm:40: no matches found: -#
nvm: install v0.4.2 failed! 

~/.nvm/nvm.shを修正。'-#'はcurlプログレスバーを出すオプションだがzshだと別な意味に解釈される。プログレスバーはいらないので削除。'#'をオプション名に使うなんて初めて見たよ

- curl -C - -# "http://nodejs.org/dist/node-$VERSION.tar.gz" -o "node-$VERSION.tar.gz"
+ curl -C - "http://nodejs.org/dist/node-$VERSION.tar.gz" -o "node-$VERSION.tar.gz"

kinectでの移動方法の整理

  • 自動で動く
    • 主に乗り物が動く。MSのkinectのゲームはこれが多い
  • 足踏み
    • 足が別なことに使えなくなる
  • wiimote / iPhone / Android
    • パンチと相性が悪い
    • 見ずに操作するので、実ボタンがないiPhone / Androidは厳しそう
  • 体を傾ける
    • 向きの変更は、体をひねる
    • HMDの視界に影響がある
    • 泳ぐなど
    • 手が別なことに使えなくなる

結論

  • どれを利用するかは、他のどの部位をゲームに使いたいかに依存する
  • 手軽で他の部位が使いやすい"体を傾ける"か"wiimote / iPhone / Android"を最初に試す

Kinect + node.js + WebGLで簡易ゲーム作ってみた

Kinect(キネクト)勉強会 Vol.1で発表した物です。

以前Kinectを使ってブラウザのWebGL内を動いてみた - 最高のコンピューティング環境とは?にて、Kinectとブラウザをnode.jsで繋げたので、それを少し発展させて、ゲーム(?)を作ってみました。
HMD(VR920)使ってWebGL内を見渡してみた(試作) - 最高のコンピューティング環境とは?の実験結果も併用して、VR920で周りを見渡すことも出来ます。

デモムービー

VR920モード off

VR920モード on

対応ブラウザはChromeの最新版とFirefox4の最新版。
ただし、Firefox4だとnetwork.websocket.override-security-blockを変更しないと、WebSocketが使われないので、檄重。
WebGLを使うのでPCにプログラマブルシェーダーが必要。

操作方法

  • 敵が弾を撃ってきます。当たると体力が減ってそのうちゲームオーバーになります。
  • 左手に相当するHTML5の盾で弾を防げます
  • パンチを打つと自弾が出て、敵に当たると敵が消えます。
    • パンチ動作の判定は手・肘・肩の角度で判定してます。
    • 速度は200ms前の手の位置との変化量から計算してます。
    • 向きは肩と手を繋いだ方向に飛ばしてます。
  • VR920を繋いで"VR920 on"のボタンを押すとVR920の向きに合わせて周りを見渡すことが出来ます
  • 右手を頭に近くして、左手を伸ばすと、時間(敵弾・自弾)が止まります。

実現方法とソースコード

1.Kinect --> 2.OpenNI(PC用のKinect対応フレームワーク)を使ったアプリ --[TCP]--> 5.ローカルNode.jsサーバー --[WebSocket(SocketIO)]--> 6.ブラウザでWebGL(SceneJS)
3.VR920 --> 4.VR920のSDKのサンプルを改造したアプリ --> 5

"2.OpenNI(PC用のKinect対応フレームワーク)を使ったアプリ"

"OpenNI\Samples\NiUserTracker"の改造版。各jointのx,y,zを投げるように改造。

改造点のdiff: http://ndruger.lolipop.jp/hatena/20110226/kinect.diff

"4.VR920のサンプルを改造したアプリ"

HelloTracker2の改造版。HMDの角度を投げるように改造。

改造点のdiff: http://ndruger.lolipop.jp/hatena/20110226/vr920.diff

"5.ローカルNode.jsサーバー"

TCPで情報を受け取り、JSONの正しい単位でまとめて、ブラウザにWebSocketで投げる。
ついでにデバッグ用に情報の記録と再生の機能も持つ。

ソース: https://github.com/ndruger/kinect-game/tree/master/js/device_server
サンプルレベルのソースなので流用歓迎ですが、ライセンスが明示されてないと他の人が再利用しずらいという話があったので、MITライセンスとしておきます。
利用しているライブラリはそれぞれのライセンスに従います。

"6.ブラウザでWebGL(SceneJS)を使って表示"

情報を受け取り、Scenejsを使ってWebGLで描画する。
ゲーム全体を実装。

ソース: https://github.com/ndruger/kinect-game/tree/master/js/client
サンプルレベルのソースなので流用歓迎ですが、ライセンスが明示されてないと他の人が再利用しずらいという話があったので、MITライセンスとしておきます。
利用しているライブラリ(glMatrix.js, SceneJS, socket.io)はそれぞれのライセンスに従います。

現状の課題

  • Kinectからの通信量が多すぎ。ネット対戦までにフィルターしとく。
  • VR920モードの視点がブレブレ。
  • 移動方向が単位ベクトル。
  • 当たり判定がすべて球。

今後の予定

  • 動き回れるようにする
  • ネット対戦

Kinect勉強会 Vol.1で使ったスライド

Kinect(キネクト)勉強会 Vol.1で私が発表に使ったスライドです。

(2011/03/01 追記) 現在"iframe → Google Gadgetコンバータ"がうまく動いてないようなので、リンクも張っておきます。Kinect + node.js + WebGLで作る簡易ゲーム

利用したプログラムとソースはKinect + node.js + WebGLで簡易ゲーム作ってみた - 最高のコンピューティング環境とは?に記述しました。

振動によるフィードバックのための情報整理

Kinect + WebGLのゲームで人体に何らかのフィードバックを行いたい。
動き回る点と実現の容易さから、振動によるフィードバックが妥当なので方法を整理。
できればjavascriptで簡単に実現したい。

  • 案2. PhoneGap / Sencha Touch / Titaniumの振動機能 + iPhone
    • 構造
      • Kinect --> OpenNI App -[TCP]-> node.js local app -[WebSocket]-> Browser <-[WebSocket]-> node.js server app -[WebSocket]-> iPhonejavascript実行環境
    • iPod touchしか持ってなくて振動できないのでボツ
  • 案3. 案2のAndroid
    • node.js server appとの通信がWebSocketじゃなくなってしまうが、結構妥当。保留。
  • 案4. Android / iPhoneのスピーカーによる振動
    • 可聴域外の音では大きな振動をしないのでボツ。
    • ただ、KinectAndroid / iPhoneWebGLオブジェクトの何かに触ると、Android / iPhoneから適した音が出るというアイデアはおもしろいので、別途実現。Wiiのゲームでもそんなのがあった気がする。
  • 案5. USB-IOと振動モーター
    • 面倒すぎるしコードが邪魔なのでボツ。
  • 案6. Wiimoteによる振動
    • 構造
      • Wiimote <--> WiiYourself App <-[TCP]-> node.js local app <-[WebSocket]-> Browser
    • 可能っぽいけど。WiiYourself AppでTCPをListenするのが面倒。保留。

結論

案3でいく。

HMD(VR920)使ってWebGL内を見渡してみた(試作)

HMDのVR920には加速度センサーがついているので、それを使うと、顔をどこに向けているのか分かります。
その情報を、node.jsのアプリを経由してWebSocketに送ると、顔の向きでWebGL内の視点の方向を動かして、WebGL内を見渡せます。
不完全な部分が多いので試作ですが、別な作業に移るので一旦ポストします。

デモムービー


実現方法とソースコード

1.VR920 --> 2.VR920のSDKのサンプルを改造したアプリ --[TCP]--> 3.ローカルNode.jsサーバー --[WebSocket(SocketIO)]--> 4.ブラウザでWebGL(scene.js)を使って表示

"2.VR920のサンプルを改造したアプリ"

HelloTracker2を改造。適当にフィルターしてTCPで投げる。

改造点のdiff: http://ndruger.lolipop.jp/hatena/20110212/throw.patch

"3.ローカルNode.jsサーバー"

TCPで情報を受け取り、jsonの正しい単位でまとめて、ブラウザにWebSocketで投げる。

ソース: http://www.syspri.org/store/vr920_trunnel/vr920_server/

"4.ブラウザでWebGL(scene.js)を使って表示"

WebSocketで情報を受け取り、Scene.jsのカメラのlookを変更する。角度からlookの計算にはglMatrixを使っている。
Vuzix SDKのドキュメントによるとyawは32768まで来るけど、試したら+-16383までしか来ないので、32768ではなく16383で割っている。

ソース: http://www.syspri.org/store/vr920_trunnel/client/

現状の課題

  • なんか右を向いたら、yawの値が想定と違っていて、うまくlookが移動してくれない。
    • pitchで修正する必要がある?今度ゲームに使うときには直しておく。任意軸回転が必要とかいう落ちかも。
  • いろいろ値の微調整が必要。

今後の発展

  • kinect + wiimoteと連携して、下記のようなものを作りたい
  • VR920は左右に違う映像を流せるので、それでWebGL内を立体視をしたい
    • iZ3DのVR920タイプの出力を使ってもどうもうまくいかない。切り替えが間に合ってないのかなぁ。