[OpenGL] Menü in 3D-Welt einbauen
-
Wie kann man eigentlich am besten in eine 3D-Welt ein Menü einbauen?
Also ich meine jetzt nicht das Startmenü eines Spiels, das kann man ja prima mit glOrtho() machen, aber wenn ich dann im Spiel mit gluPerspective() ein Menü, beispielsweise am unteren Rand zum Anzeigen von Ressourcen o.ä, einbauen will, wirds schwierig.
Mit glDrawPixels() könnte man zwar was zeichnen lassen, wäre aber sehr unflexibel und zeitaufwendig bei großen Flächen, außerdem soll das Menü ja auch über alles andere drüber gezeichnet werden.
Ich hab's mal testweise versucht, in dem ich erst die 3D-Welt rendere und dann mit glOrtho() die Perspektive wechsel und dann das Menü rendere, danach wieder wieder in die "räumliche" Perspektive umwechsel, kann man das so machen oder gibt es bessere Möglichkeiten?
Vielen Dank schonmal!
-
Render doch einfach das Menü mit Polygonen, deren Vertex Positionen bereits transformiert sind (also sich bereits im Canonical View Volume befinden).
-
Eine nicht ganz so elegante Lösung wäre auch, mittels WinApi ein kleines Child
dort hin zu platzieren und darauf pinnst du dann eine beliebige Bitmap etc.
-
Meinst du das HUD (heads-up-display)?
Wenn ja, dann frage ich: Wieso willst du das in perspektivischen Projektion machen? du kannst ganz einfach zur laufzeit in eine orthographische Projektion wechseln:
glMatrixMode(GL_PROJECTION); // erstmal in den Projection Matrix-Mode wechseln glPushMatrix(); // Die aktuelle (Projection-)Matrix speichern gluOrtho2d(bla, blub, ...); // hier ne orthographische Projection einstellen glLoadIdentity(); // die neue Matrix auf die Identity-Matrix zurücksetzen glMatrixMode(GL_MODELVIEW); // wieder zur modelview-matrix wechseln glLoadIdentity(); // auch hier die Identitäts-Matrix laden // ab hier kannst du in einer orthografischen Projektion zeichnen!Um dann wieder zurück zu wechseln:
glMatrixMode(GL_PERSPECTIVE); glPopMatrix(); // hier machen wir uns trick 17 (mit falltür) zunutze und ersparen uns eine Menge arbeit, denn wir haben ja oben die aktuelle Matrix mit glPushMatrix gespeichert, jetzt holen wir uns die einfach wieder zurück :) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // ab hier kannst du wieder so wie vor dem Wechsel perspektivisch zeichnenwenn du das jetzt noch in je eine Funktion packst, könnte das Zeichnen eines HUDs einfacher nicht sein

(Das einzige, was du vielleicht noch bedenken solltest, ist, das Licht auszuschalten, wenn du in der orthographic perspective bist, denn das HUD soll ja nicht beleuchtet werden, nehm ich an
)EDIT:
damit das Ganze einfach über alles drüber gezeichnet wird, ist es am besten, das HUD einfach am ende zu zeichnen und während der Dauer des HUD-zeichnens glDisable(GL_DEPTH_TEST); aufzurufen
-
Wieso wollt ihr denn alle irgendwas transformieren, wenn die HUD Elemente eh immer an der gleichen Stelle stehen?
-
@Heinzelotto: lies dir doch mal meine letzte Frage durch, da wollte ich wissen, ob man das so machen kann
- aber trotzdem vielen Danke, jetzt habe ich ja die Bestätigung 
@this->that: Äh, also cih weiß nicht genau, wie du dir das vorstellst, ich muss die Dinger doch trotzdem jedes Mal neu zeichnen
-
Powerpaule schrieb:
@this->that: Äh, also cih weiß nicht genau, wie du dir das vorstellst, ich muss die Dinger doch trotzdem jedes Mal neu zeichnen
Ja und?
-
Ja und wie soll ich's ohne Transformieren machen?
-
Wie ich bereits sagte: Indem du die Vertices der Polygone bereits transformiert definierst.
-
Öhm und wie geht das?
-
In dem du statt normalen 3-dimensionalen Vertices bereits transformierte 4-dimensionale Vertices im Normalized Device Space angibst. w setzt du auf 1, damit die Homogene Division keine Auswirkung hat. Bei Verwendung der Fixed Function Pipeline setzt du alle Matrizen auf die Einheitsmatrix. Bei Shadern schleifst du die Koordinaten im VS einfach durch zum PS.
-
Öhm und wie geht das?
Wenn du lernst wie man richtig lernt, versteht und richtig interpretiert, kannst du dir deine Antwort selber beantworten. Die meisten Mitglieder werden dir ungern den Code in den Mund legen. Außerdem gibt es noch diese eine Seite, man... wie hiess die doch noch gleich? Mhm....... ah, ich glaub ich hab's, es war glaub ich [url]www.GOOGLE.de[/cpp]
-
Ganz egal ob er nun mit 'ner Einheitsmatrix multipliziert oder nicht, muss er eigentlich dafuer sorgen, dass die (transformierten) hud-polygone auf der near-clipping-plane liegen um nicht dem rest der szene in die zbuffer-queere zu kommen.
Dazu gibt es viele Moeglickeiten. Eine waere:in dem ich erst die 3D-Welt rendere und dann mit glOrtho() die Perspektive wechsel und dann das Menü rendere, danach wieder wieder in die "räumliche" Perspektive umwechsel
-
hellihjb schrieb:
Ganz egal ob er nun mit 'ner Einheitsmatrix multipliziert oder nicht, muss er eigentlich dafuer sorgen, dass die (transformierten) hud-polygone auf der near-clipping-plane liegen
Muss er nicht. Er kann auch einfach den Z-Test deaktivieren. Oder eben gleich z-Werte angeben, die garantiert immer vor allen anderen liegen (in D3D z.B. 0).
-
nimm doch einfach ein SubDisplay von OpenGL, haste ne eigene Matrix und n eigens Fenster in gewünschter Größe, dass man auch zur not Transparent machen kann. Kannst auch für das Fenster eigene Keyboard und Maus routinen etc. erstellen