2010-10-20 2 views
8

Учитывая следующие определения для матриц поворота x, y, z, как я представляю это как одну полную матрицу? Просто умножьте x, y, & матрицы?Как представить вращение матрицы 4x4?

Х Вращение:

[1 0 0 0] 
[0 cos(-X Angle) -sin(-X Angle) 0] 
[0 sin(-X Angle) cos(-X Angle) 0] 
[0 0 0 1] 

Y Вращение:

[cos(-Y Angle) 0 sin(-Y Angle) 0] 
[0 1 0 0] 
[-sin(-Y Angle) 0 cos(-Y Angle) 0] 
[0 0 0 1] 

Z Вращение:

[cos(-Z Angle) -sin(-Z Angle) 0 0] 
[sin(-Z Angle) cos(-Z Angle) 0 0] 
[0 0 1 0] 
[0 0 0 1] 

Редактировать: У меня есть отдельный класс вращения, который содержит х, у , z float value, которое я позже преобразую в матрицу, чтобы объединиться с oth er переводы/весы/вращения.

Судя по ответам здесь, я могу предположить, что если я делаю что-то вроде:

вращения вращения; rotation.SetX (45); rotation.SetY (90); rotation.SetZ (180);

Тогда действительно ли важно, какой порядок вращения применяется? Или можно ли предположить, что при использовании класса вращения вы принимаете, что они применяются в x, y, z порядке?

+0

Это ответ [здесь] (http://stackoverflow.com/questions/5188876/rotation-matrix-given-angle-and-point-in-x-y-z/5188904#5188904). – Glenn

ответ

6

Да, умножая три матрицы, в свою очередь, их составят.

EDIT:

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

P × (X × Y × Z)  Rotations in X, Y, then Z will be performed 
P × (Y × X × Z)  Rotations in Y, X, then Z will be performed 
P × (Z × X × Y)  Rotations in Z, X, then Y will be performed 
+1

Обратите внимание, что это может быть или не быть поворотным, который вы ожидаете (помните, чем в 3D, вращения не коммутируют.) – user168715

+0

Но обратите внимание, что порядок выполнения композиции - умножение матрицы не является коммутативным, и ни один из них не является поворотным разные оси. – walkytalky

+0

Сначала определите, какой порядок применять вращения (скажем, X, затем Y, затем Z). Тогда это также зависит от вашего соглашения о том, являются ли ваши точки векторами строк или векторами столбцов. Для векторов строк у вас есть '((r * X) * Y) * Z = r * (XYZ)' - против векторов столбцов, у вас есть Z * (Y * (X * c)) = (ZYX) * c'. – comingstorm

1

Как и в сторону, и если вы достаточно рано в своей деятельности по развитию здесь, вы можете рассмотреть возможность использования quaternion rotation. Он имеет число comparative advantages для матричных подходов.

2

Это на самом деле очень важно, в каком порядке вы применить ротацию в.

заказ вы хотите, зависит от того, что вы хотите, повороты делать. Например, если вы моделируете самолет, вы можете сначала сделать рулон (поверните вдоль длинной оси тела), затем шаг (поверните вдоль другой горизонтальной оси), затем заголовок (поверните вдоль вертикальной оси). Это было бы потому, что, если бы вы сделали заголовок первым, плоскость больше не была бы выровнена вдоль других осей. Кроме того, вам нужно иметь дело с вашими соглашениями: какая из этих осей соответствует X, Y и Z?

Как правило, вы хотите выбрать конкретный порядок вращения для определенных приложений. Не имеет смысла определять общий объект «XYZrotation»; как правило, у вас будут общие преобразования (т. е. матрицы, которые могут быть любыми конкатенациями поворотов, переводов и т. д.) и различными способами их получения (например, rotX, rotY, translate, scale ...) плюс возможность применения их в определенном порядке (посредством матричного умножения).

Если вы хотите что-то, что может представлять только вращения, и больше ничего, вы можете рассмотреть кватернионы (как и предлагает). Тем не менее, вам все равно нужно решить, какой заказ выполнить ваши вращения, и, опять же, на самом деле не имеет смысла требовать для этого требуемого порядка.

Смежные вопросы