Pregunta

Estoy aprendiendo a usar Procesamiento , y han modificado uno de los ejemplos para crear este applet . Tengo dos preguntas:

  1. ¿Por qué se OBLATO las esferas? Las esferas en el ejemplo I de biselado de eran agradables y redondo.
  2. ¿Por qué aparece la proyección de luz en los bordes exteriores de las esferas, cuando la fuente precisada entre ellos?

Aquí es la fuente de este pequeño programa:

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();
  }
}
¿Fue útil?

Solución

La función suave no funciona bien en este caso porque tienes a tope polígonos. Es un poco difícil de seguir sin una imagen, pero piensa en un píxel que se encuentra en el borde entre dos polígonos. Para el ejemplo, digamos que el fondo es (0,0,0) y los polígonos son (255,255,255). El primer polígono dibuja y golpea ese píxel. Se cubre la mitad de la misma, por lo que calcula 0,5 * (0,0,0) + 0,5 * (255 255 255) y la guarda (126,126,126) como el nuevo valor para ese pixel. El segundo polígono dibuja. También cubre media del píxel por lo que calcula 0,5 * (126,126,126) + 0,5 * (255 255 255) y la guarda (190,190,190). Esto no es correcto, porque los dos polígonos deben tener cada una cubierta un medio diferente y resultó en un color de (255,255,255). Pero no se puede darse cuenta de eso si se dibuja cada polígono individual y no guarda ninguna información de cobertura en el medio.

Las tarjetas gráficas modernas soportan algo llamado multisample antialiasing . Esto guarda alguna información sobre qué parte del píxel del primer polígono cubierto. Procesamiento está tratando de simular esto sin el soporte de hardware, por lo que utiliza un truco que funciona bastante bien cuando no tiene primitivas a tope, pero se desmorona cuando lo hace.

En cuanto al achatamiento. Por defecto, producción llena toda la ventana, y su tamaño no es cuadrada. La manera más fácil de hacer frente a esto es utilizar la función orto para que la relación de aspecto de su cuadrado cámara. Trate de añadir esto a su configuración:

  

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

Otros consejos

Sobre los bordes redondos agradables, trate de llamar al método suave () en su configuración ():

void setup() {
  // ...
  smooth();
  // ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top