문제

나는 사용하는 법을 배우고 있습니다 처리, 그리고 만들기 위해 예제 중 하나를 수정했습니다. 이 애플릿. 두 가지 질문이 있습니다.

  1. 구체는 왜 의무가 있습니까? 내가 구겨진 예제의 구체는 멋지고 둥글다.
  2. 포인트 소스가 그 사이에있을 때 구체의 바깥 쪽 가장자리에 빛이 표시되는 이유는 무엇입니까?

이 작은 프로그램의 출처는 다음과 같습니다.

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();
  }
}
도움이 되었습니까?

해결책

이 경우 부드러운 기능이 잘 작동하지 않습니다. 그림없이 따라 가기가 조금 까다 롭지 만 두 다각형 사이의 가장자리에있는 픽셀에 대해 생각하십시오. 예를 들어, 배경이 (0,0,0)이고 다각형이 (255,255,255)라고 가정 해 봅시다. 첫 번째 다각형은 그 픽셀을 그려칩니다. 그것의 절반을 다루기 때문에 0.5*(0,0,0) + 0.5*(255,255,255)를 계산하고 해당 픽셀의 새로운 값으로 저장 (126,126,126)을 저장합니다. 두 번째 다각형이 그려집니다. 또한 픽셀의 절반을 덮으므로 0.5*(126,126,126) + 0.5*(255,255,255) 및 저장 (190,190,190)을 계산합니다. 두 다각형이 각각 다른 절반을 덮어야하고 (255,255,255)의 색상을 초래했기 때문에 이것은 정확하지 않습니다. 그러나 각 다각형을 개별적으로 그리거나 그 사이에 커버리지 정보를 저장하지 않으면 이해할 수 없습니다.

현대 그래픽 카드는 부르는 것을 지원합니다 멀티 샘플 antialiasing. 이것은 첫 번째 다각형의 픽셀의 어느 부분에 대한 정보를 저장합니다. 처리는 하드웨어 지원없이이를 시뮬레이션하려고 노력하므로 프리미티브에 인접하지는 않지만 할 때 분리 할 때 잘 작동하는 트릭을 사용합니다.

직무에 관해서. 기본적으로 처리는 전체 창을 채우고 크기는 제곱이 아닙니다. 이를 다루는 가장 쉬운 방법은 Ortho 기능을 사용하여 카메라 스퀘어의 종횡비를 만드는 것입니다. 설정에 추가 해보십시오.

Ortho (-360,360, -180,180, -10,10);

다른 팁

멋진 둥근 가장자리에 대해서는 setup ()에서 method smooth ()를 호출하십시오.

void setup() {
  // ...
  smooth();
  // ...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top