2011-02-04 1 views
0

Я реализует столбцы матрицы преобразования, которая выглядит примерно так:Transform масштабирования не похож на работу

|----------|  |------------|  |------------| 
| 0 3 6 9 |  | RS R R X |  | RS R R X | 
| 1 4 7 10 |  | R RS R Y |  | R RS R Y | 
| 2 5 8 11 |  | R R RS Z |  | R R RS Z | 
|----------|  |------------|  | 0 0 0 1 | 
             |------------| 

Я понимаю, что масштабирование должно быть применено к позиции 0, 4 и 8 , но он, похоже, не работает. Я установил ориентацию из кватерниона, задал позицию по мере необходимости и затем попытался умножить свое масштабирование на позиции 0, 4 и 8. Когда это преобразование подается в OpenGL, мои фигуры растягиваются и сквошут и не масштабируются соответствующим образом. Я что-то пропустил здесь, я думал, что масштабирование - это простое умножение по диагонали? Мое приложение ориентации относительно простое, но добавление операции масштабирования к нему приводит к странным эффектам извилистости и раздавливания. Что я делаю не так?

+0

Есть ли причина, по которой вы работаете с матрицей 4x3 вместо матрицы 4x4? – TheBuzzSaw

+0

Да, уменьшает необходимое хранилище, поскольку нижняя строка автоматически считается 0, 0, 0, 1 из-за однородных координат. Нижняя строка подразумевается в расчетах. – Grimless

+0

Я предполагаю, что следующим вопросом будет следующее: как именно вы кормите свои матрицы в OpenGL? Вы используете шейдеры? – TheBuzzSaw

ответ

4

Масштабируемая матрица, которую вы имеете в виду, полезна только для масштабирования или умножения на уже существующее преобразование. Как только базовое преобразование не является идентичным, коэффициенты продажи распространяются на весь верхний левый 3x3. Просто оцените умножение

/ Rxx Rxy Rxz \ /Sx 0 0 \ 
| Ryx Ryy Ryz | * | 0 Sy 0 | 
\ Rzy Rzy Rzz/ \ 0 0 Sz/

= 

/Rxx·Sx Rxy·Sy Rxz·Sz \ 
| Ryx·Sx Ryy·Sy Ryz·Sz | 
\ Rzx·Sx Rzy·Sy Rzz·Sz/
+0

Ну, poo. Я был уверен, что уже пробовал это, но, эй, раньше я ошибся. Большое спасибо! – Grimless