【发布时间】:2012-08-16 21:48:10
【问题描述】:
我目前正在尝试在光线追踪器中对光线和其他类型的对象进行交叉测试。射线的碰撞通过求解方程以数学方式求解,而不是像距离场那样以恒定或动态大小的步长进行迭代。这运行良好,但我正在尝试解决一个问题。
// 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,我们可以看到光线是否会发生碰撞。我的问题是我有一个 infinite 数量的球体,它们位于一个网格上,它们之间的步长不变。我想创建一个方程,其中光线可以与它们中的任何一个相交。我试图找到这样的东西,但我找不到任何东西。那么,如何创建这个等式呢?如果不可能,为什么不呢?
附:我在需要时使用 Mathematica,如果有人想知道,光线追踪器是在 GLSL 中完成的;)
提前感谢您的各种帮助。
【问题讨论】:
-
为什么球体的数量是无限的?似乎这会导致各种头痛。
-
一件事是草,那里有很多草叶。带球体的网格只是一个例子。球体方程稍后可以更改为更像草叶的方程。 (但这是个好问题)
标签: math equation raytracing