У меня есть матрица преобразования 4x4 M, и я хочу выяснить форму сферы при преобразовании M. (Сфера находится в начале координат и имеет радиус 1.)
Я знаю, что могу найти центр, просто умножив М на (0,0,0,1).
Тем не менее, радиус становится проблемой, так как М может сдавливать и вращать сферу. Как я могу узнать новый радиус (ы) полученного эллипсоида? Есть ли способ узнать ориентацию?
Более конкретно, мне нужно знать размер ограничивающей сферы, которая будет заключать трансформированную сферу. Другими словами, что является максимумом | M * V - M * (0,0,0,1) |, где V - единичный вектор (точка на исходной сфере).
mathematics
matrix
transformation
linear-algebra
CaptainCodeman
источник
источник
Ответы:
Математически, количество, о котором вы спрашиваете, называется нормой оператора . К сожалению, нет простой формулы для этого. Если это полностью общее аффинное преобразование - например, если оно может иметь произвольную комбинацию поворотов и неравномерных масштабов в любом порядке - тогда я боюсь, что для этого нет ничего, кроме использования разложения по сингулярным значениям . Если вы примените SVD к своей матрице, то наибольшее единственное значение будет максимальным радиусом полученного эллипсоида. Другие особые значения также будут двумя другими его радиусами, и процедура SVD также может извлечь ориентацию осей для вас.
Внедрение SVD не для слабонервных, так как предполагает поиск собственных значений. Если все, что вам нужно, это сами сингулярные значения, они являются квадратными корнями из собственных значений M ^ T * M. Поэтому, если у вас есть под рукой решатель собственных значений 3x3 или вы не против написать его, вы можете использовать его. Если вы хотите извлечь ориентации осей, то это становится более сложным, поскольку вы также должны найти собственные векторы. В этой статье Википедии есть список ссылок на библиотеки для работы с SVD, одну из которых вы можете использовать в своем проекте.
Если форма вашей матрицы ограничена таким образом, что неравномерное масштабирование происходит не более одного раза и является первым примененным преобразованием, то есть наиболее правым, когда вы используете векторы столбцов, тогда вы можете упростить это, просто посмотрев на длину преобразованные векторы оси. Только в этом случае - т. Е. Один неоднородный масштаб, сопровождаемый любой последовательностью поворотов, отражений и равномерных масштабов - если смотреть только на векторы осей, вы получите правильный ответ.
источник
Может быть, извлечь масштабные коэффициенты из матрицы, а затем использовать максимальное значение ее компонентов. Используя матрицу SRT (Scale-Rotation-Translation), вы можете сделать это следующим образом:
(на основе http://wklej.org/id/950061/ - имя декомпозировать TRS, а не декомпозировать SRT, потому что я использую имена, упорядоченные по порядку, матрицы которых умножаются в OpenGL).
Теперь вы можете умножить исходный радиус сферы на scaleFactor, и у вас есть ограничивающая сфера.
источник