Разделить матрицу преобразования на ортогональную матрицу и матрицу масштаба - PullRequest
2 голосов
/ 29 июня 2011

Если у меня есть матрица из масштабирования, преобразования и преобразования вращения. Я хочу разделить эту матрицу на две матрицы. Один - матрица вращения + перемещения, другой - матрица масштаба.

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

Есть идеи?

Ответы [ 3 ]

1 голос
/ 29 июня 2011

Если у меня есть матрица из масштабирования, преобразования и преобразования вращения. Я хочу разделить эту матрицу на две матрицы. Один - матрица вращения + смещения, другой - матрица масштаба.

Я предполагаю, что эта матрица, о которой вы говорите, является матрицей 4х4, которая широко используется одними, широко презираемой другими, с четвертой строкой 0,0,0,1.

Я вызову эти две операции "масштабировать" и "вращать + переводить". Обратите внимание: эти операции не являются коммутативными. Масштабирование 3-вектора, а затем вращение / перемещение этого масштабированного вектора дает другой результат, чем если бы вы изменили порядок операций.

Случай 1, операция «повернуть + перевести», затем «масштабировать».
Пусть SR = S * R, где S - диагональная матрица 3x3 с положительными диагональными элементами (масштабирующая матрица), а R - ортонормированная матрица вращения 3x3. Строки матрицы SR будут ортогональны друг другу, но столбцы не будут ортогональны. Масштабные коэффициенты - это квадратный корень из норм строки матрицы SR.

Алгоритм: Учитывая матрицу 4x4 A, получим масштабирующую матрицу 4x4 S, вращение 4x4 + матрицу трансляции T

A = [  SR(3x3)  Sx(3x1) ]
    [   0(1x3)     1    ]
  1. Разделение A на матрицу 3x3 SR и вектор Sx 3, как показано выше.
  2. Построить масштабную матрицу S. Первые три диагональных элемента являются векторными нормами строк матрицы SR; последний диагональный элемент равен 1.
  3. Построить матрицу вращения 4x4 T +, разделив каждую строку A на соответствующий масштабный коэффициент.

Случай 2, операция «масштабирование», затем «поворот + перевод».
Теперь рассмотрим случай RS = R * S. Здесь столбцы A будут ортогональны друг другу, но строки не будут ортогональны. В этом случае масштабные коэффициенты являются квадратным корнем из норм столбцов матрицы RS.

Алгоритм: Учитывая матрицу 4x4, получим матрицу вращения 4x4 + матрицу T перемещения, матрицу масштабирования 4x4 S

A = [  RS(3x3)  x(3x1) ]
    [   0(1x3)    1    ]
  1. Разделение A на матрицу RS 3x3 и вектор x 3, как показано выше.
  2. Построить масштабную матрицу S. Первые три диагональных элемента являются векторными нормами столбцов матрицы RS; последний диагональный элемент равен 1.
  3. Построить матрицу T + вращения 4x4 путем деления каждой строки A на соответствующий масштабный коэффициент.

Если масштабирование не является равномерным (например, масштаб x на 2, y на 4, z на 1/2), вы можете определить порядок операций, посмотрев на внутренние произведения строк и столбцов верхнего 3x3 Матрица друг с другом. Масштабирование в прошлом (мой случай 1) означает, что внутренние продукты строки будут очень близки к нулю, но внутренние продукты столбца будут отличны от нуля. Масштабирование сначала (мой случай 2) полностью меняет ситуацию. Если масштабирование равномерное, невозможно определить, какой именно случай. Вы должны знать заранее.

0 голосов
/ 29 июня 2011
  1. Удалите перевод, чтобы получить матрицу 3x3
  2. Выполните полярное разложение через SVD.
0 голосов
/ 29 июня 2011

Просто идея -

  • Умножить матрицу на единичные векторы (1/sqrt(3),1/sqrt(3),1/sqrt(3)),
  • проверить, какова длина вектора после умножения,
  • масштабировать матрицу по обратной величине. Теперь у вас есть ортогональная матрица
  • создайте новую матрицу масштаба с найденной вами шкалой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...