Codificando mundos

Taller de comportamientos físicos en la programación creativa
Barcelona, Noviembre 23-24, 2012

Ricard Marxer

ZZZINC logo

(Press space or enter to navigate to the next slide, left arrow to go backwards.)

Introducción

Librerías fisicas para Processing

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

Motivación


Facilitar la creación de simulaciones físicas 2D en Processing


Permitir el uso más avanzado de JBox2D

QuickStart

Inicialización


import fisica.*;

void setup() {
  size(400, 400);
  
  Fisica.init(this);
}

Creación del mundo


import fisica.*;

FWorld mundo;

void setup() {
  size(400, 400);
  
  Fisica.init(this);
  mundo = new FWorld();
}

Ejecución y dibujado del mundo


void draw() {
  mundo.step();
  mundo.draw();
}

El primer cuerpo


void setup() {
  // ...
  FBox b = new FBox(30, 50);
  b.setPosition(width/2, height/2);
  mundo.add(b);
}

Añadiendo bordes al mundo


void setup() {
  // ...
  
  mundo.setEdges();
  mundo.remove(mundo.top);
}

El mundo

Propiedades y Acciones

Los cuerpos

FBox - La caja


FBox b = new FBox(30, 50);
b.setPosition(100, 100);
mundo.add(b);

b.setWidth(40);
b.setHeight(40);

FCircle - El círculo


FCircle c = new FCircle(30);
c.setPosition(200, 100);
mundo.add(c);

c.setSize(40);

FPoly - El polígono


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 - La línea


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);

FCompound - El compuesto


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);

Propiedades comunes de los cuerpos

Propiedades de la Dinámica

Propiedades Materiales

Propiedades De Estilo (Dibujado)

Otras Propiedades - I

Otras Propiedades - II

Acciones sobre los Cuerpos

Las juntas

FDistanceJoint - El muelle


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);

FDistanceJoint - El muelle - Propiedades

FPrismaticJoint - El pistón


FBox b2 = new FBox(20, 50);
b2.setPosition(300, 100);
mundo.add(b2);
FPrismaticJoint piston = new FPrismaticJoint(mundo.bottom, b2);
mundo.add(piston);

FPrismaticJoint - El pistón - Propiedades

FRevoluteJoint - El eje


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);

FRevoluteJoint - El eje - Propiedades

Propiedades comunes de las juntas

Propiedades de la Dinámica

Los contactos

Los Contactos son Eventos


// Las variables...

void setup() {
   // El setup...
}

void draw() {
   // El draw...
}

void contactStarted(FContact contacto) {
   println("Ha empezado una colisión");
}

No Todo Vale en los Contactos

Las Propiedades de los Contactos

Otra Forma de Acceso a los Contactos

Gracias

Temas Avanzados

Cuerpos Customizados

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 - Las Burbuja

FBlob b = new FBlob();
b.setAsCircle(100, 150, 50);
mundo.add(b);

Cadenas

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);
  }
}

Raycasts

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());
}

JBox2D

Para todo lo que Fisica no puede hacer