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.

Était-ce utile?

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 de draw () . Cela va faire fonctionner votre CPU à 100%. Vous pouvez plutôt utiliser glutTimerFunc () pour toujours avoir des mises à jour toutes les quelques millisecondes.
  • Dans processMouse () , vous utilisez wsprintf () sur un tableau de char s: wsprintf () prend un tableau de caractères larges ( wchar_t ), vous devez donc créer la variable locale s de type wchar_t [] , ou utiliser 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 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 valeur x . Enfin, vous devez également utiliser snprintf () / wsnprintf () au lieu de sprintf () / 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top