Pixel

setzer

.de
Aktuellste Kommentare:
  • Stefan schrieb:
    Schöner Beitrag und nützliche Links, vielen Dank dafür!...
    [lesen]
  • Pixelsetzer schrieb:
    Hi Marius, danke für den Hinweis. Ich hab das gar nicht gesehen, dass die Zeichen unformatiert wurden. Ich habe es gleich mal geändert. ;-) Wegen...
    [lesen]
  • Marius Gerum schrieb:
    Sehr schön, gefällt mir gut :-) OOP ftw ;-) Marius...
    [lesen]
  • Marius Gerum schrieb:
    upps, im letzten Kommentar ... wusste nicht dass HTML funzt, ich meinte > und < ^^...
    [lesen]
  • Marius Gerum schrieb:
    Hi, schöner Artikel und gut strukturierter Code. 2 Dinge würden mir an dieser Stelle vielleicht noch fehlen, und zwar das fertige Applet zum sofo...
    [lesen]

Processing, Klassen und Objekte – Ein kleines Beispiel

Auch in Processing ist es möglich mit Objekten zu arbeiten. Dies hat nicht nur den Vorteil, dass alles ein wenig übersichtlicher wird, sondern auch, dass man Objekte viel leichter positionieren kann.
(Dieser Artikel ist eine Art Fortsetzung zum Artikel: Einfache 3D Programmierung mit Processing )

So lässt sich zwar zum Beispiel ein Würfel schnell mit dem Befehl “box()” erstellen. Doch wenn man zwei Würfel haben möchte, diese unterschiedlich drehen und bewegen möchte, wird es schnell unübersichtlich und anstrengend die Matrix-Ebenen zu wechseln.
Abhilfe schafft hier eine Klasse, die den Würfel mit speziellen Methoden darstellt, verschiebt, dreht oder einfärbt.

Ich habe als Beispiel eine einfache Klasse geschrieben, mit der es möglich ist ein Dreidimensionalen Würfel zu erstellen und ihn zu bewegen. Natürlich werden in der Klasse selbst wieder die bekannten Processing-Funktionen, wie “box()”, “pushMatrix()”, “popMatrix()”, “translate()” und/oder “rotate()” verwendet.
Jede Klasse sollte der Übersicht wegen in ein eigenen Tab geschrieben werden.

class MyBox {
  private int posX, posY, posZ;
  private int dimX, dimY, dimZ;
  private float sizeX, sizeY, sizeZ;
  private float winkelX, winkelY, winkelZ;
 
  private int rot, gruen, blau, trans;
 
  // Konstruktor
  MyBox(int posX, int posY, int posZ, int dimX, int dimY, int dimZ) {
    this.posX = posX;
    this.posY = posY;
    this.posZ = posZ;
 
    this.winkelX = 0;
    this.winkelY = 0;
    this.winkelZ = 0;
 
    this.dimX = 100;
    this.dimY = 100;
    this.dimZ = 100;
 
    this.sizeX = 1;
    this.sizeY = 1;
    this.sizeZ = 1;
 
    this.rot = 255;
    this.gruen = 255;
    this.blau = 255;
    this.trans = 255;
  } 
 
  /**
    * Bewegungs-Funktion
    */
  void moveX(int pos) {
    this.posX = this.posX + pos;
  }
 
  void moveY(int pos) {
    this.posY = this.posY + pos;
  }
 
  void moveZ(int pos) {
    this.posZ = this.posZ + pos;
  }
 
  void turnX(float winkel) {
    this.winkelX = this.winkelX + radians(winkel);
  }
 
  void turnY(float winkel) {
    this.winkelY = this.winkelY + radians(winkel);
  }
 
  void turnZ(float winkel) {
    this.winkelZ = this.winkelZ + radians(winkel);
  } 
 
  /**
    * Darstellung
    */
  void setColor(int rot, int gruen, int blau, int trans) {
    this.rot = rot;
    this.gruen = gruen;
    this.blau = blau;
    this.trans = trans;
  }
 
  void setSize(float sizeX, float sizeY, float sizeZ) {
    this.sizeX = sizeX;
    this.sizeY = sizeY;
    this.sizeZ = sizeZ;
  }
 
  /**
    * Gets
    */
  int getPosX() {
    return this.posX;
  }  
 
  int getPosY() {
    return this.posY;
  }
 
  int getDimX() {
    return this.dimX;
  }
 
  int getDimY() {
    return this.dimY;
  }
 
  /**
    *
    */
 
  void show() {
    fill(rot, gruen, blau, trans);
    pushMatrix();
     translate(posX, posY, posZ);
     pushMatrix();
      rotateX(winkelX);
      rotateY(winkelY);
      rotateZ(winkelZ);
      scale(sizeX, sizeY, sizeZ);
      box(dimX, dimY, dimZ);
     popMatrix();
    popMatrix();
  }
 
}

In der ersten Zeile wird die Klasse benannt.
In der Klasse werden die Attribute definiert und sollte “private” sein, damit nur mit den Methoden der Klasse, auf die Klassen-Attribute zugegriffen werden kann.
Der Konstruktor wird bei der Erzeugung des Objektes aufgerufen und füllt die Attribute entweder mit Standardwerten oder mit Werten, die bei der Erzeugung mitgegeben wurden.
In diesem Beispiel muss die Position (posX, posY und posZ) sowie die Größe (dimX, dimY, dimZ) bei der Erzeugung mit angegeben werden. Die anderen Attribute erhalten erst mal Standardwerte.

Anschließend werden einige Methoden definiert.
Das Schlüsselword “this.” vor einer Variable kennzeichnet, dass es sich um Klassen interne Attribute handelt.

Die letzte Methode mit dem Namen “show()” stellt den Würfel dar, verschiebt, dreht und färbt ihn ein.

Das Hauptprogramm

Das Hauptprogramm ist sehr kurz und sollte größtenteils selbsterklärend sein:

MyBox klotz;
 
void setup() {
  size(500, 500, P3D);
  frameRate(24);
  background(255);
  lights();
 
  klotz = new MyBox(width/2, height/2, 0, 50, 50, 50);
 
}
 
void draw() {
  background(0);
  lights();
  noStroke();
 
  klotz.setColor(200, 255, 250, 255); 
 
  klotz.turnY(2);
  klotz.show();
}

“MyBox klotz;” muss außerhalb von “setup()” stehen, damit es anschließend in “draw()”-Teil weiterverwendet werden kann.

Die Methoden unserer Klasse “MyBox”, können mit dem Namen des Objekts, in unserem Beispiel “klotz”, einem anschließenden Punkt sowie den Methoden Name selbst, verwendet werden.

  • Marius Gerum schrieb:
    Sehr schön, gefällt mir gut freuen.png OOP ftw zwinkern.png Marius
    30. Juni 2011, 00:08  

Kommentar schreiben:

Mit der Eingabe des Sicherheits-Codes stimmen Sie der Speicherung ihrer IP-Adresse und ihrer anderen angegebenen Daten zu.
Die IP-Adresse und ihre E-Mail wird nur für die Spam-Abwehr benötigt.