[英](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应该是什么值?
基本上我的两个问题是:
这两个代码段有什么区别?
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.