我目前正在写一个光线追踪器。我必须编写一个名为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应该是什么值?
基本上我的两个问题是:
两个代码之间有什么区别?
vec3.t返回什么以及它代表什么?
(如果您仍然对我实际在做什么或需要更多上下文感到困惑,您可以阅读本章中的“2.3交叉点”一章:https://www.kth.se/social/files/55145c24f276547e50713af4/DH2323%20lab2.pdf PDF。它的文本非常少,不长在所有)
答案 0 :(得分:2)
问题不在于if
声明。那是一个红鲱鱼。
两组代码之间的关键区别在于您在for
循环中使用了返回语句。发生的事情是你的代码永远不会真正循环:它进入循环的第一次迭代,然后立即返回true或false。因此,代码的逻辑输出是它检查交集的第一个三角形,并返回它们是否相交。但根据你的代码,它看起来像你想要要找出的是“do 任何三角形相交,如果是,那么哪一个?”。
最简单的解决方案就是像第二个代码集一样,使用bool
来跟踪你是否找到了一个交集,并且只在循环外返回该值。