Я пишу Raytracer на 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
. Есть ли особая причина, по которой вы хотите сделать это таким образом? - person   schedule 12.03.2011u
иv
фактически заменяютx
,y
иz
. На самом деле в исходной системе было 4 переменные (x
,y
,z
иk
), а в новой всего 3. Настоящая трудность заключается во введении триггерных функций. - person   schedule 12.03.2011