【发布时间】: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)
【问题讨论】:
-
使用球体的参数方程会使您必须求解的方程复杂化,因为您引入了额外的变量
u和v。您想这样做有什么特别的原因吗? -
我试图了解它是如何工作的,以便绘制其他更复杂的对象,例如 Dini 的表面 Boy 的表面或 moebius 环。我想知道一些光线追踪器如何绘制复杂的物体,我认为它们使用参数方程。
-
引入新变量并不是真正的问题,因为变量
u和v实际上替换了x、y和z。事实上,原系统有4个变量(x、y、z和k),而新系统只有3个。真正的难点在于三角函数的引入。
标签: c graphics raytracing polynomial-math