Как перевернуть только одну ось матрицы преобразования?

У меня есть матрица преобразования 4х4. Однако, попробовав преобразование, я заметил, что движение и вращение оси Y происходит в противоположном направлении. Остальное правильно.

Я получил эту матрицу из какого-то другого API, так что, вероятно, это разница системы координат. Итак, как я могу перевернуть ось матрицы преобразования?

Если бы только перевод, я мог бы добавить знак минус к переводу Y, но я понятия не имею о противоположном вращении только одной оси, так как все вращение представлено в одной и той же области 3x3. Я подумал, что может быть какой-то способ, который даже повлияет на перевод и вращение одновременно. (действительно переворачивая ось)

2 ответа

Решение

Редактировать: Я уверен, что операция, которую вы ищете, - это изменение систем координат при сохранении Z-up или Y-up. В этом случае попробуйте установить все элементы второго столбца (или строки) вашей матрицы в обратном порядке.


Этот вопрос будет лучше для Math StackExchange. Во-первых, очень полезно прочитать о матрицах вращения.

Первая проблема - это вопрос порядка вращения. Я буду предполагать порядок вращения XYZ. Мы знаем, что матрицы вращения для каждой оси таковы:

Матрицы вращения для каждого компонента оси XYZ

Учитывая матрицу, полученную из того же порядка вращения, результирующая матрица будет выглядеть следующим образом, где альфа - это угол X, бета - это угол Y, а гамма - это угол Z:

Завершенная матрица вращения для порядка вращения XYZ

Вы можете вывести отдельные компоненты каждого угла оси из этой матрицы. Например, вы можете получить угол Y из -sin(beta) используя некоторый обратный триггер. Учитывая бета, вы можете получить альфа из cos(beta)sin(alpha), Вы также можете получить гамму из cos(beta)sin(gamma), Обратите внимание, что одно и то же число в матрице может представлять несколько значений (например, sin(0)=0 а также sin(180)=0).

Теперь, когда вы знаете альфа, бета и гамму, вы можете отменить бета и переделать матрицу вращения.

Есть хороший шанс, что есть лучший способ сделать это с помощью кватернионов, но вы должны задать Math StackExchange эти не зависящие от языка вопросы.

Гораздо более короткий ответ: если вы не будете осторожны с ориентацией фрейма, у многих вещей в вашем конвейере, вероятно, будет плохой день волос. Причиной является "паритет", он же "ориентация кадра", он же " правша" (или редко левша). Большинство инструментов и библиотек трехмерной геометрии, которые работают вместе, обычно неявно предполагают, что все системы координат в игре правосторонние (или, по крайней мере, последовательно). Инвертирование ориентации только одной оси в системе координат меняет ее ориентацию справа налево или наоборот.

Итак, предложение для вещей, чтобы проверить и попробовать в вашей проблеме:

  • Убедитесь, что кадр, который вы получаете от вашего API, правша. Вы делаете это, вычисляя определитель части вращения 3x3 вашей матрицы преобразования 4x4: она должна быть +1 или очень близко к ней.

  • Если это -1, тогда переверните один, если его ось, то есть измените знак одного из столбцов вращения 3x3.

  • Обратите внимание: я сказал "столбцы", потому что я предполагаю, что вы применяете преобразование Q к точке x путем умножения на Q * x, где x является вектором столбца 4x1 с последним компонентом, равным единице. Если вы используете векторы строк, умноженные влево на Q, вам нужно перевернуть строку.

  • Если этот определитель равен +1, у вас есть ошибка в другом месте.

Другие вопросы по тегам