Не работает вращение кватернионов

Я только начинаю работать с Quaternions, но у меня возникают некоторые неприятные трудности с правильной работой простой камеры FPS с Quaternions.

В основном, , всякий раз, когда я пытаюсь переместить мышь, треугольник, который я рисую на экране, сходит с ума и перемещается по экрану быстрее, чем я вижу. Клавиши движения (wsad) работают, как ожидалось, ДО ТОГО, как я перемещаю мышь, и тогда все становится беспорядочно. Я думаю , что проблема в ротации, но последние пару дней я безрезультатно рассказывал об этой проблеме.

Вот видео о том, что происходит: Quaternion Test Видео

  • Чтобы увидеть ввод с помощью мыши, смотрите сначала.
  • Чтобы увидеть ввод с клавиатуры (вперед, назад и т. Д.), Перейдите к 0:51 секунде.

Для справки, вот 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

Я полностью в своем уме. Если кто-нибудь может пролить свет на то, почему это не работает, я был бы очень признателен !!

Ура

Джарретт

5
задан Jarrett 15 June 2011 в 22:49
поделиться