3
這是我在這個光線追蹤的事情的第三個問題,但有進展:P所以,我爲我的面向對象的編程類實現了C++光線追蹤器,到目前爲止,我已經實現了單色球體和支持反射和鏡面陰影。這是我做的事情的例子:奇怪的陰影立方體光線追蹤
現在我想實現一般的多面體。我正在使用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;
}
所以我修改與球現場通過除去球並添加紅色立方體(我實現多面體的唯一類型是長方體)並運行它。這是結果:
而且我也絕對不知道爲什麼。任何線索?
我很困惑你到底在幹什麼。多面體的每個面不僅由其所在的平面定義,而且也由其在該平面內的周界定義。這樣做的典型方式是將射線與每個三角形面相交;爲此,首先計算該射線與三角形所在的平面的交點,然後測試交點位於三角形內部。你似乎只使用每張臉的平面,而忽略了其他的一切。 –
呵呵。現在我想起來......我一直認爲(tl