2009-03-08 5 views
1

Je crée une application OpenGL 2D simple mais je semble rencontrer quelques problèmes d'appareil photo. Quand je dessine un rectangle à (20,20), il est dessiné à (25,20) ou plus. Quand je le dessine à (100, 20), il est tiré à 125 ou plus. Pour certaines raisons, tout est décalé vers la droite de quelques%.Problème de coordonnées OpenGL

J'ai collé une version réduite ici http://pastebin.com/m56491c4c

Y at-il quelque chose de mal avec la façon dont je vais mettre en place GLUT? Je sais que ce n'est pas mes objets qui font quelque chose de bizarre puisque la même chose arrive quand je les désactive.

Merci d'avance.

Répondre

3

Vous devez définir la matrice de projection dans la fonction Reshape (resize()), ce qui permet de résoudre automatiquement le problème de l'utilisateur de redimensionner la fenêtre:

void resize(int w, int h) 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, w, h, 0); 
} 

Et puis dans votre fonction de tirage au sort, assurez-vous que le mode matrice est modèle-vue:

void draw() 
{ 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    ... 
} 

Autres problèmes avec votre code:

  • Vous ne devriez probablement pas appeler glutPostRedisplay() à la fin de draw(). Cela va faire fonctionner votre CPU à 100%. Vous pouvez à la place utiliser glutTimerFunc() pour toujours avoir des mises à jour tous les quelques millisecondes.
  • En processMouse(), vous utilisez wsprintf() sur un tableau de char s: wsprintf() prend un tableau de caractères larges (wchar_t), de sorte que vous devriez faire la variable locale s de type wchar_t[], ou utilisez sprintf() et MessageBoxA() au lieu de wsprintf() et MessageBoxW() (auquel MessageBox() se développe en tant que macro lors de la compilation d'une application Unicode, ce que je suppose que vous faites). Vous êtes également vulnérable à un débordement de tampon - vous devez utiliser un tampon d'au moins 12 caractères, même si, de manière réaliste, vous ne recevrez jamais une valeur x très grande. Enfin, vous devez également utiliser snprintf()/wsnprintf() au lieu de sprintf()/wsprintf() pour vous protéger contre le débordement de la mémoire tampon.
+0

Merci, ça l'a réparé! Merci pour vos autres suggestions. Je sais que c'est un code désordonné, je voulais juste un échantillon de travail rapide à poster. Merci encore! – Alexander

0

Vous semblez appeler votre glOrtho2D sur votre matrice ModelView. Je doute que c'est le problème (puisque je suppose que dans ce cas, votre Projection devrait être l'identité), mais vous devriez toujours l'appeler sur votre matrice de Projection à la place. Vous devez également imprimer w et h dans votre appel de redimensionnement, juste pour vous assurer que la taille de votre fenêtre est bien celle que vous pensez (je ne sais pas comment fonctionne glut, mais glutInitWindowSize() peut inclure des bordures, ce qui gâcherait les choses).

+0

J'ai déjà essayé de le configurer dans l'ordre que vous avez suggéré sans aucune chance. J'ai dérangé avec les sorties et suis assez confiant que la taille de la fenêtre est correcte. Tout à partir d'idées. – Alexander

0

Cela dépend de quel système vous travaillez, mais généralement la plupart des fenêtres des systèmes de coordonnées commencent dans le coin inférieur gauche et comptent jusqu'au sommet et à droite. Dans ce cas, votre appel gluOrth02D serait erroné.

Vous avez:

gluOrtho2D(0, appWidth, appHeight, 0); 

qui a le haut de la cartographie de la fenêtre vers le bas, vice-vers.

La plupart du temps il est:

gluOrtho2D(0, appWidth, 0, appHeight); 

Comme je l'ai dit dépend du système, la plate-forme de votre travail avec. Je ne peux parler que pour la plupart des implémentations Linux.

Juste autre chose à vérifier au cas où cela affecterait votre bug.

Questions connexes