Я только начинаю работать с Quaternions, но у меня возникают некоторые неприятные трудности с правильной работой простой камеры FPS с Quaternions.
В основном, , всякий раз, когда я пытаюсь переместить мышь, треугольник, который я рисую на экране, сходит с ума и перемещается по экрану быстрее, чем я вижу. Клавиши движения (wsad) работают, как ожидалось, ДО ТОГО, как я перемещаю мышь, и тогда все становится беспорядочно. Я думаю , что проблема в ротации, но последние пару дней я безрезультатно рассказывал об этой проблеме.
Вот видео о том, что происходит: Quaternion Test Видео
Для справки, вот 3 основных класса I. Я использую:
Quaternion.h
CameraSceneNode.h
CameraSceneNode.cpp
Наиболее важные разделы: tick ()
(где я обновляю Quaternion поворота) и render ()
(где я визуализирую «камеру», которая состоит из поворота и перемещения сцены).
Вот метод tick ()
:
void CameraSceneNode::tick(float32 time) {
// movement direction
if (movement_[MOVE_DIR_FORWARD] == 1)
pos_ += rotation_ * vmath::Vector3f(0, 0, -moveSpeed_ * time);
if (movement_[MOVE_DIR_BACKWARD] == 1)
pos_ += rotation_ * vmath::Vector3f(0, 0, moveSpeed_ * time);
if (movement_[MOVE_DIR_LEFT] == 1)
pos_ += rotation_ * vmath::Vector3f(-moveSpeed_ * time, 0, 0);
if (movement_[MOVE_DIR_RIGHT] == 1)
pos_ += rotation_ * vmath::Vector3f(moveSpeed_ * time, 0, 0);
// rotation
if (xRot_ != 0) {
Quaternion quatRotation = Quaternion();
quatRotation.buildFromAxisAngle(1, 0, 0, (xRot_ * time * rotSpeed_) * math::DEGTORAD);
//quatRotation.normalize();
rotation_ = rotation_ * quatRotation;
xRot_ = 0;
rotation_.normalize();
}
if (yRot_ != 0) {
Quaternion quatRotation = Quaternion();
quatRotation.buildFromAxisAngle(0, 1, 0, (yRot_ * time * rotSpeed_) * math::DEGTORAD);
//quatRotation.normalize();
rotation_ = quatRotation * rotation_;
yRot_ = 0;
rotation_.normalize();
}
}
и вот визуализация ()
метод:
void CameraSceneNode::render() {
if (isActive()) {
float32 matrix[16];
rotation_.fillMatrix(matrix);
glMultMatrixf(&matrix[0]);
//glRotatef(rotYTest, 0, 1, 0);
//glRotatef(rotXTest, 1, 0, 0);
glTranslatef(-pos_.x, -pos_.y, -pos_.z);
}
}
Кроме того, прежде чем я вызову render ()
в камере, я запускаю этот фрагмент кода:
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
Оба тик (..)
и render ()
вызываются каждый кадр из моего основного игрового цикла. В классе CameraSceneNode
есть функции, которые принимают изменения направления движения и поворота камеры (т. Е. Меняют буфер motion_
или xRot_
и yRot_
]).
Прошу прощения, если этой информации недостаточно. Некоторые функции (например, fillMatrix (..)
) определены в тех 3 файлах .h / .cpp, на которые я ссылался выше. Я несколько раз проверял класс Quaternion, и он кажется мне правильным. Но опять же, весь код, который я использую, мне кажется правильным, так что кто знает: S
Я полностью в своем уме. Если кто-нибудь может пролить свет на то, почему это не работает, я был бы очень признателен !!
Ура
Джарретт