【问题标题】:Ray-AABB intersectionRay-AABB 交叉口
【发布时间】: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


【解决方案1】:
// a degenerated bounding box, actually a segment parallel
//  with the yAxis, with a length of -5 and starting in (x,z)=(-5, 0)
// Because:
//    xMin=xMax=-5 - so a zero x extent
//    zMin=zMax=0  - so a zero x extent
bounding box: max(-5, 0, 0) and min(-5, -5, 0)

你确定这就是你想要的吗?检查光线是否与线段相交?

【讨论】:

  • 不是真的,但在这种情况下,我只有 4 个面,它们都在同一个 Z 坐标上。我也用teapot.obj检查了上面的代码,但也没有在某些部分工作。
  • ^(忘了说你的名字)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
相关资源
最近更新 更多