Pergunta

Estou aprendendo a usar Processamento , e ter modificado um dos exemplos para criar este applet . Eu tenho duas perguntas:

  1. Por que são as esferas oblato? As esferas no exemplo I plagiou eram agradáveis ??e redondo.
  2. Por que recebo a exibição de luz nas bordas exteriores das esferas, quando a fonte de ponto é entre eles?

Aqui é a fonte para este pequeno 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();
  }
}
Foi útil?

Solução

A função suave não funciona bem neste caso, porque você tem confinando polígonos. É um pouco complicado de seguir sem uma imagem, mas pensar em um pixel, que está na borda entre dois polígonos. Para o exemplo, vamos dizer que o fundo é (0,0,0) e os polígonos são (255,255,255). O primeiro polígono empates e atinge esse pixel. Ele cobre a metade dela, por isso calcula 0,5 * (0,0,0) + 0,5 * (255.255.255) e salva (126126126) como o novo valor para esse pixel. O segundo polígono chama. Ele também cobre metade do pixel por isso calcula 0,5 * (126.126.126) + 0,5 * (255.255.255) e salva (190190190). Isso não é correto, porque os dois polígonos devem ter cada uma coberta meio diferente e resultou em uma cor de (255,255,255). Mas você não pode descobrir isso se você desenhar cada polígono individual e não salvam as informações de cobertura no meio.

gráficas modernas cartões de suporte algo chamado multisample antialiasing . Isso economiza algumas informações sobre qual parte do pixel do primeiro polígono coberto. O processamento é tentando simular isso sem o suporte de hardware, para que ele usa um truque que funciona muito bem quando você não tem primitivas adjacentes, mas cai por terra quando você faz.

Quanto ao achatamento. Por padrão, Processamento preenche toda a janela, e seu tamanho não é quadrado. A maneira mais fácil de lidar com isso é usar a função orto para fazer a relação de seu quadrado câmera aspecto. Tente adicionar isso para a sua configuração:

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

Outras dicas

Sobre as bordas arredondadas agradáveis, tente chamar o método de suavizar () na sua configuração ():

void setup() {
  // ...
  smooth();
  // ...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top