2014-02-12 63 views
3

這是我在這個光線追蹤的事情的第三個問題,但有進展:P所以,我爲我的面向對象的編程類實現了C++光線追蹤器,到目前爲止,我已經實現了單色球體和支持反射和鏡面陰影。這是我做的事情的例子:奇怪的陰影立方體光線追蹤

Whee pretty and shiny

現在我想實現一般的多面體。我正在使用this algorithm的修改版本來計算與任意多面體的交點,其中每個面都包含在由Vec多面體::點(int面)10 Vec多面體: :正常(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

我當時很愚蠢,誤解了算法。我認爲(t < te)部分會照顧多面體表面上的所有東西,但事實並非如此。傻我。