opengl - 2D Übersicht rechts oben über der 3D Zeichnung
-
Hallo,
ich bin OpenGL Neuling. Ich schreibe momentan ein kleines Spiel zum rein kommen.
Dazu verwende ich C++ und OpenGL mache ich im Qt GlWidget!
Das funktioniert alles auch sehr gut.
Ich zeichne momentan mein Spielfeld in Perspektivischer Ansicht.Nun würde ich gerne aber eine 2D Übersicht über das 3D Spielfeld rechts oben zeichnen. Allerdings wie mache ich das?
Das Problem ist, wenn ich einfach nach dem ich das 3D Modell gezeichnet habe rechts oben was Zeichne.
Hab ich spätestens beim Zoomen ein Problem, weil sich dann ja die Größe des Viewports ändert und so das was ich gezeichnet habe außerhalb des Bildes liegt.Hat jemand vielleicht einen Tipp wie man das ein bisschen komfortabler machen kann?
Grüße Mister Blub
-
Am besten ist es eigentlich, wenn du nach dem Zeichnen der 3D-Welt auf 2D-Perspektive umstellst (gluOrhto()), da kannst du dann alles pixelgenau zeichnen lassen.
-
//3D zeichnen glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0,1024,0,768,-2048,2048); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //2D zeichnen gl_MatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW);Anmerkung:
Ich verstehe das auch nicht so genau mit den ganzen Matrix modes und Push und Pop Anweisungen.
Ich habe das ausm Internet irgendwo (kenne leider die Adresse nicht mehr) abgetippt da das Kopieren nicht ging (war nen Bild). Es können also Tippfehler drin sein.Soweit ich das verstehe sind die Angaben "1024 bzw. 768" die Auflösung und
-2048,2048 scheint den Bereich für den Z Buffer festzulegen.
-
Ich verstehe das auch nicht so genau mit den ganzen Matrix modes und Push und Pop Anweisungen.
Ich habe das ausm Internet irgendwo abgetipptNa denn...
// alle nachfolgenden matrix-operationen beziehen sich auf die projektionsmatrix: glMatrixMode(GL_PROJECTION); // die aktuelle projektionsmatrix sichern damit diese spaeter wiederhergestellt werden kann // (und nicht neu gesetzt werden muss; sukzessive veraenderung waeren evtl auch nicht mehr reproduzierbar) // es koennen mehrere zustaende gespeichert werden (stack) glPushMatrix(); // einheitsmatrix laden // (was auch immer vorher in der projektionsmatrix drin war ist dann weg) // nachfolgende matrix-operationen erzeugen effektiv eine weitere matrix. // diese wird mit der aktuellen matrix multipliziert (die einheitsmatrix ist dazu neutrales element) glLoadIdentity(); // orthografische projektion setzen // x= 0..1024, y= 0..768 wird auf den viewport (ggf vorher setzen/verkleinern) skaliert // z-koordinaten <-2048 / >2048 werden abgeschnitten glOrtho(0,1024,0,768,-2048,2048); // nachfolgende operationen beziehen sich auf die modelmatrix glMatrixMode(GL_MODELVIEW); // ggf matrix ebenfalls sichern: // glPushMatrix(); // matrix "loeschen" // (die matrix beinhaltet noch die ausrichtung des zuletzt (perspektivisch) gezeichneten objektes) glLoadIdentity(); // ggf weitere transformationen um das (orthografisch) zu zeichnende objekt auszurichten // glRotate... // glTranslate... // 2D zeichnen // wiederherstellen der (oben veraenderten) projektionsmatrix glMatrixMode(GL_PROJECTION); glPopMatrix(); // weitere operationen beziehen sich wieder auf modelmatrix glMatrixMode(GL_MODELVIEW); // ggf matrix ebenfalls wieder herstellen // glPopMatrix(); // wieder 3D zeichnen
-
Also erstmal danke für die schnelle Hilfe!
Auf die Idee mit dem glOrtho hätte ich auch kommen können :).Ich hab aber trotzdem noch ein Problem :(.
Also die 3D Zeichnung wir Perspektivisch gezeichnet dazu benutze ich:
gluPerspective(zoom, (GLfloat)w/(GLfloat)h, 0.1f, 100.0f);wobei w und h die Größe des Viewports sind und zoom ist ein wert den ich beim Zoomen hoch bzw. runter setze.
Bei einem Wert von zoom 0.0 passt die 2D Zeichnung so wie sie sein soll. Auch der Koordinaten ursprung liegt so wie es sein soll links unten!
Allerdings wird der Wert zoom verändert passt gar nichts mehr (Zumindest für mich
). Aus einem Quadrat z.B.glBegin(GL_QUADS); glColor3f(1.0,1.0,0.0); glVertex2i(1,1); glVertex2i(250,1); glVertex2i(250,250); glVertex2i(1,250); glEnd();Wir bei einem wert für zoom != 0.0 ein Rechteck ??
Auch liegt der Koordinaten ursprung nicht mehr links unten wie es vorher war :(.Das andere was ich nicht ganz verstehe ist, dass zweite glLoadIdentity(); bewirkt das nicht gezeichnet wird also zumindest die 2D Sachen!
Wenn ich das zweit glLoadIdentity(); auskommentiere wird das 2D zeug gezeichnet allerdings mit dem Phänomen von oben :(.GLint viewport[4]; glGetIntegerv(GL_VIEWPORT,viewport); glLoadIdentity(); glOrtho(0, viewport[2], 0, viewport[3], 0, 128); glMatrixMode(GL_MODELVIEW); glLoadIdentity();Hat vielleicht jemand eine Idee wo mein Fehler liegt?
Vielen Dank und Viele Grüße
-
gluPerspective(zoom, (GLfloat)w/(GLfloat)h, 0.1f, 100.0f);Bei einem Wert von zoom 0.0 passt die 2D Zeichnung so wie sie sein soll
Auch der Koordinaten ursprung liegt so wie es sein soll links unten!"zoom" ist der Betrachtungswinkel der Kamera. 0 macht ueberhaupt keinen Sinn und entspricht glFrustum(0,0,0,0,0.1f,100.0f).
Du siehst nur etwas weil die Division durch 0 abgefangen wird.
Bei perspektivischer Projektion ist der Ursprung in der Bildschirmmitte. Wenn Du das nicht moechtest, musst Du eine geeignete Transformation setzen.
-
hellihjb schrieb:
gluPerspective(zoom, (GLfloat)w/(GLfloat)h, 0.1f, 100.0f);Bei einem Wert von zoom 0.0 passt die 2D Zeichnung so wie sie sein soll
Auch der Koordinaten ursprung liegt so wie es sein soll links unten!"zoom" ist der Betrachtungswinkel der Kamera. 0 macht ueberhaupt keinen Sinn und entspricht glFrustum(0,0,0,0,0.1f,100.0f).
Du siehst nur etwas weil die Division durch 0 abgefangen wird.
Bei perspektivischer Projektion ist der Ursprung in der Bildschirmmitte. Wenn Du das nicht moechtest, musst Du eine geeignete Transformation setzen.Ooder du verwendest:
gl.glOrtho(0.0f, width, height, 0.0f, -1.0f, 1.0f);dann ist 0,0 oben links und width,height unten rechts.
Siehe
http://wiki.delphigl.com/index.php/GlOrthohttp://wiki.delphigl.com ist eine gute Wiki zum nachschlagen der OpenGL Befehle.
Btw, Zoomen im orthogonalen Rendermodus macht eh keinen Sinn, weil du die Z-Achse sowieso nicht sehen kannst (alle Objekte erscheinen gleich gross, egal wo sie sich auf der Z-Achse befinden).
-
MisterBlub schrieb:
Also die 3D Zeichnung wir Perspektivisch gezeichnet dazu benutze ich:
gluPerspective(zoom, (GLfloat)w/(GLfloat)h, 0.1f, 100.0f);DEvent schrieb:
Ooder du verwendest:
gl.glOrtho(0.0f, width, height, 0.0f, -1.0f, 1.0f);
DEvent schrieb:
Zoomen im orthogonalen Rendermodus macht eh keinen Sinn, weil du die Z-Achse sowieso nicht sehen kannst
Genau genommen ist "zoomen" eine rein zweidimensionale Transformation.
-
Hallo zusammen,
ich wollte mich noch für euere Hilfe bedanken!
Ich hab es übers Wochenende hinbekommen!Also noch mal vielen Dank für eure Hilfe.
Viele Grüße
MisterBlub