【问题标题】:Weird shadows cube raytracing奇怪的阴影立方体光线追踪
【发布时间】: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


【解决方案1】:

我很愚蠢并且误解了算法。我认为 (tl

【讨论】:

    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多