奇异阴影立方体光线跟踪 这是我在光线跟踪中的第三个问题,但是已经有了进步:P,所以我为我的面向对象编程类实现了一个C++光线跟踪程序,到目前为止,我已经实现了支持反射和镜面阴影的单色球面和平面。这是我做过的一件事的一个例子:

奇异阴影立方体光线跟踪 这是我在光线跟踪中的第三个问题,但是已经有了进步:P,所以我为我的面向对象编程类实现了一个C++光线跟踪程序,到目前为止,我已经实现了支持反射和镜面阴影的单色球面和平面。这是我做过的一件事的一个例子:,c++,raytracing,C++,Raytracing,现在我尝试实现一般的多面体。我正在使用的一个修改版本来计算与任意多面体nFaces()面的交点,每个面都包含在一个由Vec polyhedron::point(int face)和Vec polyhedron::normal(int face)定义的平面中: Vec多面体::相交(Vec o,Vec d) { int face=nFaces(); Vec-ni(0,0,0),pi(0,0,0); 单位te=-1; 单位tl=-1; 单位t=0; 单位N,D; Vec v=d.正常(); int

现在我尝试实现一般的多面体。我正在使用的一个修改版本来计算与任意多面体nFaces()面的交点,每个面都包含在一个由Vec polyhedron::point(int face)和Vec polyhedron::normal(int face)定义的平面中:

Vec多面体::相交(Vec o,Vec d)
{
int face=nFaces();
Vec-ni(0,0,0),pi(0,0,0);
单位te=-1;
单位tl=-1;
单位t=0;
单位N,D;
Vec v=d.正常();
int facein,faceout;
对于(int i=0;i0)
{
if(N<0)
{
如果(t>te){
te=t;
facein=i;
}
}否则{
如果((tl==-1)| |(t
因此,我通过移除球并添加一个红色立方体(我实现的唯一多面体类型是长方体)来修改带有球的场景并运行它。结果是:


我完全不知道为什么。有什么线索吗?

我太笨了,误解了算法。我原以为(tl我不知道你到底在干什么。多面体的每个面不仅由其所在的平面定义,还由其在该平面内的周长定义。执行此操作的典型方法是将光线与每个三角形面相交;为此,首先计算该光线与三角形所在平面的交点,然后测试交点是否位于三角形内部。你似乎只使用了每个面的平面,而忽略了其他的一切。现在我想起来了。。。我一直以为(tlVec 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; }