OpenGL gestreckten Formen - Seitenverhältnis
Habe ich meine openGL-Ansicht mit einer Größe von (sagen wir..) 800(Breite)x600(Höhe).
Dann bekam ich ein 2D-Objekt coords:
0.0 , 0.0
0.1 , 0.0
0.1 , 0.1
0.0 , 0.1
diese, wie Sie verstehen, ist eigentlich ein Quadrat (basierend auf der Analogie).
Aber auf meine openGL-Ansicht druckt diese gedehnt. Jetzt verstehe ich, warum dies geschieht. Es ist im Grunde, weil im arbeiten auf die Standard-matrix von -1,1.
Und da meine Auflösung von 800x600 nicht mit einem Seitenverhältnis von 1, meine Form ist immer gestreckt.
Jetzt bin ich mehr daran interessiert, wie man dieses Problem beheben. Ich habe gelesen, über Funktionen wie glFrustum, glOrtho, glViewPort das geschehen auf der Projektions-matrix und kann bei Fragen. Die Sache ist die, ich bin nicht sicher, mit Ihnen. Was ich im Grunde möchte ist, halten Sie die oben genannten Koords, wenn Sie eine Quadrat-und tatsächlich erscheinen als ein Feld in meiner Ansicht.
Was ist der richtige Weg zur Bekämpfung dieses Problems?
InformationsquelleAutor Bisder | 2012-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update: Erklärung, was passiert
OpenGL ist eine state machine, und im Fall von OpenGL 2.1 und unten verfügt über eine Reihe von Transformationsmatrizen. Ein vertex ↑v ersten multipliziert wird mit der modelview - matrix ergeben ein Augen-Koordinate vertex ↑v', die für die Beleuchtung verwendet Berechnungen. Dann ↑v' multipliziert Projektion matrix zu erreichen, die so genannte clip space ↑v", wo (der name deutet es schon) ist die clipping-Operationen durchgeführt werden (oder zumindest Ihr Ergebnis definiert ist). Aus dem clip-Raum der so genannte die Normalisierten Device Koordinaten (NDC) werden erreicht durch die Berechnung ↑v#{x,y,z,w} = ↑v{x,y,z,w}/↑v_w
↑v# definiert ist, werden im Bereich [-1 ... 1], die zugeordnet ist, füllen Sie den ausgewählten viewport rect. Der viewport hat keinen Einfluss auf die transformation von Matrizen! Es ist nur die transformation von NDC auf Fenster-Koordinaten definiert.
In dem code oben habe ich den modelview-matrix, um die Identität, d.h. die Eckpunkte gehen in die Projektion, wie Sie sind. Die Projektion selbst ist ein ortho-Projektion, die Karten der x-Wert Bereich [-Aspekt ... Aspekt] → [-1 ... 1] und y Wertebereich [-1 ... 1] → [-1 ... 1] (also keine änderung für die y). So Eckpunkte verwandelt durch das Fenster Aspekt, um fit in die NDC zu viewport-Wert-Bereich.
Und warum habe ich dir gesagt, dass OpenGL ein Zustandsautomat? Weil es bedeutet, dass Sie wechseln können, Projektionen und Transformationen zu jeder Zeit. Also, wenn Sie brauchen, um machen eine minimap, nicht der Kampf mit bekommen es platziert in der 3D-Szene. Schalten Sie einfach die viewport und Projektion für. Im Allgemeinen sollten Sie alle rendering-Zustand (das bedeutet, dass alle Matrizen) in der Zeichnung Funktion. Fenster event-Handler (außer dem redraw handler) durchführen sollten keine OpenGL-Operationen überhaupt.
hervorragende Erklärung, in der Tat, ich kam mit ein paar nette Ideen im eifrig zu versuchen. Dank
Ich bin verwirrt. Nicht die ortho-Projektion Karte
[-aspect,aspect] -> [-1,1]
statt Umgekehrt?Das ist in der Tat der Fall, war irgendwie denken "in reverse", wenn ich schrieb, dass im wesentlichen die, die Sie zuordnen möchten der NDC-Koordinaten-Bereich [-1...1] [- Aspekt Aspekt...], aber natürlich aus der Sicht der clip-space-vertex-Positionen ist es Umgekehrt.
Danke. Das ist wirklich eine Menge geholfen.
InformationsquelleAutor