#quaternions #euler-angles
#кватернионы #эйлер-углы
Вопрос:
Во-первых, я много погуглил и проверил другие сообщения stackoverflow об этом, но не смог получить рабочий ответ или фрагмент рабочего кода. Математика — не моя сильная сторона.
Мне нужна процедура, которая берет точку камеры (CX, CY, CZ) и поворачивает ее вокруг точки обзора (LX, LY, LZ) на три угла поворота (RX, RY, RZ). Использование поворотов Эйлера в некоторых случаях приводит к блокировке кардана, чего мне нужно избегать. Итак, я услышал об использовании кватернионов.
Я нашел это, чтобы преобразовать вращения в кватернион http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm
и это для преобразования из кватерниона обратно в вращения эйлера XYZhttp://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm
Кажется, они работают нормально, но мне нужно знать, как использовать кватернион для поворота CX, CY, CZ вокруг LX, LY, LZ, а затем вернуть новые CX, CY, CZ без проблем с блокировкой кардана.
Об этом так много написано, что я уверен, хорошее объяснение и фрагмент кода помогут не только мне, но и многим другим в будущем.
Поэтому, пожалуйста, помогите, если можете. Большое спасибо.
Ответ №1:
Короткий ответ, если ваш кватернион равен Q, а новая точка камеры — C’:
C' = Q*(C-L)*Q^-1 L
где точки увеличиваются на Cw = 0, а умножение и инверсия выполняются по правилам кватернионов.
В частности, пусть D = C — L. Тогда мы позволим F = Q * D:
Fw = Qw*0 - Qx*Dx - Qy*Dy - Qz*Dz
Fx = Qw*Dx Qx*0 Qy*Dz - Qz*Dy
Fy = Qw*Dy - Qx*Dz Qy*0 Qz*Dx
Fz = Qw*Dz Qx*Dy - Qy*Dx Qz*0
Наконец, мы получаем C’ = F * Q ^-1 L:
Cw' = 0
Cx' = Fw*Qx - Fx*Qw Fy*Qz - Fz*Qy Lx
Cy' = Fw*Qy - Fx*Qz - Fy*Qw Fz*Qx Ly
Cz' = Fw*Qz Fx*Qy - Fy*Qx - Fz*Qw Lz
Однако имейте в виду, что если вы создаете кватернион из представления Эйлера, вы все равно получите блокировку кардана. Блокировка кардана является свойством представления Эйлера, и кватернион будет просто представлять одно и то же преобразование. Чтобы избавиться от блокировки кардана, вам нужно вообще избегать представления Эйлера, если я не неправильно понимаю, как вы его используете.
Комментарии:
1. Спасибо за советы. Итак, если преобразование euler в qualternion по-прежнему приводит к блокировке кардана, то как я могу изменить положение камеры в 3D пространстве и повернуть ее без каких-либо проблем? Есть ли у меня местоположение камеры XYZ и углы поворота? Я предполагаю, что я не вижу общей картины, но должен быть простой способ изменить положение камеры и повернуть ее вокруг всех 3 осей одновременно без блокировки кардана? Или это наивно?