【问题标题】:difference between parametric and algebraic equation of sphere intersection with line球面与线相交的参数方程和代数方程的区别
【发布时间】:2025-12-18 14:00:02
【问题描述】:

我正在用 C 语言编写光线追踪器,并使用笛卡尔方程绘制球体:

x^2 + y^2 + z^2 = R^2.

我有我的眼睛位置 (x_eye, y_eye, z_eye) 和我的眼睛矢量 (Vx, Vy, Vz)。 我的线的参数方程是:

x = x_eye + k * Vx  
y = y_eye + k * Vy  
z = z_eye + k * Vz

我将我的直线的参数方程放入球体的笛卡尔方程中以求解它

(x_eye + k * Vx)^2 + (y_eye + k * Vy)^2 + (z_eye + k * Vz)^2 = R^2  

(Vx^2 + Vy^2 + Vz^2) * k^2 + 2 * (x_eye*Vx + y_eye*Vy + z_eye*Vz) * k + (x_eye^2 + y_eye^2 + z_eye^2 - R^2) = 0  

我现在得到了一个像 ax^2 + bx + c = 0 这样的方程,并定义 a、b、c:

a = (Vx^2 + Vy^2 + Vz^2) * k^2  
b = 2 * (x_eye * Vx + y_eye * Vy + z_eye * Vz) * k  
c = (x_eye^2 + y_eye^2 + z_eye^2 - R^2)  

如果有交集,我可以为每个像素找到 k (b^2 - 4.a.c >= 0)。

但是有没有其他方法可以使用这些线和球的参数方程来找到 k
行:

x = x_eye + k * Vx  
y = y_eye + k * Vy  
z = z_eye + k * Vz  

对于球体:

x = R.cos(u).cos(v)  
y = R.sin(u).cos(v)  
z = R.sin(v)  

如何用这两个参数方程找到 k?
我应该这样做吗

x_eye + k * Vx  = R.cos(u).cos(v)  
y_eye + k * Vy  = R.sin(u).cos(v)  
z_eye + k * Vz  = R.sin(v)  

【问题讨论】:

  • 使用球体的参数方程会使您必须求解的方程复杂化,因为您引入了额外的变量 uv。您想这样做有什么特别的原因吗?
  • 我试图了解它是如何工作的,以便绘制其他更复杂的对象,例如 Dini 的表面 Boy 的表面或 moebius 环。我想知道一些光线追踪器如何绘制复杂的物体,我认为它们使用参数方程。
  • 引入新变量并不是真正的问题,因为变量uv 实际上替换了xyz。事实上,原系统有4个变量(xyzk),而新系统只有3个。真正的难点在于三角函数的引入。

标签: c graphics raytracing polynomial-math


【解决方案1】:

解决系统

x_eye + k * Vx  = R.cos(u).cos(v)  
y_eye + k * Vy  = R.sin(u).cos(v)  
z_eye + k * Vz  = R.sin(v)

首先对每个方程的两边进行平方,然后将所有三个方程相加。然后使用三角恒等式简化右手边,直到得到

(x_eye + k * Vx)^2 + (y_eye + k * Vy)^2 + (z_eye + k * Vz)^2 = R2  

这与您之前的@​​987654323@ 等式相同。

不过,一般来说,这可能不是实用的方法。由于您正在尝试编写光线跟踪器,因此您不想手动求解每个方程。相反,使用一些系统求解算法。一个好的起点可能是为几个变量查找有关牛顿法和正割法的一些信息。任何关于数值分析的介绍性教科书都应该包含大量可以帮助您入门的信息。

【讨论】:

    【解决方案2】:

    所以你的问题基本上是'解决球体射线相交的最佳方法是什么'。我认为您已经从编码的角度使用了最好的方法,即求解二次方程(这正是我在我的光线追踪项目pvtrace 中所做的。我认为这是最好的方法几乎没有:

    1. 它是分析性的,即不需要数值迭代!
    2. 要确定球体是否被击中,您不必调用任何math.h 函数,即您可以仅使用 b^2 - 4.ac >= 0 计算交集的判别式(正如您所指出的)。
    3. 如果您需要更进一步计算交点,则只需调用sqrt() 函数即可。我预计这会比多次调用触发更快。函数与 Newton-Raphson 相结合,而且代码会少得多(总是一件好事!)。

    【讨论】: