Mac OS X で Wiiリモコン

使用方法

WiiリモコンBluetoothで通信しているので、WiiリモコンMacのマウスの替わりにしてみました。


http://blog.hiroaki.jp/2006/12/000433.html


からソフトウェアがダウンロード出来ます。


motionをキャプチャ(加速度センサ?)してマウスポインタを操作するのですが、これが結構難しい;
キーのマッピングも出来ます。

proce55ingとのコラボレーションを考える

インタラクティブな操作を与えるWiiリモコン
インタラクティブなプログラミングをサポートするProcessing。
やっぱり、この2つのコラボを考えずにはいられない!


とはいえ、processingからマウス操作によるイベントはごく普通に書けるので問題ありません。



これは、マウスのクリックされた位置にボールを出現させ、自由落下させるプログラムの実行画面です。
バウンドのうまい止め方がわからなかったので、一定時間後にボールはフェードアウトするようにしてあります。


Wiiリモコンで操作すると一気にインタラクティブ感がアップした気がします。
Bボタンでボール出現(左クリック)、Aボタンで終了(Esc)というふうにマッピングしてみました。

ソースコード

float g = 0.98;        // gravity
float damping = 0.6;   // damping rate

Ball[] balls = new Ball[256];
int ballCount;

void setup()
{
  size(800, 600);
  colorMode(HSB, 100);
  background(99);
  frameRate(30);
  
  ballCount = 0;
}

void draw()
{
  fadeToWhite();
  
  if (ballCount > 0)
    for (int i=0; i<ballCount; i++) balls[i].update();
}

void mousePressed()
{
  balls[ballCount] = new Ball();
  ballCount += 1;
}

public class Ball
{
  float x, y;
  float dy;
  float r;
  color ballColor;
  float timeStep;
  
  // constructor
  Ball()
  {
    x = mouseX;
    y = mouseY;
    dy = 0;
    r = random(10, 50);
    ballColor = color(random(100), 60, 99, random(50, 100));
    timeStep = 0;
  }
  
  // update ball coordinate
  public void update()
  {
    timeStep += 0.08;
    dy += g * timeStep;
    y += dy;
    
    this.bound();
    
    if (timeStep < 6.5)
    {
      noStroke();
      fill(ballColor);
      ellipse(x, y, 2 * r, 2 * r);
    }
  }
  
  // check if bound
  private void bound()
  {
    float ground = height - r;
    
    if (y > ground)
    {
      dy = - dy * damping;
      y = ground - (y - ground);
    }
    
    if (abs(dy) < 1) dy = 0;
  }
}

void fadeToWhite()
{
  noStroke();
  fill(99, 50);
  rectMode(CORNER);
  rect(0, 0, width, height);
}


簡単ではありますが、このようなプログラムはクラスベースのほうが理解しやすい気がします。

追記:
ソースコードの一部余計な記述を削除しました。