已知第一个命中点的雷箱交叉点

时间:2014-07-02 15:20:36

标签: algorithm 3d glsl intersection raycasting

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

我在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

在立方体上,我有一个入口点。在它上面是圆点。我也有方向。现在我需要找出光线离开立方体的位置,确切地说是发生这种情况的地方。看到问号,这个出口点我需要找出来。

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

1 个答案:

答案 0 :(得分:0)

给定光线R = {u*t + v|t}和平面P = {p|<n, p> = d},可以直接确定tR相交的P的值(如果存在) 。也就是说,可以直接确定t > 0 <n, u*t + v> = d是否存在。

你的立方体有六个平面边:P[i], i = 1..6。对于每一方i,确定光线R是否与某个值P[i]相交t[i]。如果任何一方P[i]未与R相交,请将该方面排除在考虑之外。

对于与P[i]相交的每个平面Ru*t[i] + v是交叉点位置。如果任何此类交叉点位于多维数据集之外,请将其从考虑中删除。

多维数据集中的第一个交叉位置u*t[i] + v是您要查找的位置。