Как использовать кватернионы для описания угла поворота более 360 градусов 360 - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь использовать кватернионы для анимации вращения.Мой алгоритм создает кватернионы и сперлинг каждого кадра.Вот мой код для построения кватерниона по оси и углу поворота.

template <typename U>
Quaternion(Vector3<U> vec, const float& angle)
{
    vec.normalize();
    float cosa = cos(angle/2);
    float sina = sin(angle/2);
    w = cosa;
    x = sina * vec.x;
    y = sina * vec.y;
    z = sina * vec.z;
}

Затем я обнаружил, что когда я пытался повернуть 4π радиан, анимация не работает, потому что созданный мной кватернион эквивалентен0 градусовИнтересно, могут ли кватернионы представлять вращения на 360 градусов?Или мой алгоритм анимации нуждается в улучшении?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Интересно, могут ли кватернионы представлять повороты на 360 градусов?

Нет, это невозможно.

Кватернионы между диапазонами [360; 720] будут рассматриваться каквращения в другом направлении: [-360; 0].

и кватернионы между диапазонами [720 * k;720 * (k + 1)] будет рассматриваться как вращение [0; 720].

Если вы используете slerp для анимации такого типа, кватернионы не подходят для них.

Кватернионы могуттолько прогон между углами меньше 360.

Если вы все еще хотите это сделать, используйте другое представление, например, axis-angle.

0 голосов
/ 19 декабря 2018

Думайте о кватернионах как о мгновенных вращениях - мгновенное вращение на 4π радиан равносильно тому, что вы ничего не делаете.

Это не то, что вам нужно, когда вы анимируете вращение 4π радиан за 20 секунд.Вы можете решить эту проблему, создав вектор Эйлера (трехмерный вектор, направление которого представляет ось вращения, как в кватернионе, а его длина представляет скорость / угол вращения), см. https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation. Позже, умножьте егопо прошествии времени и преобразовать его в кватернионную или трехмерную матрицу в зависимости от того, что хочет ваша графика.

0 голосов
/ 19 декабря 2018

Поворот на 360 градусов равен так же, как вращение на 0 градусов.Чтобы повернуть на угол alpha больше 360, просто поверните на alpha-360 или более широко на alpha % 360.

(360 используется как синоним для 2pi, вам нужно позаботиться о градусах и радианахконечно. И не уверен, что это опечатка, но 360 градус 2pi не 4pi)

PS: На самом деле я думаю, что в вашем коде нет ничего плохого, и, возможно, вам не придетсяизменить что-нибудь.Это просто ваши ожидания, которые были неверны: вы должны получить то же самое для вращения на 4pi, чем для вращения на 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...