我把一个点放在一个立方体上我也有方向。我的目标是得到与方向向量相交的立方体侧面的位置。
我在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}
,很容易确定t
和R
如果存在时交叉的值P
。也就是说,很容易确定t > 0
如果<n, u*t + v> = d
如果存在的话。
立方体有六个平面边:P[i], i = 1..6
。对于每一侧,确定光线是否与某个值相交。如果任何一侧不相交,则将该一侧从考虑中移除。
对于每个相交的平面i
,R
是相交位置。如果任何这样的交集位置在立方体之外,请将其从考虑中移除。
立方体中的第一个交集位置P[i]
就是您要查找的位置。