3
이것은 레이 트레이싱의 세 번째 질문이지만 진도가 있습니다 : P 그래서 객체 지향 프로그래밍 클래스를위한 C++ 레이 트레이서를 구현하고 있으며 지금까지는 단색의 구형을 구현했습니다. 반사 및 반사 음영을 지원하는 평면. 이상한 그림자 큐브 레이 트레이싱
이 지금은 일반 다면체를 구현하기 위해 노력하고있어 : 이것은 내가했던 일의 예입니다. this algorithm의 수정 된 버전을 사용하여 의 임의의 다면체가있는 교차점을 계산하는 중입니다. nFaces()면이 있습니다. 각면은 으로 정의 된 평면에 포함됩니다. Vec Polyhedron :: point (int face) 및 Vec Polyhedron : : 일반 (INT면) :Vec Polyhedron::intersect(Vec o, Vec d)
{
int face = nFaces();
Vec ni(0,0,0), pi(0,0,0);
unit te = -1;
unit tl = -1;
unit t = 0;
unit N, D;
Vec v = d.normal();
int facein, faceout;
for(int i = 0; i < face; i++)
{
ni = normal(i);
pi = point(i);
N = ((pi - o)*ni);
D = v*ni;
if(D == 0 && N < 0)
return o;
if(D != 0)
{
t = N/D;
if(t > 0)
{
if(N < 0)
{
if(t > te){
te = t;
facein = i;
}
}else{
if((tl == -1) || (t < tl)){
tl = t;
faceout = i;
}
}
if((tl != -1) && (tl < te))
return o;
}
}
}
if(tl != -1)
{
if(te != -1)
{
v = v*te + o;
return (v + normal(facein)*0.000000000001);
}
v = v*tl + o;
return (v + normal(faceout)*0.000000000001);
}
return o;
}
그래서 나는 (입방이었다 내가 구현 다면체의 유일한 유형) 볼을 제거하고 빨간색 큐브를 추가하여 볼 장면을 수정하고 달렸다. 이 결과였다 :
그리고 나는 전혀 생각이 왜이 없습니다. 모든 단서?
정확히 무엇을하고 있는지 혼란 스럽습니다. 다면체의 각면은 평면이있는 평면뿐만 아니라 평면 내에도 정의됩니다. 이를 수행하는 일반적인 방법은 광선을 각 삼각형면과 교차시키는 것입니다. 그러려면 먼저 삼각형이있는 평면과 그 광선의 교차점을 계산 한 다음 교차점이 삼각형 내부에 있는지 테스트합니다. 당신은 각 얼굴의 평면을 사용하는 것 같고 다른 모든 것을 무시하고 있습니다. –
허. 이제 나는 그것을 생각한다. 나는 (tl