Как настроить квадратное уравнение для пересечения луча/сферы?

Я исследую математику для трассировщика лучей, но я не следую за переходом, который сделан в примерно каждой статье, которую я прочитал на предмете. Это - то, что я имею:

Формула для сферы:

(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 использование формулы корней квадратного уравнения, но я не понимаю, как они добираются до квадратного уравнения от вышеупомянутых формул. Я предполагаю, что это - просто некоторая часть общего математического знания, что я давно забыл, но гуглящий для, "Как настроить квадратное уравнение", ни к чему действительно не привел также.

Я действительно хотел бы понять, как добраться до этого шага перед хождением дальше, поскольку мне не нравится написание кода, которое я не полностью схватываю.

8
задан Mike Pateras 31 December 2009 в 17:46
поделиться

2 ответа

Отсюда:

(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, и его можно решить с помощью квадратичной формулы

.
8
ответ дан 5 December 2019 в 06:53
поделиться

Вот детальный обзор каждого шага; надеюсь, это сделает вещи кристально ясными. Уравнение для трехмерной сферы:

(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

Меньшее решение - это точка, в которой луч первым попадет на сферу.

16
ответ дан 5 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: