繁体   English   中英

(C ++)比较两段代码,一个有效,一个无效,无法找出区别

[英](C++) Comparing two pieces of code, one works and one doesn't, can't figure out the difference

我目前正在编写光线追踪器。 我必须编写一个名为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 < xt)语句。 我不知道该语句做什么,因为我不知道xt应该代表或返回什么(对C ++来说是新的)。 据我所知,可以通过编写vec3.x,vec3.y或vec3.z获得3D向​​量(vec3)XYZ值,但是vec3.t应该是什么值?

基本上我的两个问题是:

  1. 这两个代码段有什么区别?

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

(如果您仍然对我的实际工作感到困惑或需要更多背景信息,则可以阅读以下内容中的“ 2.3交叉点”一章: https//www.kth.se/social/files/55145c24f276547e50713af4/DH2323%20lab2。 pdf PDF。它的文本量很小,根本就不长)

问题不是if语句。 那是一条红鲱鱼。

两组代码之间的关键区别在于您for循环中使用return语句。 发生的事情是您的代码从未真正循环过:它进入循环的第一次迭代,然后立即返回true或false。 因此,代码的逻辑输出是检查第一个三角形是否相交,并返回它们是否相交。 但是根据您的代码,您似乎想要找出的是“ 任何三角形相交,如果相交,哪个相交?”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM