Как правильно вращать кватернион по всей оси?

Я хочу закодировать камеру от первого лица с поворотом, хранящимся в кватернионе. К сожалению, что-то не так с вращением.

Следующая функция отвечает за вращение камеры. ПараметрыMouse а такжеSpeed передать движение мыши и скорость вращения. Затем функция выбирает кватернион вращения, вращает его и сохраняет результат. Кстати, ям используюПуля Физика вот откуда берутся типы и функции.

void Rotate(vec2 Mouse, float Speed)
{
    btTransform transform = camera->getWorldTransform();
    btQuaternion rotation = transform.getRotation();

    Mouse = Mouse * Speed;                    // apply mouse sensitivity
    btQuaternion change(Mouse.y, Mouse.x, 0); // create quaternion from angles
    rotation = change * rotation;             // rotate camera by that

    transform.setRotation(rotation);
    camera->setWorldTransform(transform);
}

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

Как видите, пока угол рыскания равен нулю, вращение правильное. Но чем больше рыскание, тем меньше становятся круги, в которых вращается камера. Напротив, круги всегда должны проходить по всей сфере, как долгота.

Я не очень знаком с кватернионами, поэтому здесь я спрашиваю, как правильно их вращать.

Ответы на вопрос(2)

Ваш ответ на вопрос