2010-10-21 9 views
0

J'essaye de faire pivoter une image 2D en utilisant OGL ES. Après le chargement, je peux le déplacer à travers l'écran, mais en essayant de faire pivoter l'image par son centre, il a un comportement étrange car le centre de rotation est le coin inférieur gauche de l'écran, pas le centre de l'image. Googling around J'ai lu que je pouvais pousser la matrice actuelle, changer tout ce dont j'avais besoin (traduire les coordonnées, faire pivoter l'image, etc.) puis faire apparaître la matrice revenant à l'état matriciel précédent ... Je l'ai fait mais je ne travaille toujours pas comme je le cherche (mais au moins maintenant, il semble que les coordonnées d'origine où il fait la rotation ne sont pas le coin inférieur gauche ...)Rotation d'image OpenGL ES 1.1 à partir de son centre

Des pensées? Quelqu'un pourrait repérer où mon problème est?

Toute aide serait grandement appréciée! Merci!!

void drawImage(Image *img) 
{ 

    GLfloat fX = (GLfloat)img->x; 

    GLfloat fY = (GLfloat)(flipY(img->m_height+img->y)); 

    GLfloat coordinates[] = { 0, img->m_textureHeight, img->m_textureWidth, img->m_textureHeight, 0, 0, img->m_textureWidth, 0 }; 
    GLfloat  vertices[] = 
    { 
     fX, fY, 0.0, 
     img->m_width+fX, fY, 0.0, 
     fX, img->m_height+fY, 0.0, 
     img->m_width+fX, img->m_height+fY, 0.0 
    }; 

    //Push and change de matrix, translate coords, rotate and scale image and then pop the matrix 
    glPushMatrix(); //push texture matrix 
    glTranslatef((int)fX, (int)fY, 0.0); //translate texture matrix 

    // rotate 
    if (img->rotation != 0.0f) 
     glRotatef(-img->rotation, 0.0f, 0.0f, 1.0f); 

    // scale 
    if (img->scaleX != 1.0f || img->scaleY != 1.0f) 
     glScalef(img->scaleX, img->scaleY, 1.0f); 

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glColor4f(1.0, 0.0, 0.0, 1.0); 
    glBindTexture(GL_TEXTURE_2D, img->m_name); 
    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

    glPopMatrix(); 
} 
+0

Mise en forme du code. – genpfault

+1

Je l'ai fait mais ne fonctionnait pas correctement. Désolé ... Maintenant cela a fonctionné;) – Maruku

Répondre

0

Plus important encore, vous devez comprendre comment effectuer cette opération.

Avant de faire une rotation, vous devez vous traduire dans l'origine de rotation et ensuite seulement appliquer à la rotation.

Découvrez this article qui explique bien.

La répartition est simple:

  • objet de déplacement à l'origine.
  • Rotation.
  • Replacez l'objet.
+0

J'essaye de faire cela mais quelque chose ne fonctionne pas bien. Pour mon code précédent, j'ai ajouté glTranslatef (- (int) fX, - (int) fY, 0.0); revenir à la position d'origine après faire tous les changements, mais ne fonctionne toujours pas. Je vais lire le lien que vous me fournissez. Merci! – Maruku