Я исследую математику для трассировщика лучей, но я не следую за переходом, который сделан в примерно каждой статье, которую я прочитал на предмете. Это - то, что я имею:
Формула для сферы:
(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, и его можно решить с помощью квадратичной формулы
.Вот детальный обзор каждого шага; надеюсь, это сделает вещи кристально ясными. Уравнение для трехмерной сферы:
(x-a)^2 + (y-b)^2 + (z-c)^2 = r^2
, причем является центром сферы, а
r
ее радиус. Точка
находится на сфере, если она удовлетворяет этому уравнению.
Параметрические уравнения для луча:
X = xo + xd*t
Y = yo + yd*t
Z = зум + zd*t
, где
является происхождением луча, а
- направлением луча фотоаппарата.
Чтобы найти пересечение, мы хотим увидеть, какие точки на луче совпадают с точками на сфере. Поэтому подставляем уравнение луча в уравнение сферы:
(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
Обратите внимание, что это квадратичное уравнение в виде At^2 + Bt + C = 0
, with:
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]
Мы можем применить общую квадратичную формулу для неизвестной переменной, а именно: At^2 + Bt + C = 0
:
t = [-B +- sqrt(B^2 - 4AC)] / 2A
Часть B^2 - 4AC
называется "дискриминант". В зависимости от значения дискриминанта мы получим ноль, одно или два решения этого уравнения:
Если оно меньше нуля, то решение - воображаемое число, а луч и сфера не пересекаются в вещественной плоскости.
Если оно равно нулю, то луч пересекает сферу ровно в 1 точке (оно точно касательно сферы).
Если оно больше нуля, то луч пересекает сферу ровно в 2 точках.
Если дискриминант указывает на то, что решения нет, то все! Луч не пересекает сферу. Если дискриминант указывает хотя бы на одно решение, то для определения точки пересечения можно решить для t
. Два решения:
t_1 = [-B + sqrt(B^2 - 4AC)] / 2A
t_2 = [-B - sqrt(B^2 - 4AC)] / 2A
Меньшее решение - это точка, в которой луч первым попадет на сферу.