Traer Physics: simulador de física de partículas
toxiclibs: el módulo vertletphysics es un simulador físico sencillo para 3D
PPhys2D: adaptación de Phys2D (alternativa de JBox2D)
PBox2D: conjunto de funciones de ayuda para JBox2D
Fisica: capa orientada objetos sobre JBox2D
Facilitar la creación de simulaciones físicas 2D en Processing
Permitir el uso más avanzado de JBox2D
import fisica.*; void setup() { size(400, 400); Fisica.init(this); }
import fisica.*; FWorld mundo; void setup() { size(400, 400); Fisica.init(this); mundo = new FWorld(); }
void draw() { mundo.step(); mundo.draw(); }
void setup() { // ... FBox b = new FBox(30, 50); b.setPosition(width/2, height/2); mundo.add(b); }
void setup() { // ... mundo.setEdges(); mundo.remove(mundo.top); }
mundo.setEdgesFriction(0)
mundo.setEdgesRestitution(1)
mundo.setGravity(0, -100)
mundo.setGrabbable(false)
mundo.getBody(200, 200)
mundo.getBodies(200, 200)
mundo.clear()
FBox b = new FBox(30, 50); b.setPosition(100, 100); mundo.add(b);
b.setWidth(40); b.setHeight(40);
FCircle c = new FCircle(30); c.setPosition(200, 100); mundo.add(c);
c.setSize(40);
FPoly p = new FPoly(); p.vertex(-30, -20); p.vertex( 30, -20); p.vertex( 30, 0); p.vertex( 10, 0); p.vertex( 10, 40); p.vertex(-10, 40); p.vertex(-10, 0); p.vertex(-30, 0); p.setPosition(300, 100); mundo.add(p);
FLine l = new FLine(-150, 0, 150, 0); l.setPosition(width/2, 250); mundo.add(l);
l.setStart(150, 0); l.setEnd(width-150, 0);
FBox m1 = new FBox(6, 60); FCircle m2 = new FCircle(20); m2.setPosition(0, -30); FCompound m = new FCompound(); m.addBody(m1); m.addBody(m2); m.setPosition(200, 300); mundo.add(m);
cuerpo.setPosition(100, 200)
cuerpo.setRotation(PI/4)
cuerpo.setVelocity(50, 0)
cuerpo.setAngularVelocity(PI/16)
cuerpo.setDensity(0.3)
cuerpo.setRestitution(0.3)
cuerpo.setFriction(0.3)
cuerpo.setDamping(0.3)
cuerpo.setAngularDamping(0.3)
cuerpo.setFill(100, 20, 130)
cuerpo.setStroke(100, 20, 130)
cuerpo.setFriction(0.3)
PImage imagen = loadImage("canica.png");
cuerpo.attachImage(imagen)
cuerpo.setStatic(true)
cuerpo.setRotatable(false)
cuerpo.setAllowSleeping(false)
cuerpo.setGrabbable(false)
cuerpo.setDrawable(false)
cuerpo.setSensor(true)
cuerpo.setName("agujero")
cuerpo.setGroupIndex(-1)
cuerpo.setCategoryBits(0x0002) // 0x0002 == 0000 0000 0000 0010
cuerpo.setFilterBits(0x0004) // 0x0004 == 0000 0000 0000 0100
cuerpo.addImpulse(100, 0)
cuerpo.addImpulse(100, 0, 0, 40)
cuerpo.addForce(100, 0)
cuerpo.addForce(100, 0, 0, 40)
cuerpo.addTorque(PI/6)
cuerpo.draw()
cuerpo.drawDebug()
FBox b1 = new FBox(70, 20); b1.setPosition(100, 100); mundo.add(b1); FBox b2 = new FBox(20, 50); b2.setPosition(300, 100); mundo.add(b2); FDistanceJoint muelle = new FDistanceJoint(b1, b2); mundo.add(muelle);
muelle.setAnchor1(30, 0)
muelle.setAnchor2(0, 40)
muelle.setFrequency(0.5)
muelle.setDamping(0.1)
muelle.setLength(60)
FBox b2 = new FBox(20, 50); b2.setPosition(300, 100); mundo.add(b2); FPrismaticJoint piston = new FPrismaticJoint(mundo.bottom, b2); mundo.add(piston);
piston.setAxis(1, 0)
piston.setEnableLimit(true)
piston.setLowerTranslation(-50)
piston.setUpperTranslation(150)
FBox b1 = new FBox(70, 20); b1.setPosition(100, 100); mundo.add(b1); FBox b2 = new FBox(20, 50); b2.setPosition(300, 100); mundo.add(b2); FRevoluteJoint eje = new FRevoluteJoint(b1, b2); mundo.add(eje);
eje.setAnchor(width/2, height/2)
eje.setEnableLimit(true)
eje.setLowerAngle(-PI/4)
eje.setUpperAngle(PI/4)
junta.setCollideConnected(false)
junta.getReactionForceX()
junta.getReactionForceY()
junta.getReactionTorque()
void contactStarted(FContact contacto) { // codigo a ejecutar }
void contactPersisted(FContact contacto) { // codigo a ejecutar }
void contactEnded(FContact contacto) { // codigo a ejecutar }
// Las variables... void setup() { // El setup... } void draw() { // El draw... } void contactStarted(FContact contacto) { println("Ha empezado una colisión"); }
contacto.getBody1()
contacto.getBody2()
contacto.contains("bola", "agujero") // se puede pedir por etiqueta
contacto.contains(cuerpo) // se puede pedir por variable
contacto.getX()
contacto.getY()
contacto.getNormalX()
contacto.getNormalY()
contacto.getVelocityX()
contacto.getVelocityY()
contacto.getSeparation()
cuerpo.getContacts()
cuerpo.isTouchingBody(otroCuerpo)
cuerpo.getTouching()
class Smiley extends FCircle { Smiley(float diam){ super(diam); } void draw(PGraphics gfx) { super.draw(gfx); float diam = getSize(); preDraw(gfx); gfx.ellipse(diam*0.2, -diam*0.2, diam*0.05, diam*0.05); gfx.ellipse(-diam*0.2, -diam*0.2, diam*0.05, diam*0.05); gfx.noFill(); gfx.arc(0, 0, diam*0.6, diam*0.6, 0, PI); postDraw(gfx); } }
FBlob b = new FBlob(); b.setAsCircle(100, 150, 50); mundo.add(b);
void createChain(float x1, float y1, float x2, float y2, int linkCount) { float len = dist(x1, y1, x2, y2); float linkLen = len/linkCount; ArrayList links = new ArrayList(); for (int i=0; i<linkCount; i++) { float x = map(i, 0, linkCount-1, x1, x2); float y = map(i, 0, linkCount-1, y1, y2); FBox b = new FBox(linkLen, 8); b.setPosition(x, y); mundo.add(b); links.add(b); } for (int i=0; i<links.size()-1; i++) { FBody p = (FBody)(links.get(i)); FBody n = (FBody)(links.get(i+1)); FRevoluteJoint rj = new FRevoluteJoint(p, n); rj.setDrawable(false); mundo.add(rj); } }
mundo.raycastOne()
resultado.getX()
resultado.getY()
resultado.getNormalX()
resultado.getNormalY()
FRaycastResult resultado = null; FBody b = mundo.raycastOne(width/2, height/2, mouseX, mouseY, resultado, true); if (resultado != null) { println("El rayo intersecciona en: " + resultado.getX() + ", " + resultado.getY()); }
Para todo lo que Fisica no puede hacer
org.jbox2d.dynamics.Body
cuerpo.getBox2dBody()
org.jbox2d.dynamics.joints.Joint
junta.getBox2dJoint()
org.jbox2d.dynamics.World
mundo // hereda de JBox2D World