KOSAKA LABORATORY->Tips

 このBlogの一部が書籍になりました。
書籍:「WiiRemoteプログラミング」
著者:白井暁彦・小坂崇之・木村秀敬・くるくる研究室
表紙:タナカユカリ
発売:2009年7月25日 好評発売中
詳細:こちらから

内容:WiiRemoteを利用したインタラクティブ技術のプログラミング学習書

 話題の家庭用ゲーム機「Wii」の特徴的なコントローラーである「WiiRemote」をPCで使うプログラミングが注目されている。高性能な加速度センサーや赤外線センサーを持ち、Bluetooth接続が可能で、プログラミング可能なデバイスを、個人レベルで自作したり入手したりすることはできなかった。WiiRemoteの登場とともにそれが安価で手軽に入手可能になり、多くの人々が興味を持っている。

 本書は、WiiRemoteの応用に興味があるプログラミング初学者向けに、WiiRemoteをPCから扱うためのプログラミングを解説する。ハードウェア寄りのゲームプログラミング入門書として、ステップバイステップでソースコードを解説する。具体的なサンプルを開発しながら、インタラクション技術を独習できる。言語はC/C++、C#およびActionScript 3、Processingなどをサポート。

バランスWiiボード(Wii Fit)を使う

 バランスWiiボード(Wii Fit)を使ったプログラミングを行っていきます。

WiiFitには4つのフォースセンサが内蔵されており、重さや重心の位置を知ることができます。

ここでは、ピクチャーボックスに重心の位置を表示し、ラベルに重さを表示するプログラムを作成します。


1.WiimoteLibの準備
Wiiリモコンと同じく、WiimoteLibの準備を行います。
2.フォームの作成
1.フォームにラベルを3つ、ボタンを2つ貼り付けてください。
ボタンのテキストはそれぞれ「接続」、「切断」とします。
また、ピクチャーボックスを1つ貼り付けてください。
ピクチャーボックスのサイズは400,240とします。



2.各ボタンをダブルクリックし、ボタンクリックイベントを登録します。
3.WiiFitデモプログラム
Forn1.csに以下の部分を追加する
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WiimoteLib;    //WimoteLibの宣言

namespace WiiFitTest
{
    public partial class Form1 : Form
    {
        Wiimote wm = new Wiimote();
        
        public Form1()
        {
            InitializeComponent();
            //他スレッドからのコントロール呼び出し許可
            Control.CheckForIllegalCrossThreadCalls = false;    
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Wiimoteの接続
            this.wm.Connect();

            //イベント関数の登録
            this.wm.WiimoteChanged += wm_WiimoteChanged;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.wm.Disconnect();//Wiiリモコンを切断
        }

        void wm_WiimoteChanged(object sender, WiimoteChangedEventArgs args)
        {
            //WiimoteStateの値を取得
            WiimoteState ws = args.WiimoteState;

            //ピクチャーボックスへ描画
            this.DrawForms(ws);
            
            //ラベル

            //重さ(Kg)表示
            this.label1.Text = ws.BalanceBoardState.WeightKg + "kg";
            //重心のX座標表示
            this.label2.Text = "X:" + 
                ws.BalanceBoardState.CenterOfGravity.X;
            //重心のY座標表示
            this.label3.Text = "Y:" + 
                ws.BalanceBoardState.CenterOfGravity.Y;
        }

        //フォーム描写関数
        public void DrawForms(WiimoteState ws)
        {
            //pictureBox1のグラフィックスを取得
            Graphics g = this.pictureBox1.CreateGraphics();
            g.Clear(Color.Black);     //画面を黒色にクリア

            //X、Y座標の計算
            float x = 
                (wm.WiimoteState.BalanceBoardState.CenterOfGravity.X 
                + 20.0f) * 10;    //表示位置(X座標)を求める
            float y = 
                (wm.WiimoteState.BalanceBoardState.CenterOfGravity.Y 
                + 12.0f) * 10;    //表示位置(Y座標)を求める

            //赤色でマーカを描写
            g.FillEllipse(Brushes.Red, x, y, 10, 10);

            g.Dispose();  //グラフィックスを開放
        }
    }
}

実行

1.WiiFitを接続してください。接続の方法はWiiリモコンと同じです。

2.F5キーを押して実行してください。
  ※もしエラーが発生する場合はWiiFitが正しく接続されているか確認してください。


3.接続ボタンを押し、WiiFitに乗ってください。
重心の位置が赤い点で表されます


4.終了する際は、切断を押しフォームを閉じてください。

解説

WiiFitの重心位置を赤色のマーカで表しています。

ws.BalanceBoardState.CenterOfGravity.X
重心のX座標を約-20.0f~20.0の幅で出力します。ピクチャボックスのサイズに合わせるため、20.0をプラスして10を掛けてます。
ws.BalanceBoardState.CenterOfGravity.Y
重心のX座標を約-12.0f~12.0の幅で出力します。ピクチャボックスのサイズに合わせるため、12.0をプラスして10を掛けてます。
ws.BalanceBoardState.WeightKg
WiiFitにかかる重さをキログラムで出力します。