Domanda

sto imparando a usare Processing , e hanno modificato uno degli esempi per creare questa applet . Ho due domande:

  1. Perché le sfere Oblati? Le sfere nell'esempio ho cribbed dal erano belle e rotonde.
  2. Perché ricevo la proiezione luce sui bordi esterni delle sfere, quando la sorgente punto si trova tra di loro?

Ecco la fonte per questo piccolo programma:

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();
  }
}
È stato utile?

Soluzione

La funzione liscia non funziona bene in questo caso perché hai adiacenti poligoni. E 'un po' difficile da seguire senza un quadro, ma pensare a un pixel che si trova sul confine tra due poligoni. Per l'esempio, diciamo che lo sfondo è (0,0,0) ed i poligoni sono (255,255,255). Il primo poligono disegna e colpisce quel pixel. Copre metà, quindi calcola 0.5 * (0,0,0) + 0.5 * (255,255,255) e salva (126.126.126) come nuovo valore per quel pixel. Il secondo poligono disegna. Esso copre anche mezzo del pixel quindi calcola 0.5 * (126.126.126) + 0.5 * (255,255,255) e salva (190.190.190). Questo non è corretto perché i due poligoni dovrebbero avere ogni coperti mezzo diverso e portato in un colore (255,255,255). Ma non si può capire che se si disegna ogni poligono individualmente e non si salva alcuna informazione di copertura in mezzo.

Le moderne schede grafiche supportano qualcosa chiamato multisample antialias . Ciò consente di risparmiare un po 'di informazioni su quale parte del pixel del primo poligono coperto. Processing sta cercando di simulare questo senza il supporto hardware, in modo che utilizza un trucco che funziona abbastanza bene quando non si dispone di primitivi adiacenti, ma cade a pezzi quando lo fai.

Per quanto riguarda lo schiacciamento. Per impostazione predefinita, la lavorazione dei riempie l'intera finestra, e il formato non è quadrata. Il modo più semplice per affrontare questo è quello di utilizzare la funzione di orto per rendere il rapporto di aspetto della piazza fotocamera. Prova ad aggiungere questo per la configurazione:

  

orto (-360.360, -180.180, -10,10);

Altri suggerimenti

A proposito di belle bordi arrotondati, provare a chiamare il metodo liscio () nel setup ():

void setup() {
  // ...
  smooth();
  // ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top