我目前正在尝试在光线追踪器中对光线和其他类型的对象进行交叉测试。射线的碰撞通过求解方程以数学方式求解,而不是像距离场那样以恒定或动态大小的步长进行迭代。这运作良好,但有一个我正在尝试解决的问题。
// 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 中完成的;)
提前感谢您提供的各种帮助。