Поверните трехмерную точку Эйлера с помощью кватернионов, чтобы избежать блокировки подвеса

Во-первых, я много гуглил и проверял другие сообщения stackoverflow по этому поводу, но не могу получить рабочий ответ или фрагмент рабочего кода. Математика - не моя сила.

Мне нужна процедура, которая берет точку камеры (CX, CY, CZ) и вращает ее вокруг точки обзора (LX, LY, LZ) на три угла поворота (RX, RY, RZ). Использование вращения Эйлера в некоторых случаях приводит к блокировке кардана, чего мне следует избегать. Итак, я слышал об использовании кватернионов.

Я нашел это для преобразования вращений в кватернион http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm.

и это для преобразования из кватерниона обратно в вращения Эйлера по XYZ http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm

Кажется, они работают нормально, но мне нужно знать, как использовать кватернион для поворота CX, CY, CZ вокруг LX, LY, LZ, а затем вернуть новый CX, CY, CZ без проблем с блокировкой кардана.

Об этом так много сказано, что я уверен, что хорошее объяснение и фрагмент кода помогут не только мне, но и многим другим в будущем.

Так что, пожалуйста, помогите, если сможете. Большое спасибо.


person TallGuy    schedule 13.06.2011    source источник


Ответы (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

Однако имейте в виду, что если вы создаете кватернион из представления Эйлера, вы все равно получите блокировку кардана. Карданный замок - это свойство представления Эйлера, и кватернион будет просто представлять то же преобразование. Чтобы избавиться от блокировки кардана, вам нужно вообще избегать представления Эйлера, если я не понимаю, как вы его используете.

person JCooper    schedule 17.06.2011
comment
Спасибо за советы. Итак, если преобразование Эйлера в квалитернион по-прежнему приводит к блокировке кардана, как я могу без проблем взять положение камеры в трехмерном пространстве и повернуть его? Если у меня есть положение камеры XYZ и углы поворота? Я предполагаю, что я не вижу полного изображения, но должен быть простой способ взять положение камеры и повернуть ее вокруг всех трех осей одновременно без блокировки кардана? Или это наивно? - person TallGuy; 17.06.2011