2009-12-22 4 views
1

Alors j'essaie de rendre mon programme en mode paysage ... mais je suis confronté à un problème que j'ai de la difficulté à résoudre. Pour descendre sur ma carte, je dois avoir un décalage négatif. Si je garde le yOffset positif actuel de 100 alors la carte défile vers le bas au lieu de monter. Pourquoi est-ce? Je ne suis pas content d'avoir à mettre des coeurs négatifs pour voir la carte. Y a-t-il un moyen de renverser cela pour que la carte défile dans la direction opposée quand yOffset est positif?Pourquoi mes coordonnées y sont-elles inversées?

 float yOffset = 100; 
    float xOffset = 0; 
    glOrthof(0 - yOffset, 
      320 - yOffset, 
      480 + xOffset, 
      0 + xOffset, 
      -10000.0f,10000.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();  
    glTranslatef(320.0f, 0.0f, 0.0f); 
    glRotatef(90.0, 0.0, 0.0, 1.0); 

    static const GLfloat squareVertices[] = { 
    0.0f, 0.0f, 
    1024.0f, 0.0f, 
    0.0f, 1024.0f, 
    1024.0f, 1024.0f 
}; 



static const GLfloat texCoords[] = { 
    0.0, 1.0, 
    1.0, 1.0, 
    0.0, 0.0, 
    1.0, 0.0 
}; 


glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_TEXTURE_2D); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY);  

glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glVertexPointer(2, GL_FLOAT, 0, squareVertices);   


glBindTexture(GL_TEXTURE_2D, mapTexture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 


glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 
glDisable(GL_BLEND); 

Répondre

1

OpenGL uses a "right-handed" coordinate system. Pour changer votre direction y, vous pouvez faire quelque chose comme:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glScalef (1.0f, -1.0f, 1.0f); 
// multiply view transforms as usual... 
// multiply model transforms as usual... 
+1

Veuillez ne pas changer votre direction y. Juste vivre avec le système de coordonnées ajusté. –

+0

Je ne le recommanderais pas non plus, mais il répond à sa question. – luke

+1

Si vous faites cela, et que vous êtes de retour face à l'abattage, assurez-vous d'inverser l'ordre de vos points de polygone. Au lieu de dans le sens antihoraire, ils devront aller dans le sens des aiguilles d'une montre. –

0

OpenGL coordonnées y Inverse axe, par rapport à UIKit (CGxyz etc.) - ou vice-versa, en fonction de votre point de vue.

0

permuter Peut-être ces valeurs: -10000.0f,10000.0f

2

Vos coordonnées Y sont négatives parce que vous faites une rotation de 90 degrés de l'écran 320x480, probablement parce que vous jouez dans le paysage et non portrait. Une rotation de 90 degrés en mathématiques de vecteur peut être exprimé sous la forme:

(X, Y) devient (-Y, X)

qui se passe dans votre appel à glOrtho() lorsque vous fournissez -yOffset dans les limites X et +xOffset en les limites Y Pour corriger cela, je vais avoir un de ces moments "comment fonctionne le calcul 3D à nouveau", alors peut-être que l'un de ces autres bons répondeurs vous aidera.

...

(ancienne version de cette réponse que je ne pense pas est plus correcte, mais il peut être utile):

Deux idées:

Vous pourriez être confondu par la fait que lorsque vous transformez votre matrice en OpenGL, vous ne déplacez pas la caméra. Vous déplacez le monde. Pour faire bouger la caméra, vous devez réellement faire bouger le monde. Mais, ce n'est peut-être pas votre problème en fonction de la façon dont vous vous transformez.

Je remarque que vous faites une rotation de 90 degrés autour de X. J'oublie lequel, mais cela transformera votre + Z en + Y et + Y en -Z, ou cela transformera votre + Z en -Y et votre + Y dans + Z. Cela pourrait être la source de votre inversion d'axe. Vous pouvez essayer de faire pivoter l'autre sens (-90), ou vous ne pouvez pas faire pivoter et utiliser l'orientation des coordonnées natives.