奇怪的阴影立方体光线追踪

3
这是我在光线追踪方面的第三个问题,但已经取得了进展:P 因此,我正在为我的面向对象编程课程实现一个C++光线追踪器,到目前为止,我已经实现了单色球体和平面,并支持反射和高光着色。这是我所做的一个例子:

Whee pretty and shiny

现在我正在尝试实现通用的多面体。我正在使用一个修改过的版本的该算法来计算与任意多面体的交点,该多面体由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;
}

因此,我通过移除球并添加一个红色的立方体(我实现的多面体类型仅为长方体)修改了带有球的场景,并运行了它。这是结果:

enter image description here

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


1
我对你正在做什么感到困惑。多面体的每个面不仅由它所在平面定义,而且还由该平面内的其周长定义。通常的方法是将光线与每个三角形面相交; 为此,您首先计算该光线与三角形所在平面的交点,然后测试该交点是否位于三角形内。您似乎只使用了每个面的平面,并忽略了其他所有内容。 - Adam Rosenfield
哦,现在我想起来了...我一直以为(tl < te)这部分会处理它,但是...它真的没有x)算了,我太傻了。 - Pedro Carvalho
1个回答

0

我有些愚笨,误解了算法。我以为(tl < te)部分会处理多面体表面上的所有事情,但实际上并不是这样。我真傻。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接