【发布时间】:2014-02-12 18:39:19
【问题描述】:
这是我在光线追踪方面的第三个问题,但已经取得了进展:P 所以,我正在为我的面向对象编程类实现 C++ 光线追踪器,到目前为止,我已经实现了支持单色球体和平面的反射和镜面着色。这是我做过的一个例子:
现在我正在尝试实现一般多面体。我正在使用 this algorithm 的修改版本来计算与 nFaces() 面的任意多面体的交点,每个面都包含在由 Vec Polyhedron::point( int face) 和 Vec Polyhedron::normal(int face):
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
标签: c++ raytracing