0012-12-16

[][]Wii Motion PlusをUnityで使うときのメモ Wii Motion PlusをUnityで使うときのメモ - Nao_uの日記 を含むブックマーク はてなブックマーク - Wii Motion PlusをUnityで使うときのメモ - Nao_uの日記 Wii Motion PlusをUnityで使うときのメモ - Nao_uの日記 のブックマークコメント

GlovePie + PPJoyを使用。GlovePieでリモコンの情報を入力して、PPJoyで作った仮想ジョイスティックに流し込む。

仮想ジョイスティックの値をUnityのInput Settingの設定で通常のジョイスティック入力として受け取る。

PPJoyはver 0.83を使用。Windows7以降ではドライバが正常にインストールできないため、PPJoyをインストール後に、Windowsを未検証ドライバが入れられるテストモードに切り替えて、PPJoySetup-0.8.4.5-early-release.exeでドライバをインストールする必要がある。


Bluetoothの接続はなぜかかなり不安定。最初の接続失敗がかなり多い。2つリモコンを同時につなごうとすると成功しやすいような気がしないでもない。スリープに入るとGlovePieが不安定になって、Windowsを再起動しないとつながりにくくなるような雰囲気も。一度つながってしまえば、しばらくは大丈夫。

GlobePieのスクリプトは下記の通り。アナログ値はPPJoy1.AnalogXで受け渡し。Unity側が0.0~1.0までしか受け取れないみたい(Input Settingで変えられるかも?)

var.Vec_X = Wiimote.MotionPlus.GyroYaw - var.Last_GyroYaw;

var.Vec_Y = Wiimote.MotionPlus.GyroPitch - var.Last_GyroPitch;

var.Vec_Z = Wiimote.MotionPlus.GyroRoll - var.Last_GyroRoll;

var.s0 = Wiimote.MotionPlus.PitchSpeed;

var.s1 = Wiimote.MotionPlus.YawSpeed;

var.s2 = Wiimote.MotionPlus.RollSpeed;

var.Last_GyroYaw = Wiimote.MotionPlus.GyroYaw;

var.Last_GyroPitch = Wiimote.MotionPlus.GyroPitch;

var.Last_GyroRoll = Wiimote.MotionPlus.GyroRoll;

var.ncx = Wiimote1.Nunchuk.JoyX

var.ncy = Wiimote1.Nunchuk.JoyY

var.rx = (var.Last_GyroPitch+180) * (1.0/360.0);

var.ry = (var.Last_GyroYaw+180) * (1.0/360.0);

var.rz = (var.Last_GyroRoll+180) * (1.0/360.0);

while( var.rx < 0 ) var.rx += 1.0;

while( var.rx > 1 ) var.rx -= 1.0;

while( var.ry < 0 ) var.ry += 1.0;

while( var.ry > 1 ) var.ry -= 1.0;

while( var.rz < 0 ) var.rz += 1.0;

while( var.rz > 1 ) var.rz -= 1.0;

var.rrx = var.s0 / 10000 + 0.5;

var.rry = var.s1 / 10000 + 0.5;

var.rrz = var.s2 / 10000 + 0.5;

PPJoy1.Analog3 = var.rrx;

PPJoy1.Analog4 = var.rry;

PPJoy1.Analog5 = var.rrz;

PPJoy1.Analog2 = 0;

PPJoy1.Analog0 = var.ncx;

PPJoy1.Analog1 = -var.ncy;

Keyboard.X = Wiimote.Nunchuk.ZButton;

Keyboard.C = Wiimote1.Minus;

Keyboard.V = Wiimote1.B;

Keyboard.Space = Wiimote1.One;

  • PPJoy1.Analog0 : デフォルトではHorizontal
  • PPJoy1.Analog1 : デフォルトではVertical
  • PPJoy1.Analog2 : 割り当てがうまくいかない?
  • PPJoy1.Analog3~5 : ジョイスティックのZなどに割り当てられた。Unityでは4~6に相当。

UnityのInput Settingで適当な名前を付けて、ジョイパッドからの入力として受け取る。0.0~1.0の値になるように適当に変換して、入力結果を受け取ってから元に戻す。

ジャイロの入力は、角度をそのまま使うとうまくいかなかった。真上に向けて、Z軸回転させてから戻すと元に戻らない。いろいろ試したけどダメだったので、それぞれの軸の速度を受け取るように修正。

今の姿勢行列に、それぞれの軸の回転速度を毎フレーム掛ける。少しづつずれてしまうけど、角度を受け取ってもずれは発生してしまってどこかで補正が必要になるので、こちらの方が素直な実装かも。実際に触ってみたら角度そのままよりも、移動量を増幅した方が気持ちい動きになったので、むしろ好都合だった。

ずれの補正については、センサーバーで正面方向を、重力加速度でピッチとロールを自動補正できるはず。渡せるアナログ値の数の限界に引っかからないかどうかは要確認。