2011-12-15 6 views
0

У меня возникают проблемы с OpenGL, когда мой объект (планета) вращается относительно текущего вращения камеры. Кажется, что это работает сначала, но затем, после поворота немного, вращение больше не правильное/относительно камеры.Вращающийся объект относительно камеры в 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(); 

Камера вид качаний вокруг, вращения я пытаюсь выполнить, кажется, не по отношению к текущей трансформации.

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

ответ

5

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 не математическая библиотека. Для такого рода работ существуют собственные библиотеки линейной алгебры.


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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^