(Wii)(モーションプラス)(GlovePIE を利用して Wiiリモコン + モーションプラス を 空中マウス にしてみた)

関連の最新記事 → http://d.hatena.ne.jp/morakana/20100705/1278260133


 実は モーションプラス発表時から 個人的に ひそかに夢見ていた
「空中マウス」を Wiiリモコン + モーションプラス で 実現する実験をする機会が ついに訪れました! 笑)
ヤマダ電機の ポイントが溜まってたので それで Bluetoothインターフェイスを 買ってきた事で実現しました
ビバ! ヤマダ電機のポイント!! 笑)
(もっと早く買ってればもっと早く実験できてたのに・・・・)

 必要なもの
Bluetoothで通信できるWindowsPC (非搭載でも USB接続のインターフェイスは 1000〜2000円位で買えます)
Wiiリモコン (Wiiに付属されているもの、または別途購入 小売希望価格は4800円)
モーションプラス (一部のWii用ソフトに付属されているもの、または別途購入 小売希望価格は1500円)
GlovePIE

 Core2シリーズあたり以降のCPUが入ってれば特に問題もないし
その他も 特に敷居が高いものではありませんよね
PC(要Bluetoothインターフェイス) と Wiiリモコン と モーションプラスさえあれば
カスタマイズがバリバリ可能な 高性能の空中マウス を 入手できるチャンスですね
(モーションプラスのジャイロって かなりの高性能なんですよね)

 GlovePIEというソフトは Bluetooth機器からの入力を
PCのデバイスへの操作に変換(エミュレーション)するというものです
つまり Wiiリモコン と PC が Bluetoothで 接続されたとしても
Wiiリモコンを幾ら操作しても その事を解釈出来るプログラムじゃないと
その操作内容を受け取る事が出来ません
そこで このソフトが フロントエンドとなって 仲介するわけです
簡潔に言えば 「Wiiリモコン の A を 押した」という操作を
「マウス を 左クリックした」という操作に変換してPCに解釈させます

 そういう 変換内容の詳細 は 各自で スクリプトを書く事になります、 超面倒くさい!! 笑)
反面 それは カスタマイズが 柔軟という事になります
まずは 簡単なのから勉強してみようと いろいろと あちらのフォーラムを覗いてみたけど
私の頭の悪さから理解できず 頭痛くなってきたので 自力で考えてみました 笑)

 先日書いた センサーバーを利用するバージョンは ヌンチャクも使用しましたが
今回は あえて リモコン+モーションプラスのみ で 完結できるように作ってみました
スクリプトは 以下のとおりです
// ここに各自の画面の解像度を設定しておきます
var.DispWidth = 1920;
var.DispHeight = 1200;

// 前回のヨーとピッチ情報との差分を取得します
var.Vec_X = Wiimote.MotionPlus.GyroYaw - var.Last_GyroYaw;
var.Vec_Y = Wiimote.MotionPlus.GyroPitch - var.Last_GyroPitch;

// リモコンの動きに合わせてマウスカーソルを移動させます
// Bボタン を 押した時は マウスカーソルの動きが 止まります
// -ボタン を 押した時は マウスカーソルの動きが かなり遅くなります
// Bよりも -の方が優先されますので Bを押したまま -で位置を微調整できます
// Aボタン(マウスの左ボタンに相当)でドラッグを始めると マウスカーソルの動きが 若干遅くなります
// マウスカーソルの移動量は Aドラッグ時(=若干遅い) よりも B(=停止) の方が優先されますので
// Aでドラッグし 目的の所まで来たら Bでマウスカーソルを止めてから Aを放せばブレません
if (Wiimote.Minus) {
   Mouse.CursorPosX += (var.Vec_X / 900000);
   Mouse.CursorPosY -= (var.Vec_Y / 900000);
}elseif (!Wiimote.B){
   if Wiimote.A {
      Mouse.CursorPosX += (var.Vec_X / 500000);
      Mouse.CursorPosY -= (var.Vec_Y / 500000);
   }else{
      Mouse.CursorPosX += (var.Vec_X / 200000);
      Mouse.CursorPosY -= (var.Vec_Y / 200000);
   }
}

// Homeボタンを押した時 マウスカーソルを画面中央に戻します
// リモコン と マウスカーソル との 位置関係の感覚が狂ったり
// マウスカーソルを見失った時に利用します
// 自分にとってのセンターの位置にリモコンを構え Homeを押すと
// 感覚的に リセットされると思います
// 逆に言えば 体はそっぽを向いて リセットをすると
// 横を向いたまま操作も出来ます、まぁ体勢的に辛いだけですけど 笑)
if Wiimote.Home {
   Mouse.CursorPosX = var.DispWidth / 2;
   Mouse.CursorPosY = var.DispHeight / 2;
}

// 十字キーを キーボードのカーソルキーに割り当てます
Keyboard.Up = Wiimote.Up;
Keyboard.Down = Wiimote.Down;
Keyboard.Left = Wiimote.Left;
Keyboard.Right = Wiimote.Right;

// A を 左ボタン、+ を 右ボタン に割り当てます
Mouse.LeftButton = Wiimote.A;
Mouse.RightButton = Wiimote.Plus;

// 1 を押すと マウスホイール(下へ回転)
// B を 押しながら 1 を押すと マウスホイール(上へ回転)
if Wiimote.One {
   if Wiimote.B {
      Mouse.WheelUp = True;
   }else{
      Mouse.WheelDown = True;
   }
   Wait 150ms;
}

// 2 を 押しながら B を押すと Alt+Tab
Alt = Wiimote.Two;
Tab = (Wiimote.Two and Wiimote.B);

// 現在のリモコンのヨーとピッチ情報を、次回との比較のために記憶しておきます
var.Last_GyroYaw = Wiimote.MotionPlus.GyroYaw;
var.Last_GyroPitch = Wiimote.MotionPlus.GyroPitch;

 Wiiリモコン+モーションプラスを 机の上などに置き 完全に揺れが止まってから
スクリプトを実行してください
最初 LED2 と LED3 が 光り しばらくしてから LED1 が点灯します
LED1が点灯したら 持ち上げてかまいません

 早まって動かしてしまうと 誤動作しちゃいます
誤動作の影響でマウスカーソルが暴走する時は Bを押すと 暴走の影響を無効化することが出来ます
マウスで操作できるようになりますので あわてずにスクリプトを停止してから
もう一度やり直してください

 カーソル移動のポイント
リモコンの傾きを変えて リモコン先端を上下左右させると 比較的移動量が大きくなります
リモコンの傾きを変えず リモコン自体を上下左右に平行移動させると
比較的動きを抑えることが出来ますし、比較的正確な動きが出来ます

 ズレ補正のポイント
Bボタンを押す事でカーソルが止まってしまうわけなので
仕様上 リモコンの場所と マウスカーソルの位置が 感覚的にズレやすくなってしまいます
当然 「ズレ補正」が重要な問題になります

 まず初歩的に使える機能は Homeボタンを押すと 強制的に画面中央にカーソルが移動します
Homeボタンを押しながら しっくり来る位置にリモコンを持ってきて
Homeボタンを放すと センター補正が出来ます

 ある程度 操作に慣れてくると センター補正がまどろっこしくなってくると思います
そういう時は ちょっとした 発想の転換です
「Bを押す事でズレていく」のなら「Bを押しながら補正出来る」ハズですね
「ズレて来たな」 と思ったら Bを押しながら
そのカーソル位置にしっくり来る位置まで リモコンを移動させればいいわけですね
画面端の時は あえて 感覚的にズラした方が操作しやすかったのもしますので
自分のツボ をいろいろ探してみるのも楽しいかもしれません

 クリックのポイント
空中マウスで操作する場合 クリック や ダブルクリック が 結構難しいです
どうしても ブレてしまうからですね
そういう時は Bボタンでカーソルを止めてからやれば あっさりとクリックできます
Bでカーソルを止めて Bを押しながら -を押すと 微調整が可能になります
微調整がまどろっこしい場合は
思った所に止まるまで Bボタンを押しながら 時々Bボタンを放したりしながら
調整する方法も考えられますね
また それらを組み合わせると よりユーザビリティが上がるかもしれません

 機能の追加 や 違うカスタマイズ も かなり柔軟に出来るので楽しいですよね
また 何か面白い スクリプトを思いついたらブログに書きたいと思います