Как совместить вращение по 2 осям в одной матрице

8

Я уже знаю о матрицах, которые я должен использовать для выполнения вращений. Если мне нужно повернуть по оси Z, а затем по оси X, я бы сделал это в 2 шага. У меня вопрос, возможно ли объединить оба поворота в одну матрицу? Буду признателен за ваш отзыв.

ХОРХЕ
источник

Ответы:

8

(Этот ответ по сути такой же, как и у Стефана, но я хотел добавить некоторые подробности о векторах строк и столбцов и о том, как определить, какой из них вы используете.)

Да, это возможно, но детали зависят от того, представляете ли вы свои векторы в виде строк или столбцов.

Векторы столбцов

Если вы используете векторы столбцов , вы обычно преобразуете их, умножая слева свои матрицы:

vector = mRotateZ * vector;
vector = mRotateX * vector;

Конечно, вы также можете сделать это за один шаг:

vector = mRotateX * mRotateZ * vector;

Но матричное умножение является ассоциативным, что означает, что не имеет значения, какое умножение выполняется первым:

A * B * C = (A * B) * C = A * (B * C)

Итак, мы можем написать

Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;

Теперь мы создали единственную матрицу, которая эквивалентна первому вращению вокруг Zи второй около X. Это обобщается тривиально для любого числа преобразований. Обратите внимание, что преобразования применяются справа налево.

Векторы строк

Если, с другой стороны, вы используете векторы строк , вы, как правило, правильно умножите свои матрицы:

vector = vector * mRotateZ;
vector = vector * mRotateX;

Опять же, записав это за один шаг, мы получим

vector = vector * mRotateZ * mRotateX;

который можно переписать как

Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;

Обратите внимание, что в этом случае преобразования применяются слева направо.

Мартин Эндер
источник
1
Я был бы очень недоволен этим комментарием по ассоциации, который легко понять неправильно
joojaa
@joojaa Я не знаю, что именно ты имеешь в виду, но я попытался уточнить это.
Мартин Эндер
Непрофессионалу трудно разделить между собой порядок, в котором вы умножаете вещи и порядок, в котором элементы находятся в умножении.
Джуджаа
поэтому они не понимают разницы между ассоциативным и коммутативным. так что если вы говорите о порядке умножения, многие могут подумать о коммутативности
joojaa 13.10.15
6

Да, просто умножьте их в обратном порядке:

Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);

РЕДАКТИРОВАТЬ. Мой ответ применим только в том случае, если вы используете векторы столбцов. Пожалуйста, смотрите подробный ответ Мартина Бюттнера.

Стефан Агартсон
источник
Извините, но я не понимаю. Что именно вы подразумеваете под «обратным порядком»?
JORGE
1
Умножьте x на z вместо z на x;
Стефан Агартсон
1
на самом деле порядок произвольный, можно моделировать с использованием векторов строк, а можно моделировать векторы столбцов. Вычисления дают одинаковый результат в обоих случаях, но порядок умножения изменяется. Но да, это своего рода правильный ответ.
Джуджаа
Joojaa, спасибо за разъяснение этого! Матрица строк означает обратный порядок умножения, это правильно?
Стефан Агартсон
3

Из математики:

Существует гомоморфизм 2: 1 от единичных кватернионов до SO (3) (группа вращений).

Что это (по сути) означает, что:

  1. Каждая ориентация может быть представлена ​​в виде кватерниона
  2. Кватернионы представляют собой одно вращение
  3. Умножение кватернионов производит другой кватернион (замыкание) и эквивалентно составлению вращений.
  4. Поэтому любое количество вращений может быть представлено как одно вращение!

Подумай об этом. Начиная с пространства объектов, вы можете повернуть ваш объект в любую ориентацию, используя только одно вращение.


Я хотел бы отметить, что введение кватернионов не было просто случайной математикой. В отличие от других ответов, предпочтительный подход в графике на самом деле представляет вращения как кватернионы, так как они занимают меньше места и быстрее объединяются.

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

imallett
источник