1

我目前正在尝试在光线追踪器中对光线和其他类型的对象进行交叉测试。射线的碰撞通过求解方程以数学方式求解,而不是像距离场那样以恒定或动态大小的步长进行迭代。这运作良好,但有一个我正在尝试解决的问题。

// So if we put these two together (changing x,y,z in
// equation 1 with the values from equation 2, we get:

cx,cy,cz = sphere center
r        = sphere radius
ox,oy,oz = ray origin
dx,dy,dz = ray direction
t        = if the ray will hit, then that point is origin + direction * t

(Eq1) SphereEquation = (x - cx)^2 + (y - cy)^2 + (z - cz)^2 == r^2;
(Eq2) RayEquation    = {x,y,z} == {ox,oy,oz} + t*{dx,dy,dz};

CollisionEquation    = ((ox + t*dx) - cx)^2 + 
                       ((oy + t*dy) - cy)^2 + 
                       ((oz + t*dz) - cz)^2 
                       == r^2

该变量t表示光线何时发生碰撞因此,如果我们使用 pq 公式求解变量t,我们可以看到光线是否会发生碰撞。我的问题是我有无数个位于网格上的球体,它们之间的步长恒定。我想创建一个方程,其中光线可以与它们中的任何一个相交。我试图找到这样的东西,但我找不到任何东西。那么,如何创建这个等式呢?如果不可能,为什么不呢?

PS 我在需要时使用 Mathematica,如果有人想知道,光线追踪器是在 GLSL 中完成的;)

提前感谢您提供的各种帮助。

4

1 回答 1

1

这在一定程度上取决于确切的设置:

对象是否必须在二维网格上(如草示例)?如果是这样,

1)计算你的射线和包含网格的平面之间的交点s(这大致是任何物体必须是被你的射线击中的候选对象),

2)计算任何候选对象可以具有的合适的最大距离s(这可能不是微不足道的,它取决于对象大小和视角)

3)t如上计算所有候选对象(即比计算出的最大距离更近的所有对象s)。最小的t胜利。

于 2012-08-16T13:48:10.157 回答