Frage

Ich lerne Verarbeitung zu verwenden, und haben eines der Beispiele geändert erstellen dieses Applet . Ich habe zwei Fragen:

  1. Warum sind die Sphären Oblate? Die Kugeln in dem Beispiel, das ich aus cribbed waren schön und rund.
  2. Warum erhalte ich das Licht zeigt an den Außenkanten der Kugeln, wenn die Punktquelle zwischen ihnen ist?

Hier ist die Quelle für dieses kleine Programm:

int radius = 40;
int spheredist = 320;
int maxlevel = 7;
float ecc = 0.28;
int x1, x2, y1, y2;

void setup() {
  size(640, 360, P3D);
  fill(204);
  //smooth();  // makes spheres ugly
  translate(width/2, height/2, 0);
  x1 = -spheredist/2+radius;
  x2 = spheredist/2-radius;
  y1 =
  y2 = 0;
}

void drawLightning(int x1_,int y1_,int x2_,int y2_,int lvl){
   if (lvl < maxlevel){
     int midx = (x1_ + x2_)/2;
     int midy = (y1_ + y2_)/2;
     float d = dist(x1_, y1_, x2_, y2_);
     d *= ecc;
     midx += random(-d, d);
     midy += random(-d, d);
     drawLightning(x1_, y1_, midx, midy, lvl+1);
     drawLightning(midx, midy, x2_, y2_, lvl+1);
   } else {
     strokeWeight(10);
     stroke(60,100,255,100);
     line(x1_,y1_,x2_,y2_);
     strokeWeight(1);
     stroke(255);
     line(x1_,y1_,x2_,y2_);
   }
}

void draw() {
  background(0); 
  noStroke(); 
  int brt = 200;
  pointLight(brt/2, brt/2, brt/2, spheredist/2, -spheredist, spheredist); 
  ambientLight(brt/8,brt/8,brt/8);


  if ((mouseX > width/4 && mouseX < width*3/4) &&
      (mouseY > height/2-radius && mouseY < height/2+radius)) {
    pushMatrix();
    translate(width/2, height/2, 0);
    pointLight(100, 100, 255, 0, 0, 0); 
    popMatrix();
  }

  pushMatrix();
  translate(width/2 - spheredist/2, height/2, 0); 
  sphere(radius); 
  translate(spheredist, 0, 0); 
  sphere(radius); 
  popMatrix();

  if ((mouseX > width/4 && mouseX < width*3/4) &&
      (mouseY > height/2-radius && mouseY < height/2+radius)) {
    pushMatrix();
    translate(width/2, height/2, 0);  
    drawLightning(x1,y1,x2,y2,0);
    popMatrix();
  }
}
War es hilfreich?

Lösung

Die glatte Funktion funktioniert nicht gut in diesem Fall, weil Sie Polygone Anstoßen haben. Es ist ein wenig schwierig, ohne ein Bild zu folgen, aber denken Sie an ein Pixel, das zwischen zwei Polygone auf dem Rand ist. Für das Beispiel, sagen wir mal, dass der Hintergrund ist (0,0,0) und die Polygone (255,255,255). Das erste Polygon Unentschieden und trifft das Pixel. Es deckt die Hälfte davon, so dass er 0,5 * berechnet (0,0,0) + 0.5 * (255,255,255) und speichert (126.126.126) als den neuen Wert für dieses Pixel. Das zweite Polygon zeichnet. Es umfasst auch die Hälfte der Pixel, so dass es 0,5 * berechnet (126.126.126) + 0,5 * (255,255,255) und speichert (190.190.190). Dies ist nicht korrekt, da die beiden Polygone sollten jeweils eine andere Hälfte bedeckt haben und in einer Farbe (255,255,255) geführt. Aber man kann nicht verstehen, dass, wenn Sie jedes Polygon zeichnen einzeln und nicht speichern Sie alle Coverage-Informationen zwischendurch.

Moderne Grafikkarten-Unterstützung etwas namens Multisample- Anti-Aliasing . Das spart einige Informationen darüber, welchen Teil des Pixels das erste Polygon bedeckt. Die Verarbeitung wird versucht, dies ohne die Hardware-Unterstützung zu simulieren, so dass es einen Trick verwendet, die ziemlich gut funktioniert, wenn Sie nicht über Stoß Primitiven, sondern fällt auseinander, wenn Sie tun.

Wie für die Abplattung. Standardmäßig füllt Verarbeitung das gesamte Fenster, und Ihre Größe ist nicht quadratisch. Der einfachste Weg, um damit umzugehen ist, die ortho-Funktion zu verwenden, um das Seitenverhältnis der Kamera Platz zu machen. Versuchen Sie, diese zu Ihrem Setup:

  

ortho (-360.360, -180180, -10,10);

Andere Tipps

über die schönen runden Kanten, versucht das Verfahren glatt Aufruf () in der Einrichtung ():

void setup() {
  // ...
  smooth();
  // ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top