문제
나는 사용하는 법을 배우고 있습니다 처리, 그리고 만들기 위해 예제 중 하나를 수정했습니다. 이 애플릿. 두 가지 질문이 있습니다.
- 구체는 왜 의무가 있습니까? 내가 구겨진 예제의 구체는 멋지고 둥글다.
- 포인트 소스가 그 사이에있을 때 구체의 바깥 쪽 가장자리에 빛이 표시되는 이유는 무엇입니까?
이 작은 프로그램의 출처는 다음과 같습니다.
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();
// ...
}