9

我正在研究光线追踪器的数学,但我并没有遵循我读过的关于该主题的几乎每篇文章中的过渡。这就是我所拥有的:

球体公式:

(X - Cx)^2 + (Y - Cy)^2 + (Z - Cz)^2 - R^2 = 0

其中R为半径,C为圆心,X、Y、Z为球面内的所有点。

线的公式:

X + DxT,Y + DyT,Z + DzT

其中 D 是直线的归一化方向向量,X、Y、Z 是直线上的所有点,T 是直线上某个点的参数。

通过将直线的分量代入球面方程,我们得到:

(X + DxT - Cx)^2 + (Y + DyT - Cy)^2 + (Z + DzT - Cz)^2 - R^2 = 0

我一直追随到那一点(至少我认为我这样做),但是我读过的每一个教程都会从那个跳到一个二次方程而没有解释它(这是从其中一个站点复制的,所以术语是和我的例子有点不同):

A = Xd^2 + Yd^2 + Zd^2

B = 2 * (Xd * (X0 - Xc) + Yd * (Y0 - Yc) + Zd * (Z0 - Zc))

C = (X0 - Xc)^2 + (Y0 - Yc)^2 + (Z0 - Zc)^2 - Sr^2

我知道如何使用二次公式求解 T,但我不明白他们如何从上述公式中得到二次方程。我假设这只是我早已忘记的一些常见数学知识,但谷歌搜索“如何建立二次方程”也没有真正产生任何结果。

在继续之前,我真的很想了解如何到达这一步,因为我不喜欢编写我没有完全掌握的代码。

4

2 回答 2

17

这是每个步骤的详细演练;希望这会让事情变得一清二楚。三维球体的方程为:

(x-a)^2 + (y-b)^2 + (z-c)^2 = r^2

<a, b, c>球体的中心和r它的半径。<x, y, z>如果满足这个方程,这个点就在球面上。

射线的参数方程为:

  • X = xo + xd*t
  • Y = yo + yd*t
  • Z = zo + zd*t

其中<xo, yo, zo>是射线的原点,<xd,yd,yd>是相机射线的方向。

为了找到交点,我们想看看射线上的哪些点与球面上的点相同。所以我们将射线方程代入球体方程:

(xo + xd*t - a)^2 + (yo + yd*t - b)^2 + (zo + zd*t - c)^2 = r^2

扩展为:

  (xd^2 + yd^2 + zd^2)                              * t^2 +
  [2[xd * (xo - a) + yd * (yo - b) + zd *(zo - c)]] * t   +
  [(xo - a)^2 + (yo - b)^2 + (zo - c^)2 - r^2]      * 1
  = 0

请注意,这是一个形式为 的二次方程At^2 + Bt + C = 0,其中:

  • A = (xd^2 + yd^2 + zd^2)
  • B = [2[xd * (xo - a) + yd * (yo - b) + zd *(zo - c)]]
  • C = [(xo - a)^2 + (yo - b)^2 + (zo - c^)2 - r^2]

我们可以对未知变量应用一般二次公式,即:

t = [-B +- sqrt(B^2 - 4AC)] / 2A

B^2 - 4AC部分称为“判别式”。根据判别式的值,我们将得到这个方程的零、一个或两个解:

  • 如果它小于零,则解是一个虚数,并且射线和球体在实平面上不相交。

  • 如果它等于 0,那么光线与球体正好在 1 点相交(它正好与球体相切)。

  • 如果它大于零,则光线与球体恰好在 2 个点处相交。

如果判别式表明没有解决方案,那么你就完成了!射线不与球体相交。如果判别式指示至少一个解,则可以求解t以确定交点。两种解决方案是:

t_1 = [-B + sqrt(B^2 - 4AC)] / 2A
t_2 = [-B - sqrt(B^2 - 4AC)] / 2A

较小的解是光线第一次撞击球体的点。

于 2009-12-31T18:04:00.247 回答
8

从这里:

(X + DxT - Cx)^2 + (Y + DyT - Cy)^2 + (Z + DzT - Cz)^2 - R^2 = 0

展开三个平方项,得到一个长表达式:

X^2 + Dx^2T^2 + Cx^2 + 2XDxT - 2XCx - 2DxTCx + ...... = 0

(这是由于使用公式(x+y+z)^2 = x^2 + y^2 + z^2 + 2xy + 2xz + 2yz

然后分组,这样你就有了 T^2、T 和 1 的因子:

(....)T^2 + (....)T + .... = 0

这些因素是上面给出的 A、B、C。这是 T 的二次方程,可以使用二次公式求解。

于 2009-12-31T17:53:21.923 回答