Processingで物理

http://www.cs.princeton.edu/~traer/physics/
Processingには様々な外部ライブラリが存在します。BETAのころは標準で搭載されていなかったminimを追加したりしました。メジャーバージョンになってminimも標準ライブラリとなっていたり。
さて、今回追加するライブラリは物理関連のライブラリです。こいつを導入してやれば、いろいろできる・・・はず。

ダウンロード

上のサイトの左上のあたりのDOWNLOADからphysics.zipをダウンロードします。ダウンロードしたら、zipファイルを解凍します。

Processingの外部ライブラリ追加方法

Processingの外部ライブラリ追加方法はいくつかあります。しかし、私がいつも用いているのは、Processingのメインのフォルダにあるlibrariesに追加する方法です。例えば、今回の場合解凍されたフォルダにはphysics.jarというJavaの実行型ファイルが入っています。これが外部ライブラリなのですが、これを直接librariesに放り込むだけじゃだめです。physicsというフォルダを作り、その中にlibraryというフォルダを作り、その中にphysics.jarを入れておきます。
まぁ、physicsは作者が親切で解凍したらそれをlibrariesに放り込むだけでいいんですけどね。
あ、libというまぎらわしいフォルダがあるので注意。

Processingの外部ライブラリ読み込み

import〜と書き始めても問題はないのですが、面倒です。上部メニューからSketch→Import Libraryを選択します。すると、追加できるライブラリの一覧が表示されるので、選択すればimport〜を追加してくれます。今回はphysicsを選択します。

デモ

作者サイトを参考にしながらデモを作成。

import traer.physics.*;

ParticleSystem ph;
Particle p;
Particle a;
Spring s;

void setup() {
  size(400, 400);
  smooth();
  fill(0);
  frameRate(30);
  ellipseMode(CENTER);
  ph = new ParticleSystem(5.0, 0.1);
  p = ph.makeParticle(1.0, width/2, height/2, 0);
  a = ph.makeParticle(1.0, width/2, height/2, 0);
  a.makeFixed();
  s = ph.makeSpring(p, a, 1.0, 0.1, 100);
}

void draw() {
  if(!mousePressed) ph.advanceTime(1.0);
  else {
    p.moveTo(mouseX, mouseY, 0);
    p.setVelocity((mouseX-pmouseX), (mouseY-pmouseY), 0);
  }
  background(255);
  line(p.position().x(), p.position().y(), a.position().x(), a.position().y());
  ellipse(a.position().x(), a.position().y(), 5, 5);
  ellipse(p.position().x(), p.position().y(), 20, 20);
}

おー、最初のデモっぽいのができた!