Problème de coordonnées OpenGL [fermé]
Question
Je suis en train de créer une application 2D OpenGL simple, mais il semble que je rencontre des problèmes de caméra. Lorsque je dessine un rectangle à (20,20), il est dessiné à (25,20) ou à peu près. Lorsque je le dessine à (100, 20), il est dessiné à 125 ou plus. Pour certaines raisons, tout est déplacé vers la droite de quelques pour cent.
J'ai collé une version réduite ici http://pastebin.com/m56491c4c
Y at-il quelque chose qui cloche dans la façon dont je configure GLUT? Je sais que ce ne sont pas mes objets qui font quelque chose de bizarre puisque la même chose se produit lorsque je les désactive.
Merci d'avance.
La solution
Vous devez définir la matrice de projection dans la fonction de remodelage ( resize ()
), ce qui résout aussi automatiquement le problème de redimensionnement de la fenêtre par l'utilisateur:
void resize(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, w, h, 0);
}
Ensuite, dans votre fonction de dessin, 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 dedraw ()
. Cela va faire fonctionner votre CPU à 100%. Vous pouvez plutôt utiliserglutTimerFunc ()
pour toujours avoir des mises à jour toutes les quelques millisecondes. - Dans
processMouse ()
, vous utilisezwsprintf ()
sur un tableau dechar
s:wsprintf ()
prend un tableau de caractères larges (wchar_t
), vous devez donc créer la variable locales
de typewchar_t []
, ou utilisersprintf ()
etMessageBoxA ()
au lieu dewsprintf ()
etMessageBoxW ()
(auquelMessageBox ()
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 mémoire tampon. Vous devez utiliser une mémoire tampon d’au moins 12 caractères, même si, de façon réaliste, vous ne recevrez jamais une très grande valeurx
. Enfin, vous devez également utilisersnprintf () / wsnprintf ()
au lieu desprintf () / wsprintf ()
pour vous protéger contre le débordement de mémoire tampon.
Autres conseils
Vous semblez appeler votre glOrtho2D sur votre matrice ModelView. Je doute que ce soit le problème (puisque je suppose que dans ce cas, votre projection devrait être l'identité), mais vous devriez quand même l'appeler sur votre matrice de projection.
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, qui gâcherait les choses).
Cela dépend du système sur lequel vous travaillez, mais la plupart des systèmes de coordonnées Windows commencent généralement par le coin inférieur gauche et sont comptés en haut et à droite. Dans ce cas, votre appel gluOrth02D serait faux.
Vous avez:
gluOrtho2D(0, appWidth, appHeight, 0);
Qui a le haut de la fenêtre mappé en bas, vice-vers.
La plupart du temps, c'est:
gluOrtho2D(0, appWidth, 0, appHeight);
Comme je l’ai dit, cela dépend du système, de la plateforme sur laquelle vous travaillez. Je ne peux parler que de la plupart des implémentations Linux.
Juste quelque chose d'autre à vérifier au cas où cela affecterait votre bogue.