Quaternion-Based-Camera нежелательный рулон

0

Я пытаюсь реализовать камеру на основе кватернионов, но при перемещении вокруг оси X и Y камера создает нежелательный рулон по оси Z. Я хочу иметь возможность свободно оглядываться по всей оси. Я читал другие темы об этой проблеме (например: http://www.flipcode.com/forums/thread/6525), но я не понимаю, что подразумевается под "Исправить это, непрерывно перестраивая матрицу поворота на вращаясь вокруг оси WORLD, т.е. около <1,0,0>, <0,1,0>, <0,0,1>, а не ваши локальные координаты, какими бы они ни были. "

//Camera.hpp
glm::quat rotation;

//Camera.cpp
void Camera::rotate(glm::vec3 vec)
{
    glm::quat paramQuat = glm::quat(vec);
    rotation = paramQuat * rotation;
}

Я вызываю функцию rotate следующим образом:

cam->rotate(glm::vec3(0, 0.5, 0));

Это должно быть связано с локальными/мировыми координатами, верно? Я просто не понимаю, так как я думал, что кватернионы всегда основаны друг на друге (таким образом, кватернион не может находиться в "мире" или "местном" пространстве?). Кроме того, следует ли использовать более одного кватерниона для камеры?

Теги:
opengl
math
3d
directx

1 ответ

1
Лучший ответ

Насколько я понимаю, и, глядя на код, который вы указали, они подразумевают, что вы не должны хранить и применять ротацию постепенно, применяя поворот на квартете вращения все время, но вместо этого отслеживая два кватерниона для каждая ось (X и Y в мировом пространстве) и вычисление вектора вращения как произведение этих величин.

[edit: некоторый добавленный (псевдо) код]

// Camera.cpp
void Camera::SetRotation(glm::quat value)
{
    rotation = value;
}

// controller.cpp --> probably a place where you'd want to translate user input and store your rotational state
xAngle += deltaX;
yAngle += deltaY;
glm::quat rotationX = QuatAxisAngle(X_AXIS, xAngle);
glm::quat rotationY = QuatAxisAngle(Y_AXIS, yAngle);
camera.SetRotation(rotationX * rotationY);
  • 0
    Вы имеете в виду, что в методе rotate мне придется разделить vec glm :: vec3 на кватернионы X и Y, а затем умножить каждый на локальный кватернион X и Y в классе камеры? Как бы я разделить это вращение?
  • 0
    Возможно, я бы просто сохранил один параметр вращения в классе камеры и сохранил логику обновления в контроллере (так что вы также можете использовать камеру, если вы когда-нибудь решите создать чистый контроллер полета и т. Д., Или вы можете использовать те же или подобные контроллеры на обычные объекты в вашей сцене). Это, по сути, заменит метод rotate чистым установщиком (см. Пример кода, который я редактировал в).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню