Играя с кватернионами, я заметил, что не могу найти угол поворота вектора, используя скалярное произведение между этим вектором и его исходной позицией. В моем примере я повернул вектор на 90 градусов вокруг произвольной оси, но скалярное произведение дало другой угол.
// Axis of rotation (unit vector).
Vec3 Axis = Vec3(1, 1, 0) / sqrt(1 + 1 + 0);
// Creates a quaternion that will rotate a point by 90 degrees around the (1, 1, 0) axis.
Quat q(cos(3.14 / 4), Axis * sin(3.14 / 4));
// Creates a point.
Vec3 Point = Vec3(1, 0, 0);
// Rotates the point by q.
Quat Rot = q * Quat(0, Point) * q.GetConjugate();// Rot == (0, 0.5, 0.5, -0.707)
// Getting Rot's coordinates.
Vec3 v = Vec3(Rot.x, Rot.y, Rot.z);
// Angle is equal to 1.047, but it should be 1.57 (3.14/2)...
float Angle = acos(Dot(Point, v));
Обратите внимание, что каждый вектор и кватернион имеют длину 1.
Я нахожу это действительно интригующим, потому что кратчайший угол между вектором, повернутым на 90 градусов, и его исходным положением равен 90 градусов.
Итак, мой вопрос: почему я не получаю 1,57 радианы? Что я здесь не понимаю?
Спасибо за внимание.