(C ++)比较两段代码,一块有效,另一块无法,无法找出差异

时间:2017-04-12 16:42:50

标签: c++ graphics 3d raytracing

我目前正在写一个光线追踪器。我必须编写一个名为ClosestIntersection的函数来检查光线是否与三角形相交,它还应该返回(准确地更新)一些关于最近交点的信息。

我的代码:

bool ClosestIntersection(vec3 start, vec3 dir, const vector<Triangle>& triangles, Intersection& closestIntersection)
{
    for (int i = 0; i < triangles.size(); i++) {
        vec3 v0 = triangles[i].v0;
        vec3 v1 = triangles[i].v1;
        vec3 v2 = triangles[i].v2;
        vec3 e1 = v1 - v0;
        vec3 e2 = v2 - v0;
        vec3 b = start - v0;
        mat3 A(-dir, e1, e2);
        vec3 x = glm::inverse(A) * b;

        if ((x.x >= 0) && (x.y > 0) && (x.z > 0) && ((x.y + x.z) < 1)) {
            closestIntersection.position = x.x*dir;
            closestIntersection.distance = x.x;
            closestIntersection.triangleIndex = i;
            return true;
        }
        else {
            return false;
        }
    }
}

我注意到我的代码中的if语句永远不会变为真(AKA每次都返回false),有趣的是,当单独测试时,语句中的所有条件都是真的,但是当它们组合在一起时不是条件。

我确实在互联网上找到了另一段与我的相似的代码(我会说它看起来很相似)。

其他代码:

bool ClosestIntersection(vec3 start,
    vec3 dir,
    const vector<Triangle>& triangles,
    Intersection& closestIntersection ){

    bool exists = false;
    for(int i=0; i<triangles.size(); i++){

        using glm::vec3;
        using glm::mat3;
        vec3 v0 = triangles[i].v0;
        vec3 v1 = triangles[i].v1;
        vec3 v2 = triangles[i].v2;
        vec3 e1 = v1 - v0;
        vec3 e2 = v2 - v0;
        vec3 b = start -v0;
        mat3 A( -dir, e1, e2 );
        vec3 x = glm::inverse( A ) * b;

        if ( x.x > 0 ){ 
            if (x.y > 0) {  
                if (x.z > 0) {
                    if (x.y+x.z < 1){
                        if (closestIntersection.distance < x.t){
                            closestIntersection.position = x.x*dir;
                            closestIntersection.distance = x.x;
                            closestIntersection.triangleIndex = i;
                        }
                    }
                }
            }
            exists = true;
        }

    }
    return exists;
}

这第二个代码工作正常,但我的不行。我能看到的唯一区别是if(closestIntersection.distance < x.t)语句。我不知道这个语句是做什么的,因为我不知道x.t应该表示或返回什么(C ++新手)。据我所知,3D矢量(vec3)XYZ值可以通过编写vec3.x,vec3.y或vec3.z获得,但vec3.t应该是什么值?

基本上我的两个问题是:

  1. 两个代码之间有什么区别?

  2. vec3.t返回什么以及它代表什么?

  3. (如果您仍然对我实际在做什么或需要更多上下文感到困惑,您可以阅读本章中的“2.3交叉点”一章:https://www.kth.se/social/files/55145c24f276547e50713af4/DH2323%20lab2.pdf PDF。它的文本非常少,不长在所有)

1 个答案:

答案 0 :(得分:2)

问题不在于if声明。那是一个红鲱鱼。

两组代码之间的关键区别在于您在for循环中使用了返回语句。发生的事情是你的代码永远不会真正循环:它进入循环的第一次迭代,然后立即返回true或false。因此,代码的逻辑输出是它检查交集的第一个三角形,并返回它们是否相交。但根据你的代码,它看起来像你想要要找出的是“do 任何三角形相交,如果是,那么哪一个?”。

最简单的解决方案就是像第二个代码集一样,使用bool来跟踪你是否找到了一个交集,并且只在循环外返回该值。