Функция точечного произведения не дает угла поворота - PullRequest
1 голос
/ 10 июля 2020

Играя с кватернионами, я заметил, что не могу найти угол поворота вектора, используя скалярное произведение между этим вектором и его исходной позицией. В моем примере я повернул вектор на 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 радианы? Что я здесь не понимаю?

Спасибо за внимание.

1 Ответ

1 голос
/ 11 июля 2020

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

Представьте, если бы ваша точка находилась на ось вращения, то точка не будет перемещаться при применении вращения. Чтобы проверить это, установите точку на (1, 1, 0) / sqrt (2), а угол должен быть равен нулю.

Затем установите точку на (1, -1,0) / sqrt ( 2), и вы должны получить ожидаемое число пи / 2.

Поскольку вы вращаетесь вокруг начала координат, вращением подвергается только компонент точки, перпендикулярной оси вращения.

Хорошая ссылка: https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula

...