我目前正在尝试在光线跟踪器中的光线和其他类型的对象之间进行交叉测试。射线的碰撞通过求解方程式在数学上求解,而不是像恒定距离场一样用恒定或动态大小的步长进行迭代。这很好用,但是我想解决一个问题。
// 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-formula求解变量t
,我们可以看到光线是否会发生碰撞。我的问题是我有一个位于网格上的无限个球体,它们之间的步长是恒定的。我想创建一个方程,其中光线可以与它们中的任何一个相交。我试图找到这样的东西,但我找不到任何东西。那么,如何创建这个等式呢?如果不可能,为什么不呢?
P.S。我在需要时使用Mathematica,如果有人想知道,光线跟踪器在GLSL中完成;)
提前感谢您提供各种帮助。
答案 0 :(得分:0)
这取决于完全设置:
对象是否必须在二维网格上(如草例中)?如果是的话,
1)计算光线与包含网格的平面之间的交点s
(这大致是任何物体必须被光线击中的对象),
2)计算任何候选对象可以从s
获得的合适的最大距离(这可能不是微不足道的,它取决于对象大小和视角)
3)如上所述为所有候选计算t
(即所有对象都比计算出的最大距离s
更近)。最小t
获胜。