Как изобразить поворот матрицы 4х4? - PullRequest
10 голосов
/ 21 октября 2010

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

X Вращение:

[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] 

Редактировать: У меня есть отдельный класс вращения, который содержит значение с плавающей запятой x, y, z, которое я позже преобразовываю в матрицу для объединения с другими переводами / масштабами / вращениями.

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

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

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

Ответы [ 3 ]

7 голосов
/ 21 октября 2010

Да, умножение трех матриц по очереди приведет к их составлению.

РЕДАКТИРОВАТЬ:

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

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
2 голосов
/ 21 октября 2010

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

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

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

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

1 голос
/ 21 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...