(C++) 比较两段代码,一段有效,一段无效,无法找出区别
(C++) Comparing two pieces of code, one works and one doesn't, can't figure out the difference
我目前正在编写光线追踪器。我必须编写一个名为 ClosestIntersection 的函数来检查射线是否与三角形相交,它还应该 return(准确地说是更新)一些关于最近相交点的信息。
我的代码:
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 语句永远不会变为真(又名 return 每次都为假),有趣的是语句中的所有条件在单独测试时都为真但不是当它们作为多个条件放在一起时。
我确实在 Internet 上找到了另一段与我的相似的代码(我会说它看起来一模一样)。
其他代码:
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 应该代表什么或 return (C++ 新手)。据我所知,可以通过编写 vec3.x、vec3.y 或 vec3.z 获得 3D 向量 (vec3) XYZ 值,但是 vec3.t 应该是什么值?
基本上我的2个问题是:
两个代码块有什么区别?
vec3.treturn是什么意思,代表什么?
(如果您仍然对我实际在做什么感到困惑或需要更多上下文,您可以阅读“2.3 交集”一章:https://www.kth.se/social/files/55145c24f276547e50713af4/DH2323%20lab2.pdf PDF。它的文本量非常小,一点也不长)
问题不在于 if
语句。那是一条红鲱鱼。
两组代码之间的关键区别在于您在 for
循环 中使用了 return 语句 。发生的事情是您的代码从未真正循环过:它进入循环的第一次迭代,然后立即 returns true 或 false。所以你的代码的逻辑输出是它检查第一个三角形是否相交,并且 returns 它们是否相交。但是根据您的代码,看起来您 想要 是找出 "do any triangles intersect, and if so, which one?".
最简单的解决方案是像第二个代码集一样,使用 bool
来跟踪您是否找到了交集,并且只 return 在循环之外的那个值。
我目前正在编写光线追踪器。我必须编写一个名为 ClosestIntersection 的函数来检查射线是否与三角形相交,它还应该 return(准确地说是更新)一些关于最近相交点的信息。
我的代码:
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 语句永远不会变为真(又名 return 每次都为假),有趣的是语句中的所有条件在单独测试时都为真但不是当它们作为多个条件放在一起时。
我确实在 Internet 上找到了另一段与我的相似的代码(我会说它看起来一模一样)。
其他代码:
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 应该代表什么或 return (C++ 新手)。据我所知,可以通过编写 vec3.x、vec3.y 或 vec3.z 获得 3D 向量 (vec3) XYZ 值,但是 vec3.t 应该是什么值?
基本上我的2个问题是:
两个代码块有什么区别?
vec3.treturn是什么意思,代表什么?
(如果您仍然对我实际在做什么感到困惑或需要更多上下文,您可以阅读“2.3 交集”一章:https://www.kth.se/social/files/55145c24f276547e50713af4/DH2323%20lab2.pdf PDF。它的文本量非常小,一点也不长)
问题不在于 if
语句。那是一条红鲱鱼。
两组代码之间的关键区别在于您在 for
循环 中使用了 return 语句 。发生的事情是您的代码从未真正循环过:它进入循环的第一次迭代,然后立即 returns true 或 false。所以你的代码的逻辑输出是它检查第一个三角形是否相交,并且 returns 它们是否相交。但是根据您的代码,看起来您 想要 是找出 "do any triangles intersect, and if so, which one?".
最简单的解决方案是像第二个代码集一样,使用 bool
来跟踪您是否找到了交集,并且只 return 在循环之外的那个值。