如何设置射线/球体交叉的二次方程?

Mik*_*ras 8 geometry raytracing algebra

我正在研究光线跟踪器的数学计算,但我并没有按照我在这个主题上阅读的每篇文章进行过渡.这就是我所拥有的:

球体公式:

(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,但我不明白他们如何从上面的公式得到二次方程.我假设这只是我早已忘记的一些常见的数学知识,但谷歌搜索"如何设置二次方程式"并没有真正产生任何东西.

我真的很想在继续之前了解如何进入这一步,因为我不喜欢编写我不完全掌握的代码.

Joh*_*lla 16

这是每个步骤的详细演练; 希望这会使事情变得清晰.三维球体的方程是:

(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
Run Code Online (Sandbox Code Playgroud)

请注意,这是表格中的二次方程式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
Run Code Online (Sandbox Code Playgroud)

B^2 - 4AC部分称为"判别式".根据判别式的值,我们将得到零,一或两个解决方案:

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

  • 如果它等于零,则光线恰好与球体相交1点(它与球体正好相切).

  • 如果它大于零,那么光线恰好在2点与球体相交.

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

t_1 = [-B + sqrt(B^2 - 4AC)] / 2A
t_2 = [-B - sqrt(B^2 - 4AC)] / 2A
Run Code Online (Sandbox Code Playgroud)

较小的解决方案是射线首先击中球体的点.


int*_*jay 8

从这里:

(X + DxT - Cx)^2 + (Y + DyT - Cy)^2 + (Z + DzT - Cz)^2 - R^2 = 0
Run Code Online (Sandbox Code Playgroud)

扩展三个平方项,因此您有一个长表达式:

X^2 + Dx^2T^2 + Cx^2 + 2XDxT - 2XCx - 2DxTCx + ...... = 0
Run Code Online (Sandbox Code Playgroud)

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

然后分组,因此你有T ^ 2,T和1的因子:

(....)T^2 + (....)T + .... = 0
Run Code Online (Sandbox Code Playgroud)

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