Как перевернуть только одну ось матрицы преобразования?
У меня есть матрица преобразования 4х4. Однако, попробовав преобразование, я заметил, что движение и вращение оси Y происходит в противоположном направлении. Остальное правильно.
Я получил эту матрицу из какого-то другого API, так что, вероятно, это разница системы координат. Итак, как я могу перевернуть ось матрицы преобразования?
Если бы только перевод, я мог бы добавить знак минус к переводу Y, но я понятия не имею о противоположном вращении только одной оси, так как все вращение представлено в одной и той же области 3x3. Я подумал, что может быть какой-то способ, который даже повлияет на перевод и вращение одновременно. (действительно переворачивая ось)
2 ответа
Редактировать: Я уверен, что операция, которую вы ищете, - это изменение систем координат при сохранении Z-up или Y-up. В этом случае попробуйте установить все элементы второго столбца (или строки) вашей матрицы в обратном порядке.
Этот вопрос будет лучше для Math StackExchange. Во-первых, очень полезно прочитать о матрицах вращения.
Первая проблема - это вопрос порядка вращения. Я буду предполагать порядок вращения XYZ. Мы знаем, что матрицы вращения для каждой оси таковы:
Учитывая матрицу, полученную из того же порядка вращения, результирующая матрица будет выглядеть следующим образом, где альфа - это угол X, бета - это угол Y, а гамма - это угол Z:
Вы можете вывести отдельные компоненты каждого угла оси из этой матрицы. Например, вы можете получить угол 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, у вас есть ошибка в другом месте.