Вращение как в локальной, так и в мировой системе координат - PullRequest
0 голосов
/ 25 января 2019

Давайте рассмотрим простой случай, когда у нас есть объект с матрицей преобразования, а затем мы делаем простые преобразования:

  1. повернуть ось х на угол X1 -> матрица
  2. повернуть ось Y на угол Y1 -> матрица B
  3. повернуть ось x на угол X2 -> матрица C

В обычном случае я бы сделал C * B * A, и это было бы концом истории. Но, как мы знаем, он применяет новое преобразование в локальной системе координат, созданной предыдущим преобразованием. Мне это не нравится.

Что я хотел бы сделать в некоторых определенных ситуациях, так это вращаться в локальной, а иногда и в другой мировой системе координат. Я имею в виду, что если у меня есть матрица M = B * A (но у меня нет доступных углов X1 и Y1; все, что у меня есть, это M), и я хотел бы применить C в мировой системе координат тогда выходная новая матрица преобразования будет иметь следующий вид:

  • x вращение = X1 + X2
  • y вращение = Y1

Есть ли способ достичь этого?

EDIT

Я думаю, что объяснил неправильно.

Давайте предположим, что у нас есть объект A в положении, описанном матрицей M. M имеет вращение, масштабирование и перемещение. Я хотел бы вращать объект вдоль осей, расположенных в центре объекта A, но параллельно осям базовой системы координат. В конце концов, я также хотел бы, чтобы объект оставался в точке (x, y, z) в базовой системе координат.

1 Ответ

0 голосов
/ 25 января 2019

В обычном случае я бы сделал C * B * A, и это был бы конец истории. Но, как мы знаем, он применяет новое преобразование в локальной системе координат, созданной предыдущим преобразованием.

Неправильно.

Рассмотрим контрольную точку p. Координаты B * A * p в локальной системе координат B * A - это просто компоненты мирового пространства p, потому что преобразование - это просто изменение системы координат.

Таким образом, замена p на C * p применяет преобразование локально , т. Е .:

  • C * (B * A) применяется C в мире системе координат
  • (B * A) * C применяется C в локальной системе координат B * A

EDIT

Чтобы повернуть объект вокруг его положения p:

  • Перевести на -p
  • Применить желаемую матрицу вращения C
  • Перевести на +p, чтобы восстановить исходное положение

Конечная матрица - T * C * inv(T) * M, где T - перевод p, а M - исходная матрица. p задается последним столбцом M.

...