見出し画像

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!

応援してくださる方!いつでもサポート受け付けてます!