Ich bin in einer Multimedia-Klasse im College und wir "lernen" OpenGL als Teil der Klasse. Ich versuche herauszufinden, wie die OpenGL-Kamera im Vergleich zur Modellansicht funktioniert, und habe dieses Beispiel gefunden. Ich versuche, das Beispiel mithilfe der OpenGL-Bindungen auf Python zu portieren - es startet OpenGL viel schneller, daher ist es zu Testzwecken viel besser -, aber ich stoße immer wieder auf einen Stapelüberlauffehler mit der glPushMatrix in diesem Code:
def cube():
for x in xrange(10):
glPushMatrix()
glTranslated(-positionx[x + 1] * 10, 0, -positionz[x + 1] * 10); #translate the cube
glutSolidCube(2); #draw the cube
glPopMatrix();
Nach dieser Referenz geschieht dies, wenn der Matrixstapel voll ist.
Also dachte ich: "Nun, wenn es voll ist, lass mich einfach die Matrix von der Oberseite des Stapels entfernen, und es wird Platz geben." Ich habe den Code geändert in:
def cube():
glPopMatrix()
for x in xrange(10):
glPushMatrix()
glTranslated(-positionx[x + 1] * 10, 0, -positionz[x + 1] * 10); #translate the cube
glutSolidCube(2); #draw the cube
glPopMatrix();
Und jetzt erhalte ich einen Pufferunterlauffehler - der anscheinend auftritt, wenn der Stapel nur eine Matrix hat.
Also bin ich in meinem Verständnis nur von der Basis abgekommen? Oder gibt es eine Möglichkeit, die Größe des Matrixstapels zu erhöhen?
Wenn jemand gute (Online-) Referenzen (Beispiele usw.) hat, um zu verstehen, wie die Kamera- / Modellmatrizen zusammenarbeiten, würde ich sie aufrichtig schätzen!
Vielen Dank!
BEARBEITEN:
Hier ist der Pastebin des vollständigen Codes: http://pastebin.com/QXxNisuA
Antworten:
Bearbeitet, um hinzuzufügen: Dies ist vorerst nicht wichtig, da es immer noch gut funktioniert und das Erlernen von OpenGL erleichtert. Beachten Sie jedoch, dass das gesamte Matrix-Stack-System in OpenGL 3.x und darüber hinaus veraltet ist. Ein möglicher Ersatz ist GLM .
Der Code in Ihrem Pastebin läuft nicht einmal für mich.
Insbesondere liegen Ihre Listenindizes in der Anzeigefunktion außerhalb des Bereichs (Ihre Liste enthält 10 Elemente: Python-Listen beginnen bei 0; Sie indizieren von 0 + 1 bis 10 + 1).
Ich denke, Sie hatten auch einige Globals in der Maushandhabungsfunktion vermisst, aber das könnte daran liegen, dass ich Code verschiebe, um ihn zumindest wie Python aussehen zu lassen;)
Wie auch immer, mit diesen Korrekturen funktioniert der unten gezeigte Code für mich, ohne Anzeichen eines Unter- / Überlaufs des GL-Matrixstapels!
quelle
OpenGL kann Matrizen mit
glPushMatrix
und auf einem Stapel speichern und wiederherstellenglPopMatrix
. Es ist sehr wichtig, dass jeder Push einen entsprechenden Pop hat. Wenn Sie mehr Push als Pop ausführen, wird Ihnen mitgeteilt, wenn die gesamte Zeichnung beendet ist, dass Sie den Stapel überlaufen. Wenn Sie mehr knallen als drücken, wird Ihnen sofort mitgeteilt, dass der Stapel unterfüllt ist. Auf diese Weise können Sie mit OpenGL Programmierfehler lokalisieren.Stellen Sie also sicher, dass alle Pushs überall einen entsprechenden Pop haben.
Stellen Sie überall dort, wo Sie drücken, sicher, dass am Ausgang dieses Codeblocks ein entsprechender Pop vorhanden ist.
Wenn Ihr Code eine Ausnahme auslöst (dh wenn Sie in Ihrem Array außerhalb der Grenzen iterieren?), Müssen Sie den Pop möglicherweise in einen finally-Block einfügen, z.
quelle