【发布时间】:2017-03-05 02:20:15
【问题描述】:
所以,我需要做 Ray-AABB 相交 这是我的代码,摘自一本书
bool intersection(point start, point dir){
float tmax, tmin, tmaxY, tminY, tmaxZ, tminZ;
float a;
point temp1, temp2;
//check x
a = 1 / dir[0];
if(a > 0){
tmax = (max[0] - start[0]) * a;
tmin = (min[0] - start[0]) * a;
}else{
tmax = (min[0] - start[0]) * a;
tmin = (max[0] - start[0]) * a;
}
if(tmin > tmax) return false;
//check y
a = 1 / dir[1];
if(a > 0){
tmaxY = (max[1] - start[1]) * a;
tminY = (min[1] - start[1]) * a;
}else{
tmaxY = (min[1] - start[1]) * a;
tminY = (max[1] - start[1]) * a;
}
if(tminY > tmin) tmin = tminY;
if(tmaxY < tmax) tmax = tmaxY;
if(tmin > tmax) return false;
//check z
a = 1 / dir[2];
if(a > 0){
tmaxZ = (max[2] - start[2]) * a;
tminZ = (min[2] - start[2]) * a;
}else{
tmaxZ = (min[2] - start[2]) * a;
tminZ = (max[2] - start[2]) * a;
}
if(tminZ > tmin) tmin = tminZ;
if(tmaxZ < tmax) tmax = tmaxZ;
if(tmin > tmax) return false;
return true;
}
但是,它对我不起作用。上面的交集在应该返回 true 时返回 false(因为 tminY > tmin 但小于 tmax)(在没有 AABB 边界的情况下测试)
观察:
start(0, 0, 5) and dir(-89.5, -99.5, -100)
bounding box: max(-5, 0, 0) and min(-5, -5, 0)
tmin = 0.055865921
tmax = 0.055865921
tminY = 0
tmaxY = 0.050251257, therefor tmax = 0.050251257
Because tmin > tmax -> return false
It is supposed to be true
任何帮助将不胜感激
【问题讨论】:
-
调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
-
一旦你完成了调试作业,只是为了好玩:验证上面代码的 sn-p 如何对沿 Ox/Oy/Oz 轴的交叉点做出反应(提示:浮点除以零) .
-
@πάντα ῥεῖ 我已经调试过了。它确实给出了大于 tmax 的 tminY,这就是我在 Stack Overflow 上询问的原因。如果您在我的代码中发现错误,请告诉我
-
@Adrian Colomitchi 我没有一个目录是零
标签: c++ intersection raytracing aabb