奇怪的阴影立方体raytracing

时间:2014-02-12 18:39:19

标签: c++ raytracing

这是我在这个光线追踪事情中的第三个问题,但是已经取得了进展:P所以,我正在为我的面向对象编程类实现一个C ++光线跟踪器,到目前为止,我已经实现了单色球体和平面支持反射和镜面着色。这是我做过的事情的一个例子:

Whee pretty and shiny

现在我正在尝试实现一般多面体。我正在使用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;
}

所以我通过移除球并添加一个红色立方体(我实施的唯一类型的多面体是Cuboid)来修改场景并运行它。这就是结果:

enter image description here

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

1 个答案:

答案 0 :(得分:0)

我是愚蠢的,误解了算法。我认为(tl&lt; te)部分会处理Polyhedron脸上的所有东西,但事实并非如此。傻我。