已知第一个命中点的射线盒交叉点



我在立方体上放置了一个点。我也有一个方向。我的目标是得到与方向矢量相交的立方体一侧的位置。

我在GLSL中这样做(示例代码不需要是GLSL)。我本以为这种情况可以用射线盒相交函数来解决,但是我根本无法使它工作。

float IntersectBox(vec3 orig, vec3 dir, vec3 box)
{
    vec3 t1 = (- orig) / dir; // cube starts at 0,0,0
    vec3 t2 = (box - orig) / dir; // cube ends at box vector coordinates 
    vec3 real_min = min(t1, t2);
    vec3 real_max = max(t1, t2);
    float minmax = min( min(real_max.x, real_max.y), real_max.z);
    return minmax;
}

然后将长度添加到原始位置:

pos  += normalize(rayDir) * IntersectBox(pos, rayDir, vec3(grid));

编辑

添加额外的解释。

我有一个立方体:

_____?___
|       |
|       |    . is start point - this is known.
|       .    / is direction (roughly -.3, .8 here) - this is known
|________|    ? is the exit point - which I need to find out
在立方体上,我有一个入口点。它的上方是一个点。我也有一个方向。现在我需要找出光线离开立方体的点,也就是这个过程发生的地方。看这个问号,我要找出这个出口。

当然这是二维的情况,但是我需要三维的

给定射线R = {u*t + v|t}和平面P = {p|<n, p> = d},如果RP相交,则t的值很容易确定。也就是说,如果存在<n, u*t + v> = d,则可以直接确定t > 0

你的立方体有六个平面边:P[i], i = 1..6。对于每条边i,确定射线R是否与P[i]相交于某个值t[i]。如果P[i]不与R相交,则从考虑中删除该边。

对于每个与R相交的平面P[i], u*t[i] + v为相交位置。如果任何这样的交集位置在立方体之外,则将其从考虑中删除。

在立方体中的第一个交点位置u*t[i] + v就是您要查找的位置

最新更新