Який правильний порядок множення матриць масштабу, обертання та перекладу для належної світової матриці?


62

Припустимо DirectX як платформу, якщо це важливо. (Досить впевнений, що це не так)

Якщо припустити, що я маю належну матрицю масштабування, обертання та перекладу, в якому порядку я їх помножую, щоб у результаті вийшла правильна світова матриця і чому?

Під "належним" я маю на увазі "я міг би кинути їх прямо в DirectX і отримати найбільш часто використовуваний 3D-кадр".


6
Ось пояснення "повернути, потім перекласти" (прядіння) проти "перекласти потім повернути" (орбітальний)
bobobobo

посилання хороша, але з невеликою помилкою. його має бути ефект кочення, а не крутитися, оскільки сфера має тенденцію відсуватися від свого положення (залишаючись на осі) шляхом перекладу.
infoclogged

Відповіді:


77

Зазвичай це масштаб, потім обертання і нарешті переклад. З матричним позначенням (тобто T для матриці перекладу, R для матриці обертання і S для матриці масштабування) було б:

T * R * S

Однак, якщо ви хочете обертати об'єкт навколо певної точки, то це масштаб, переклад точки, обертання і нарешті переклад об'єкта.

Чому: Спочатку потрібно масштабувати об’єкт, щоб переклади працювали належним чином. Потім ви обертаєте осі, так що переклад відбувається на відрегульовані осі. Нарешті ви переводите об'єкт у його положення.

У OpenGL ви можете використовувати gluLookAt, щоб отримати повну трансформацію камери за один дзвінок. Ймовірно, подібний дзвінок для DirectX.


11
І пам’ятайте, що якщо ви хочете перетворити навколо центру, то спочатку вам потрібно перевести, щоб зрушити центр, який має походження, а потім зробити так, як заявив user392858, а потім перекласти його знову назад від початкового на ту саму суму. Однак, як правило, це потрібно лише у 2D, де у вас є спрайт, який у верхній частині ліворуч у початку.
Інженер

Чудово. :) Тепер я просто розібрався, чому моя модель зараз перевертається в горизонтальному поданні і потрібен крапковий виріб на спрямованому світлі, поверненому у вертикальний вигляд. Це раніше не робилося, тоді я виправив математику ...
Нарфуйте мишу

Зазначимо, я ненавиджу неправильно поставлені негативні ознаки. У будь-якому випадку, дякую, і ви можете вважати це питання зробленим. :)
Narf the Mouse

Немає проблем, завжди радий допомогти.
Рафаель Р.

2
@ Маттіас Наскільки я знаю, це залежить від того, як ви потім помножите на вектор, який ви хочете перетворити. Якщо ви помножите M * v, то так, відповідь змінив порядок.
біалпіо

-4

обертання та масштабування перекладу - це послідовність виконання операції


-5

Я вірю, що це обертання та набір перекладу


2
Це не дає більше пояснень, ніж існуючі відповіді.
DMGregory
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.