Wii fitのジョギングゲームのようにGoogleストリートビュー上をジョギングしよう

2008.09.07 / java

前回の「バランスWiiボードでGoogleストリートビューを操作するJSONP API」のネタのつづき。バランスボードでできるのだったらWiiリモコン(Wiimote)でもできるよね、というわけで、今回はWiimoteの加速度情報をJSONPで取ってきて、同じようにGoogleストリートビューを操作しています。

Wii fitのジョギングゲームのようにポケットにリモコンを入れてサクサク部屋の中で走ります。曲がるときは十字キーで曲がります。で、動いている様子はこんなかんじ。(初めてiMovieで編集作業してみた!)


Try to run on the google street view like a jogging game of wii fit from katsuma on Vimeo.

動作原理は前回と同じで、

  1. Wiimoteの加速度変化をJavaのサーバが取得
  2. localhost上のWebサーバ(Jetty)に加速度情報を通達
  3. リモートホストのサーバからJSONPで加速度を取得
  4. Google Map APIを呼び出し

の流れです。

ただ、それだけだと全く前回と同じなので、緯度経度情報の変化から走行距離と、その経路情報をリアルタイムに表示させてみました。右上の数字が走行距離、左上のGoogle Mapが経路情報になっています。この2つを表示させたら結構それっぽくなったんじゃないかなーと思います。

このあたりの処理はGoogle Map API使いまくりなわけですが、走行距離に関してはなかなか楽に求められないか調べまくった結果、GPointオブジェクトにdistanceFromメソッドなるものがあるみたいで、これを使うことで簡単に求められました。ソースコード的にはこのへん。

  _TJ.prevPoint = _TJ.currentPoint;
  _TJ.currentPoint = _TJ.marker.getPoint(); 
  _TJ.distanceHistory += _TJ.currentPoint.distanceFrom(_TJ.prevPoint) /1000;
  

よくある2点間の距離を求めるWebサービスなんかはこれ使ってんじゃないかな。今回は、ジョギングするごとにマーカーを道の上に打っていき、その2点間の距離を加算しています。(なので、曲がり角にも対応)。また、あわせてマップ上に走った場所に経路情報としてラインを引いているので「ここは走ったけどここは走ってない」なログを残すことも可能です。

これ、うまくやると同じ時間帯で(Googleストリートビュー上の)近所を走っている人がいたらリアルタイムに表示させたりすると、ゲーム性も高まってなかなか面白いものができるんじゃないかなーと思っています。

コードは一式テスト的な意味もこめてGoogle codeでホスティングさせてみました。(流行のGitとやらに挑戦してみたかったけど、よくわかんなかったので断念)

ビルド方法なんかはGoogle codeのWikiに簡単に書いてますが、Windowsユーザの人はBluetoothスタック(デバイスドライバ)をWIDOMMのものを利用しないと、おそらくうまく動かないと思います。Macユーザの人は、デフォルトのBluetoothスタックでOKです。このあたり、Windowsはちょっと面倒。

あとはlib/*.jarにclasspath通したらビルドできるはず。実行したらWiimoteの裏フタをあけて「SYNC」ボタンを押すと、"Detected your wiimote" なメッセージを表示して、同期がとれるはずです。同期がとれたらWebページにアクセス。

上の通り、ノリでtokyo-jogging.comなドメインまで取ったので、できたらWebサービスの形でまとめることができたら、と思っています。まずはもうちょっと使いやすい形にまとめることですね。