ProcessingでGenerative art #58
Box2dの練習。
Code
import shiffman.box2d.*;
import org.jbox2d.collision.shapes.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.*;
ArrayList<Box> boxes;
ArrayList<Boundary> boundaries;
Box2DProcessing box2d;
void setup() {
size(800, 800);
pixelDensity(2);
smooth();
colorMode(HSB, 360, 100, 100);
rectMode(CENTER);
blendMode(ADD);
boxes = new ArrayList<Box>();
boundaries = new ArrayList<Boundary>();
box2d = new Box2DProcessing(this);
box2d.createWorld();
box2d.setGravity(0, -10);
boundaries.add(new Boundary(width/2, height, width, 1));
boundaries.add(new Boundary(0, height/2, 1, height));
boundaries.add(new Boundary(width, height/2, 1, height));
background(0);
}
void draw() {
box2d.step();
if (mousePressed) {
Box p = new Box(mouseX, mouseY);
boxes.add(p);
}
for (Box b : boxes) {
b.display();
}
}
void keyPressed() {
if (key == 's')saveFrame("####.png");
if (key == ' ')background(0);
}
//----------------------------------------------------------------------
class Box {
Body body;
float radius;
color fillcol;
Box(float x, float y) {
radius = random(30, 100);
if (random(1)>0.5) {
fillcol = color(360, 90, 90, 50);
} else {
fillcol = color(211, 90, 90, 50);
}
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
bd.position.set(box2d.coordPixelsToWorld(x, y));
body = box2d.createBody(bd);
CircleShape cs = new CircleShape();
cs.m_radius = box2d.scalarPixelsToWorld(radius);
FixtureDef fd = new FixtureDef();
fd.shape = cs;
fd.density = 1;
fd.friction = 1;
fd.restitution = 0.0;
body.createFixture(fd);
}
void killBody() {
box2d.destroyBody(body);
}
boolean done() {
Vec2 pos = box2d.getBodyPixelCoord(body);
if (pos.y > height+radius*2) {
killBody();
return true;
}
return false;
}
void display() {
Vec2 pos = box2d.getBodyPixelCoord(body);
float a = body.getAngle();
pushMatrix();
translate(pos.x, pos.y);
rotate(-a);
noFill();
strokeWeight(0.5);
stroke(fillcol);
ellipse(0, 0, radius*2, radius*2);
popMatrix();
}
}
//---------------------------------------------------------------------
class Boundary {
float x, y;
float w, h;
Body b;
Boundary(float x_, float y_, float w_, float h_) {
x = x_;
y = y_;
w = w_;
h = h_;
BodyDef bd = new BodyDef();
bd.type = BodyType.STATIC;
bd.position.set(box2d.coordPixelsToWorld(x, y));
b = box2d.createBody(bd);
float box2dW = box2d.scalarPixelsToWorld(w/2);
float box2dH = box2d.scalarPixelsToWorld(h/2);
PolygonShape ps = new PolygonShape();
ps.setAsBox(box2dW, box2dH);
b.createFixture(ps, 1);
}
}
参考:『Nature of Code -Processingではじめる自然現象のシミュレーション』
Happy coding!
応援してくださる方!いつでもサポート受け付けてます!