【问题标题】:Ray intersection with INFINITE number of spheres与无限个球体的射线相交
【发布时间】: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


【解决方案1】:

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

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

1) 计算你的射线和包含网格的平面之间的交点s(这大致是任何可能被你的射线击中的对象的位置),

2) 计算任何候选对象与s 之间的合适最大距离(这可能并不简单,它取决于对象大小和视角)

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

【讨论】:

  • 这是一个解决方案,可以在非二维网格上使用它,只要可以计算出大致的交点。但我希望有更好的解决方案,否则,我会将此作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
相关资源
最近更新 更多