2014-11-22 4 views
0

Я пытаюсь повернуть изображение вокруг его центра. вот код:Невозможно повернуть свое изображение вокруг его центра в openGL

glPushMatrix(); 
    glTranslatef(-x, -y, 0); 
    glRotatef(10, 0, 0, 1); 
    glTranslatef(x, y, 0); 
    glBindTexture(GL_TEXTURE_2D, img); 
    glBegin(GL_QUADS); 
    glTexCoord2i(0, 0); 
    glVertex2i(x, y); 
    glTexCoord2i(1, 0); 
    glVertex2i(x+width, y); 
    glTexCoord2i(1, 1); 
    glVertex2i(x+width, y+height); 
    glTexCoord2i(0, 1); 
    glVertex2i(x, y + height); 
    glEnd(); 
    glPopMatrix(); 

Я читаю везде, чтобы перевести мое изображение в центр вращения затем поверните и перевести его обратно. Но когда я пытался сделать это шаг за шагом, я узнал, что когда я переводил, а затем вращал его, он перемещал центр вращения вместе с изображением, поэтому он вращается вокруг точки, которая находится вне экрана на том же расстоянии от изображения, что и исходное точка поворота от исходного изображения до перевода. Может ли кто-нибудь сказать мне, почему это происходит или как это исправить?

+0

Я думаю, вы должны перевести в центр, а не верхний левый угол в точке (0,0). –

ответ

1

Матричные операции и, следовательно, glTranslatef/glRotatef применяются в обратном порядке. Поэтому, когда ваш центр вращения c = (x, y), вам нужно сначала выполнить сначала -c, затем повернуть, а затем перевести c.

В вашем случае, вы должны обменять две строки транслируют на следующее:

glTranslatef(x, y, 0); //Translate back 
glRotatef(10, 0, 0, 1); //Rotate 
glTranslatef(-x, -y, 0); //Translate first along -c 
+0

Спасибо, что сработало. Не знал, что это было применено в обратном порядке. – seMikel

+0

Они технически применяются в написанном порядке, но это связано с пост-умножающими матрицами столбцов и некоммутативной природой матричного умножения. Это та же самая причина, по которой вам обычно приходится писать 'projection * view * model * vtx' в шейдере GLSL, если бы вы имели матрицы строк, вместо этого вы могли бы написать:' vtx * model * view * projection' и получить те же результаты , –

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