Bonjour,
Je découvre box2d et les différent wrapper processing qui existe pour celui ci.
Alors que je faisais un test faisant évoluer la gravité, je me suis rendu compte que une fois les objets immobiles, ils se retrouvent collés a la paroi, sans possiblité de les décoller...
Est ce que quelqu'un a déja eu se soucis ?
code principal :
import pbox2d.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.joints.*;
import org.jbox2d.collision.shapes.*;
import org.jbox2d.collision.shapes.Shape;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.*;
import org.jbox2d.dynamics.contacts.*;
ArrayList<Box> boxes;
PBox2D box2d;
Boundary bord1;
Boundary bord2;
Boundary bord3;
Boundary bord4;
Box b1;
Box b2;
Box b3;
void setup() {
size(400, 300);
smooth();
// Create ArrayLists
boxes = new ArrayList<Box>();
box2d = new PBox2D(this);
box2d.createWorld();
bord1 = new Boundary(width/2, height-10, width, 10);
bord2 = new Boundary(width/2, 0, width, 10);
bord3 = new Boundary(0, height/2, 10, height);
bord4 = new Boundary(width, height/2, 10, height);
// We are setting a custom gravity
box2d.setGravity(0, -20);
b1 = new Box(100, 50, 1);
b2 = new Box(200, 50, 50);
b3 = new Box(300, 50, 100);
}
void draw() {
background(255);
box2d.step();
bord1.display();
bord2.display();
bord3.display();
// When the mouse is clicked, add a new Box object
b1.display();
b2.display();
b3.display();
if (mousePressed) {
box2d.setGravity(0, map(mouseY, 0, height, 50, -50));
}
/* if (mousePressed) {
Box p = new Box(mouseX,mouseY);
boxes.add(p);
}
// Display all the boxes
for (Box b: boxes) {
b.display();
}*/
}Classe Box
// A rectangular box
class Box {
// We need to keep track of a Body and a width and height
Body body;
float w;
float h;
Box(float x, float y,float poids) {
w = random(4,16);
h = random(4,16);
// Define a polygon (this is what we use for a rectangle)
PolygonDef sd = new PolygonDef();
float box2dW = box2d.scalarPixelsToWorld(w/2);
float box2dH = box2d.scalarPixelsToWorld(h/2);
sd.setAsBox(box2dW, box2dH);
// Parameters that affect physics
sd.density = poids;
sd.friction = 0.3;
sd.restitution = 0.5;
// Define the body and make it from the shape
BodyDef bd = new BodyDef();
Vec2 center = new Vec2(x,y);
bd.position.set(box2d.coordPixelsToWorld(center));
body = box2d.createBody(bd);
body.createShape(sd);
body.setMassFromShapes();
// Give it some initial random velocity
body.setLinearVelocity(new Vec2(random(-5,5),random(2,5)));
body.setAngularVelocity(random(-5,5));
}
void display() {
// We look at each body and get its screen position
Vec2 pos = box2d.getBodyPixelCoord(body);
// Get its angle of rotation
float a = body.getAngle();
rectMode(CENTER);
pushMatrix();
translate(pos.x,pos.y);
rotate(-a);
fill(175);
stroke(0);
rect(0,0,w,h);
popMatrix();
}
}Classe Boundaries
// The Nature of Code
// <http://www.shiffman.net/teaching/nature>
// Spring 2010
// PBox2D example
// A fixed boundary class
class Boundary {
// A boundary is a simple rectangle with x,y,width,and height
float x;
float y;
float w;
float h;
// But we also have to make a body for box2d to know about it
Body b;
Boundary(float x_,float y_, float w_, float h_) {
x = x_;
y = y_;
w = w_;
h = h_;
// Figure out the box2d coordinates
float box2dW = box2d.scalarPixelsToWorld(w/2);
float box2dH = box2d.scalarPixelsToWorld(h/2);
Vec2 center = new Vec2(x,y);
// Define the polygon
PolygonDef sd = new PolygonDef();
sd.setAsBox(box2dW, box2dH);
sd.density = 0; // No density means it won't move!
sd.friction = 0.1;
// Create the body
BodyDef bd = new BodyDef();
bd.position.set(box2d.coordPixelsToWorld(center));
b = box2d.createBody(bd);
b.createShape(sd);
}
// Draw the boundary, if it were at an angle we'd have to do something fancier
void display() {
fill(0);
stroke(0);
rectMode(CENTER);
rect(x,y,w,h);
}
}Hors ligne
Salut, je viens d'essayer ton code. J'ai l'impression que ce phénomène est du aux valeurs physiques attribuées aux objets. Par exemple, regarde ce que ça fait quand tu passes la valeur de sd.friction à 0 dans la classe Boundary, les objets continuent à bouger!
Hors ligne
Oui j'avais vu cela aussi, mais d'une manière pas très réelle.
J'ai testé BoxWrap2d, et elle marche beaucoup mieux, et simple plus simple que le wrapper de shiffman.
Mais je pense que le top serait de directement utiliser jbox2d, malheureusement, je ne le trouve pas déja compiler...
A suivre
Hors ligne