Квадратный корень из матрицы

Началось все вот с этого детского вопроса:

http://www.gamedev.ru/code/forum/?id=81986

>Всем привет!!! Существует ли формула, по которой из матрицы можно убрать масштабирование, не зная коэффициентов масштабирования???

Сразу вспомнили полярное разложение. Что-де, матрица M представляется в виде O * P. Где O ортогональная, а P положительно определенная, симметричная – то есть матрица сжатия или растяжения. Вот матрицу O мы и возьмем.

Встает вопрос. А если раскладывать M с другой стороны, то получим P’ * O’. Разложение в другом порядке, с другими априори матричками. Почему бы не взять O’? Я мучался минут пять вопросом, пока не вспомнил, как ставил студентам незачет по этому поводу. Матрица O’ на самом деле совпадает с матрицей O. Если вы недавно закончили университет или еще учитесь – можете даже попытаться доказать сей факт.

Итак, полярное разложение:

http://en.wikipedia.org/wiki/Polar_decomposition

Для нахождения положительного квадратного корня из матрицы в позитивной науке предлагается посчитать собственные числа. Для каждого собственного числа найти собственное подространство, потом аккуратно изготовить собственно квадратный корень из оператора.

Я как представил, что получится для матрицы, близкой к единичной, аж вздрогнул. Все умрет на неточностях флоата, ранги у матриц съедут – полный коллапс обещает быть.

А почему бы благородным донам не попробовать итерации, которые божествены, как известно ?

Вот, корень из числа ищется методом Ньютона. Последовательность a_{i+1} = 0.5 * ( a_i + x / a_i ); гордо сходится к квадратному корню из x. Для пробы взял чью-то библиотечку про mat3x3 и наклепал матричный аналог.

http://www.everfall.com/paste/id.php?msns5u1raple

Прямой аналог метода Ньютона шустро сходится за 3-4 итерации , тесты проходят как легкий ветерок. Получается полярное разложение для матриц, работоспособность алгоритма очевидна из элементарной спектральной теории операторов. Очевидна после получаса скрипа мозгом.

Итак, полярное разложение мы нашли. Вопрос – зачем? И тут я вынужден перейти к основному поинту своего доклада. Учение – зло. Время, которые вы потратили на вспоминание спектральной теории операторов, успешно потрачено впустую.

Разложение Scale Shear Rotate ищется на раз. Применяем процесс ортогонализации и ортонормализации к матрице. По столбцам. Получаем отличную матрицу. И чем результат будет хуже? Да ничем!

Увидел я пост с кодом на паскале, который и считает это самое Scale Shear Rotate разложение, и внезапно понял, что у меня нет аргументов за полярное разложение. Которое требует хрен знает какой вычислительной техники.

Конечно, есть мелкие возражения, почти придирки. К примеру, что tangent space проще считать ортонормальным. Вычислительно проще. Обычно считают dPosition/du, нормаль, а третий вектор берут перпендикулярным к этой паре. Ясно, что метод несимметричный относительно текстурных координат, какая из них первая, какая вторая – совершенно непонятно. Вроде бы правильно применить полярное разложение к матрице локального преобразования.

Может, заметите вы разницу между “правильным” полярным разложением и “неправильным” процессом ортогонализации по столбцам. Скорее не заметите. И уж точно картинка не станет лучше.

P.S. А вот еще анимации хранить в Scale Shear Rotate очень круто. Три вектора, один кватернион. Shear почти всегда 0, Scale почти всегда 1, константные треки можно выкинуть. А там где неконстантные треки – как-нить выжать за счет специализации шаблона. Или еще чего.

  • Balmer

    >>>>>>> Сразу вспомнили полярное разложение. Что-де, матрица M представляется в виде O * P. Где O ортогональная, а P положительно определенная, симметричная – то есть матрица сжатия или растяжения.

    Придерусь чуток – P – это отнюдь не чистая матрица скалирования. Это всё-таки матрица скалирования помноженная на матрицу вращения. То есть всётаки в общем виде R1*S*R2 (если конечно предположить что исходная матрица – это матрица состоящая только из S и R составляющей).

  • IronPeter

    P это матрица скалирования относительно 3 взаимно перпендикулярных осей. Отличное такое сжатие-растяжение. Но не диагональная матрица, конечно же.

  • Balmer

    Ага, точно. Стормозил.

  • Pingback: ru scums « Эхо блогосферы()