Frage

Ich erstelle eine einfache 2D-OpenGL-Anwendung, aber ich scheinen einige Kamera Probleme zu erleben. Wenn ich ein Rechteck bei (20,20) ziehen, ist es bei (25,20) oder so gezogen. Als ich es bei (100, 20) ziehen, ist es bei 125 oder so gezogen. Aus irgendwelchen Gründen nach rechts von einigem% verschoben wird alles.

Ich habe eine abgespeckte Version hier eingefügt http://pastebin.com/m56491c4c

Gibt es etwas falsch mit der Art, wie ich bin GLUT einrichten? Ich weiß, es ist nicht meine Objekte etwas zu tun, seltsam, da das gleiche passiert, wenn ich sie zu deaktivieren.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Sie müssen die Projektionsmatrix in der Umformungsfunktion (resize()) einzustellen, die auch automatisch das Problem des Benutzers löst Ändern der Größe des Fensters:

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

Und dann in der Zeichenfunktion, stellen Sie sicher, dass der Matrix-Modus Model-View:

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

Weitere Probleme mit Ihrem Code:

  • Sie sollten wahrscheinlich nicht glutPostRedisplay() am Ende draw() anrufen. Das wird Ihre CPU läuft auf 100% machen. Sie können stattdessen glutTimerFunc() verwenden, um noch Updates haben alle eine bestimmte Anzahl von Millisekunden.
  • In processMouse(), sind Sie wsprintf() auf eine Reihe von chars mit: wsprintf() nimmt eine Reihe von breiten Zeichen (wchar_t), so dass Sie die lokale Variable s vom Typ wchar_t[] machen sollte, oder verwenden Sie sprintf() und MessageBoxA() statt wsprintf() und MessageBoxW() (auf die MessageBox() erweitert als Makro, wenn eine Unicode-Anwendung kompiliert, die ich nehme an, dass Sie tun). Sie sind auch anfällig für einen Pufferüberlauf - Sie einen Puffer von mindestens 12 Zeichen verwendet werden sollen, obwohl realistisch werden Sie nie einen sehr großen x Wert übergeben werden. Schließlich sollten Sie auch snprintf()/wsnprintf() statt sprintf()/wsprintf() verwenden gegen den Pufferüberlauf zu schützen.

Andere Tipps

Sie scheinen Ihren glOrtho2D auf Ihrer Modelview Matrix zu rufen. Ich bezweifle, dass das ist das Problem (da ich in diesem Fall raten, Ihre Projektion sollte die Identität sein), aber Sie sollten es nach wie vor statt auf Ihrer Projection Matrix nennen.

Sie sollten auch w und h in Ihrem Resize Anruf ausdrucken, nur um sicher zu stellen, dass Ihre Fenstergröße ist eigentlich das, was Sie denken, es ist (ich weiß nicht, wie Schwemme funktioniert, aber glutInitWindowSize () kann Grenzen umfassen, die würde durcheinander zu bringen).

Es hängt davon ab, welches System Sie gerade arbeiten, aber in der Regel die meisten Fenster Koordinatensysteme in der unteren linken Ecke beginnen und nach oben und nach rechts zählen. In diesem Fall würde Ihr gluOrth02D Anruf falsch sein.

Sie haben:

gluOrtho2D(0, appWidth, appHeight, 0);

, welche den oberen Rand der Fenster Abbildung auf den Boden, Vize-Vers hat.

Die meiste Zeit ist es:

gluOrtho2D(0, appWidth, 0, appHeight);

Wie ich sagte, es auf dem System abhängt, Plattform mit Ihrer Arbeit. Ich kann nur für die meisten Linux-Implementierungen sprechen.

Nur etwas anderes zu prüfen, nur für den Fall es Ihre Fehler zu beeinflussen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top