Вращение матрицы 3х3 при переполнении стека

Хорошо, во-первых, я знаю, что подобные вопросы есть во всем Интернете, я посмотрел больше, чем хотел бы сосчитать, я пытался выяснить это в течение почти 3 недель (не постоянно, только вкл и выкл. , надеясь на проблеск озарения).

В конце концов, то, что я хочу получить, — это функция, в которой вы передаете, на сколько вы хотите повернуть (в настоящее время я работаю в Radian’s, но я могу использовать градусы или радианы), и она возвращает матрицу вращения, сохраняя любую переводы у меня были.

Я понимаю, что формула для поворота на оси «Z» в двумерной декартовой плоскости, это:

[cos(radians)    -sin(radians)    0]
[sin(radians)     cos(radians)    0]
[0                0               1]

Я достаточно хорошо понимаю математические математические системы (сложение, вычитание, умножение и детерминант / обратное), но я не понимаю, как сделать шаг за шагом создание матрицы, которую я могу использовать для вращения, сохраняя любой перевод ( и все остальное, например, масштаб), которое у него есть.

Из того, что я собрал из других примеров, следует умножить мою текущую Матрицу (какой бы она ни была, давайте пока воспользуемся Матрицей Идентичности) на Матрицу, подобную этой:

[cos(radians) - sin(radians)]
[sin(radians) + cos(radians)]
[1]

Но тогда моя оригинальная Матрица была бы матрицей 3х1 вместо 3х3, не так ли? Я не уверен, что мне не хватает, но что-то мне не кажется правильным. Я не обязательно ищу код для того, чтобы кто-то написал для меня, просто чтобы понять, как это сделать правильно, и тогда я могу написать его сам. (не сказать, что я не буду смотреть на чужой код :))

(Не уверен, что это имеет значение для кого-то, но на всякий случай, с использованием 64-битной Windows 7, Visual Studio 2010 Ultimate, и я считаю, OpenGL, это для Uni)

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

Матрица перевода (опять же, давайте использовать Identity) выглядит примерно так:

[1, 0, X translation element]
[0, 1, Y translation element]
[0, 0, 1]

0

Решение

Во-первых, вы не можете иметь перевод 3x3 матрица для 3D пространство. Вы должны использовать гомогенный 4x4 матрицы.

После этого создайте отдельную матрицу для каждого преобразования (перемещение, вращение, масштаб) и умножьте их, чтобы получить окончательную матрицу преобразования (умножение 4x4 матрица даст вам 4x4 матрица)

2

Другие решения

Давайте проясним некоторые моменты:

Ваш объект состоит из трехмерных точек, которые в основном представляют собой матрицы 3 на 1.

Вам нужна матрица вращения 3 на 3, чтобы повернуть ваш объект: R, но если вы также добавите условия перевода, матрица преобразования будет 4 на 4:

[R11, R12, R13 tx]
[R21, R22, R23 ty]
[R31, R32, R33 tz]
[0,   0,   0,   1]

Для терминов R вы можете посмотреть на:http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/, они зависят от углов поворота каждой оси.

Чтобы повернуть ваш объект, каждая трехмерная точка умножается на эту матрицу вращения. На каждые 3 на 1 балл вам также нужно добавить 4-й член (коэффициент масштабирования), который равен 1 при условии фиксированной шкалы:

[x y z 1]'

Результирующий вектор продукта будет 4 на 1, а последний член — это масштабный член, который снова равен 1 и может быть удален.

Результирующие повернутые точки объекта — это новые 3D-точки продукта.

1

Я столкнулся с той же проблемой и нашел удовлетворительную формулу в этот ТАК вопрос.
Позволять (cos0, sin0) быть соответственно значениями косинуса и синуса вашего угла, и (x0, y0) координаты центра вашего вращения.
Преобразовать 2d точку координат (x,y), вы должны умножить его однородные координаты 3×1 (x,y,1) по этой матрице 3х3:

[cos0,    -sin0,   x0-(cos0*x0 - sin0*y0)]
[sin0,     cos0,   y0-(sin0*x0 + cos0*y0)]
[   0,        0,                       1 ]

Значения в третьем столбце — это объем перевода, необходимый для применения, когда центр вращения не является источником системы.

0