вращающийся объект относительно камеры в OpenGL - PullRequest
0 голосов
/ 15 декабря 2011

У меня проблемы в OpenGL, когда мой объект (планета) поворачивается относительно текущего вращения камеры.Поначалу кажется, что это работает, но затем, немного повернув, повороты перестают быть правильными / относительно камеры.

Я вычисляю дельту (разницу) в движениях mouseX и mouseY на экране.Вращение хранится в Vector3D, называемом «planetRotation».

Вот мой код для вычисления вращения относительно planetRotation:

Vector3D rotateAmount;
rotateAmount.x = deltaY;
rotateAmount.y = deltaX;
rotateAmount.z = 0.0;

glPushMatrix();
    glLoadIdentity();
    glRotatef(-planetRotation.z, 0.0, 0.0, 1.0);
    glRotatef(-planetRotation.y, 0.0, 1.0, 0.0);
    glRotatef(-planetRotation.x, 1.0, 0.0, 0.0);
    GLfloat rotMatrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, rotMatrix);
glPopMatrix();

Vector3D transformedRot = vectorMultiplyWithMatrix(rotateAmount, rotMatrix);
planetRotation = vectorAdd(planetRotation, transformedRot);

Теоретически, то, что это делает, устанавливаетвращение в переменной 'rotateAmount'.Затем он получает это в пространство модели, умножая этот вектор на матрицу обратного преобразования модели (rotMatrix).

Это преобразованное вращение затем добавляется к текущему вращению.

Чтобы отобразить этонастраиваемое преобразование:

glPushMatrix();
    glRotatef(planetRotation.x, 1.0, 0.0, 0.0);
    glRotatef(planetRotation.y, 0.0, 1.0, 0.0);
    glRotatef(planetRotation.z, 0.0, 0.0, 1.0);
    //render stuff here
glPopMatrix();

Камера колеблется, вращение, которое я пытаюсь выполнить, не похоже на текущее преобразование.

Что я делаю неправильно

1 Ответ

5 голосов
/ 15 декабря 2011

GAH! Не делайте этого:

glPushMatrix();
    glLoadIdentity();
    glRotatef(-planetRotation.z, 0.0, 0.0, 1.0);
    glRotatef(-planetRotation.y, 0.0, 1.0, 0.0);
    glRotatef(-planetRotation.x, 1.0, 0.0, 0.0);
    GLfloat rotMatrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, rotMatrix);
glPopMatrix();

OpenGL - это не математическая библиотека.Для такой работы есть подходящие библиотеки линейной алгебры.


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

Также повороты не добавляются.Они не коммутативны, однако сложение является коммутативной операцией.Повороты на самом деле умножение .

Как исправить код: переписать его с нуля, используя соответствующие математические методыДля этого, пожалуйста, прочитайте темы «Матрицы вращения» и «Кватернионы» (есть в Википедии).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...