3D mit Processing


Wiederholung


Die erste 3D-Seite dient einer sehr kanppen Wiederholung des Stoffes im Lehrbuch. Denken Sie daran, dass man die Animationen nur sehen kann, wenn man JavaScript im Browser zugelassen hat.

Dass wir räumliche Eindrücke auf einer Ebene verwirklichen können,verdanken wir der Zentralperspektive. Vor ca. 600 Jahren entwickelte Filippo Brunnelleschi diese Technik, die wenig später von Albrecht Dürer weiterentwickelt wurde. Will man den Computer "3-dimensionaler" Bilder zeichnen lassen, benötigt man einen Renderer, der in Processing P3D heißt. Welche Möglichkeiten man damit hat, ist im Lehrbuch ausführlich dargestellt. Einige grundliegenden Begriffe sollen aber nochmal erwähnt werden. Wir beschränken uns hier zunächst auf einige Kommentare zu "Formen" und zu "Licht". Im folgenden Beispiel sind die Form "box" und einige Lichtoperationen verwendet. Der Würfel ist von oben (blau) per directionalLight beleuchtet. Damit die Scene nicht in schwarz getaucht ist, wird auch ein graues ambientLight verwendet. Wenn man mit der Maustaste auf das Bild klickt, kommt eine Beleutung (rot) von vorn hinzu.


Hier der zugehörige Code:
void draw(){
  background(0);
  ambientLight(64,64,64);//Umgebungslicht grau
  directionalLight(0,0,255, 0, 1, 0); // Licht von oben
  if(mousePressed){
    directionalLight(255,0,0, 0, 0, -1); // Licht von vorn
  }
  noStroke();
pushMatrix() ;
  translate(width * 0.5, height * 0.5, -width * 0.25);
   ambient(128,128,255);// Farbe des Umgebungslichtes
   winkel= winkel + 0.01;
   rotateY(winkel);
  rotateZ(winkel);
   box(300);
  sphere(8);
popMatrix();
}


Bild1
Bild2
Die Formen "box" und "sphere" reichen natürlich bei weitem nicht aus, beliebige 3D-Figuren darzustellen. Man arbeitet sowohl im zwei- wie im dreidimensionalen mit PShape. Die darzustellende Figuren werden mit Drei- oder Vierecken "gepflastert" (trianguliert bzw. quadranguliert) und es entsteht ein sogenanntes Mesh.
(Siehe Bild oben: Kugel quadranguliert, Torus trianguliert). Nachfolgend der sehr einfache Programmcode. Man kann die Gitterpunkte auf der Kugel bzw. dem Torus bei gegebenem Radius/Radien in Abhängigkeit von zwei Winkeln berechnen und in pg.vertex() speichern. Je kleiner die Winkelschritte, desto feiner das Netz. TRIANGLE_STRIP bzw. QUAD_STRIP bewirken, dass die nächsten beiden Punkte an das Netz angehängt werden.

for (int iy = 0; iy < anzahlY+1; iy++) {
   pg.beginShape(TRIANGLE_STRIP);
   for (int ix = 0; ix < anzahlX+1; ix++) {
      quadsFaerben(ix,iy);
     pg.vertex( punkte[ix][iy].x , punkte[ix][iy].y , punkte[ix][iy].z );
     pg.vertex(punkte[ix][iy+1].x , punkte[ix][iy+1].y , punkte[ix][iy+1].z );
   }
   pg.endShape();
}
Derartige Meshes kann man mit obj-Dateien in den Sketch laden bzw. aus dem Sketch exportieren. Je feiner die "Maschen" des Netzes sind, desto realistischer sieht das Objekt aus.
Auf der Seite Scan the world kann man kostenlos derartige obj-Dateien runterladen. Sind sie in den Sketch geladen, dann lassen sie sich, im Gegensatz zum Bild unten, mit der Maus im Raum drehen und bewegen.

Im unten runterzuladenden Sketch Figuren3D müssen Sie nur noch den Namen der obj-Datei anpassen.
Hier zur Erinnerung nochmals den Code zum Einlesen der obj-Datei:
boolean readLine(BufferedReader input) {
   String line;;

   // versuche eine Zeile aus der Datei zu lesen
   try {
      line = input.readLine();
   } catch (IOException e) { line = null; }
   // bei Fehler gebe false zurück (und springe raus)

   if (line == null) return false;

   // wenn eine Kommentarzeile oder leere Zeile, lese die nächste Zeile
   if (((line.length()>0) && (line.charAt(0)=='#')) || (line.length()==0))
      return readLine(input);

   token = split(trim(line)," ");
   return true;
}
Sketch Box-Licht

Sketch 3D-Figuren

Menu