球体光线追踪

Posted

技术标签:

【中文标题】球体光线追踪【英文标题】:ray tracing with sphere 【发布时间】:2013-11-25 03:04:26 【问题描述】:

我正在用球体进行光线追踪。当我们求解二次方程并得到两个根时,我们需要取哪个值?我的理解是我们需要取最小值。但是,当我将该值用于计算交点和进一步的照明计算时,我得到了错误的结果。当我取大一点时,它会给出正确的结果。我在网上看到了一些例子,其中一些采用较小的,另一些采用较大的。我真的很困惑哪个是正确的以及为什么。

【问题讨论】:

【参考方案1】:

假设射线的原点是 O,方向是 R(理想情况下是单位向量)。然后光线由参数方程 O + tR 定义。将其分解为分量 Ox + tRx、Oy + tRy 和 Oz + tRz。将这些代入圆 x^2 + y^2 + z^2 = 0 的方程。这将产生一个带有变量 t 的二次方程。求方程的根。

现在,如果你没有真正的根,射线就不会击中球体。如果你有一个真正的根,那么你会碰到球体的一侧。如果你有两个真正的根,那么你会击中球体两次。你想要更近的根(更小的 t),除非 t 是负数,在这种情况下,交点在你身后并且你不在乎。如果两个根都是负数,那么两个交点都在射线的原点之后,您可以忽略它们。

如果球体从原点变形并且您关心球体的旋转和缩放,那么球体的方程会变得更加复杂,其中包含 xy、yz、xz、x、y 和 z 项。一般的二次曲线定义为 Ax^2 + By^2 + Cy^2 + Dxy + Eyz + Fxz + Gx + Hy + Jz + K = 0。上述原理仍然适用。代入参数线方程,求解t,取最小的非负根。

您的交点是 O+tR,其中 t 是最小的非负根。从那里开始,我不知道为什么您的照明计算会关闭。

【讨论】:

据我所知,这篇文章是不正确的。取较大的根会导致您追踪球体的另一侧。我没有时间真正调查它,但对我来说似乎是错误的。像这样的例子有时看起来好像是正确的,但实际上并非如此。在 POVRay 中渲染相同的场景并看看它的样子会很有趣。

以上是关于球体光线追踪的主要内容,如果未能解决你的问题,请参考以下文章

Ray Tracing in One Weekend 超详解 光线追踪1-7 Dielectric 半径为负,实心球体镂空技巧

光线追踪 - 反射

没有得到正确的阴影位置,基于 CPU 的光线追踪

光线追踪框相交

为啥在我的光线追踪器中计算阴影和反射时会丢失细节

OpenGL Alpha混合错误的颜色