2014-02-12 3 views
3

이것은 레이 트레이싱의 세 번째 질문이지만 진도가 있습니다 : P 그래서 객체 지향 프로그래밍 클래스를위한 C++ 레이 트레이서를 구현하고 있으며 지금까지는 단색의 구형을 구현했습니다. 반사 및 반사 음영을 지원하는 평면. 이상한 그림자 큐브 레이 트레이싱

Whee pretty and shiny

이 지금은 일반 다면체를 구현하기 위해 노력하고있어 : 이것은 내가했던 일의 예입니다. 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; 
} 

그래서 나는 (입방이었다 내가 구현 다면체의 유일한 유형) 볼을 제거하고 빨간색 큐브를 추가하여 볼 장면을 수정하고 달렸다. 이 결과였다 :

enter image description here

그리고 나는 전혀 생각이 왜이 없습니다. 모든 단서?

+1

정확히 무엇을하고 있는지 혼란 스럽습니다. 다면체의 각면은 평면이있는 평면뿐만 아니라 평면 내에도 정의됩니다. 이를 수행하는 일반적인 방법은 광선을 각 삼각형면과 교차시키는 것입니다. 그러려면 먼저 삼각형이있는 평면과 그 광선의 교차점을 계산 한 다음 교차점이 삼각형 내부에 있는지 테스트합니다. 당신은 각 얼굴의 평면을 사용하는 것 같고 다른 모든 것을 무시하고 있습니다. –

+0

허. 이제 나는 그것을 생각한다. 나는 (tl

답변

0

나는 어리 석고 알고리즘을 오해하고있었습니다. 나는 Polyhedron의 얼굴에 있던 모든 것들을 (tl <) 부분이 처리 할 것이라고 생각했지만, 그렇지 않았다. 바보 나.