我正在研究光线跟踪器的数学原理,但我没有遵循我所读过的每篇文章中所进行的转换。这就是我所拥有的:

球体的公式:

(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的方法,但是我不明白它们是如何从上述公式得出二次方程的。我以为那只是我早已忘记的一些常识数学知识,但是谷歌搜索“如何建立二次方程式”并没有真正产生任何效果。

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

最佳答案

从这里:

(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的二次方程,可以使用二次公式求解。

关于geometry - 如何建立射线/球面交点的二次方程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1986378/

10-13 00:58