2D Матрица в 3D Матрица - PullRequest
       33

2D Матрица в 3D Матрица

3 голосов
/ 07 августа 2011

У меня есть 2D-преобразования, хранящиеся в простой матрице 3х3. Как я могу переформатировать это в Матрицу, которую я могу перенести в OpenGL, чтобы преобразовать ортогональные формы, многоугольники и тому подобное.

Как мне поместить значения, чтобы преобразования сохранились?

(На несвязанной ноте, есть ли быстрый способ инвертировать матрицу 3x3?)

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

Некоторые пояснения о матрицах преобразования: все столбцы, кроме последнего, описывают ориентацию новой системы координат в базе текущей системы координат. Таким образом, первый столбец - это вектор X новой системы координат, как видно из текущего, второй - это новый вектор Y, а 3-й - новый Z. Пока это охватывает только вращение. Последний столбец используется для относительного смещения. Последний ряд и самое нижнее правое значение используются для однородных преобразований. Лучше всего оставить последний ряд 0, ..., 0, 1

В вашем случае вы пропускаете значения Z, поэтому мы просто вставляем туда преобразование идентичности, чтобы входящие значения оставались такими, как есть.

Скажите, что это ваша оригинальная матрица:

xx xy tx

yx yy ty

 0  0  1

В этой матрице отсутствует Z-преобразование. Вставка идентичности означает: оставить Z как есть и не смешивать с остальными. Итак, z = z · = 0, кроме zz = 1. Это дает следующую матрицу

       ↓

xx xy  0 tx

yx yy  0 ty

 0  0  1  0  ←

 0  0  0  1

Вы можете применить это к текущему стеку матрицы OpenGL с помощью glMultMatrix , если версия OpenGL ниже 3 профилей ядра. Помните, что OpenGL нумерует матрицу в главном порядке столбцов, т.е. индексы в массиве имеют следующий вид (шестнадцатеричные цифры)

0 4 8 c
1 5 9 d
2 6 a e
3 7 b f

Это противоречит обычной записи С, которая является

0 1 2 3
4 5 6 7
8 9 a b
c d e f

С ядром OpenGL-3 и более поздними версиями вы все равно будете самостоятельно управлять матрицами и манипулировать ими.

РЕДАКТИРОВАТЬ для второй части вопроса

Если инвертировать один, значит найти матрицу M ^ -1 для данной матрицы M, так что M ^ 1 * M = M * M ^ 1 = 1 . Для матриц 3 × 3 метод детерминантной инверсии требует меньше операций, чем элиминация Гаусса-Джордана, и, таким образом, является наиболее эффективным способом сделать это. Уже для матриц 4 × 4 детерминантная инверсия медленнее, чем любой другой метод. http://www.sosmath.com/matrix/inverse/inverse.html

Если вы знаете, что ваша матрица ортонормирована, то вы можете просто переставить верхнюю левую часть, кроме нижней строки и крайнего правого столбца, и отменить знак самого правого столбца, кроме самого нижнего правого элемента. Это использует тот факт, что для ортонормированных матриц M ^ -1 = M ^ T.

2 голосов
/ 07 августа 2011

Просто добавьте четвертую строку и столбец.Например, задано

2 3 3
3 2 4
0 0 1

Создайте следующее

2 3 3 0
3 2 4 0
0 0 1 0
0 0 0 1

Преобразование все еще происходит на плоскости xy, даже если оно теперь находится в трех пространствах.

...