Как правильно вращать кватернион по всей оси?
Я хочу закодировать камеру от первого лица с поворотом, хранящимся в кватернионе. К сожалению, что-то не так с вращением.
Следующая функция отвечает за вращение камеры. Параметры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);
}
Чтобы проиллюстрировать результирующее вращение камеры при движении мыши, я покажу вам рисунок руки. С левой стороны показано неправильное вращение, которое фактически выполняет камера. Справа показан нужный правильный регистр. Стрелки показывают, как камера вращается при перемещении мыши вверх (оранжевым цветом) и вниз (синим цветом).
Как видите, пока угол рыскания равен нулю, вращение правильное. Но чем больше рыскание, тем меньше становятся круги, в которых вращается камера. Напротив, круги всегда должны проходить по всей сфере, как долгота.
Я не очень знаком с кватернионами, поэтому здесь я спрашиваю, как правильно их вращать.