Ich habe folgendes Problem. Ich stelle einen 3D Graphen mittels OpenGL dar, was auch wunderbar klappt. Mit der Maus kann man den Graphen drehen und verschieben. Jetzt würde ich gerne an die Achsen beschriften(2D). Die Textfunktion PrintText stammt aus dem OpenGL 1.5 Template hier auf der Seite.
Ich habe schon folgendes versucht:
procedure Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Das glPopMatrix() vor dem PrintText erscheint mir irgendwie an der falschen Stelle zu sein.
Ich kenne PrintText nicht, aber möglicherweise ist TextSuite einen Blick Wert. Wird von einigen hier im Forum benutzt, ich selbst habe es bisher aber noch nicht verwendet, da ich in der Regel Qt benutze.
Die TextSuite sieht gut aus. Werde ich mal ausprobieren.
Allerdings weiß ich jetzt immer noch nicht so recht, wie ich den Text an die richtige Stelle bekomme (in 2D).
Ich glaube, dass glOrtho eventuell garnicht hierfür geeignet ist. Ich dachte zunächst, dass glOrtho alle 3D Kooridinaten auf das Fenster in Pixeln projiziert. Allerdings, wenn ich einen 3D-Objekt durch glOrtho jage, wird scheinbar die z-Koordinate ignoriert und das Objekt dementsprechend nicht je nach Abstand skaliert. Also brauche ich irgendeine 2D-Projektion, die die Perspektive berücksichtigt oder?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Mit gluProject kannst du 3D-Koordianten in Fensterkoordinaten umwandeln. Also in den Orthomodus schalten (am besten mit 1:1 Fensterkoordinaten) und dann mittels dieser Funktion die 2D-Fensterposition deines Objektes ermitteln, dann kannst du dort deinen Text korrekt positioniert anzeigen.
Du rotierst zweimal um die Z-Achse. Ist das Absicht?
Huch! Nein, das war keine Absicht. War halb aus dem Programm kopiert und halb nacharbeitet
Sascha Willems hat geschrieben:
Mit gluProject kannst du 3D-Koordianten in Fensterkoordinaten umwandeln. Also in den Orthomodus schalten (am besten mit 1:1 Fensterkoordinaten) und dann mittels dieser Funktion die 2D-Fensterposition deines Objektes ermitteln, dann kannst du dort deinen Text korrekt positioniert anzeigen.
Danke! Das hat funktioniert. Habe das jetzt ca. so gelöst:
Jetzt wollte ich nur noch, dass der Text nicht immer vor dem 3D-Objekt erscheint. Dazu habe ich ich versucht ein glpopMatrix mit der Modelmatrix von oben und ein gltranslate(xax,xay,xaz) vor das printText zu packen um dem Text auch eine räumliche Postion zu geben. Hat aber leider nicht funktioniert.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Das geht auch nicht so einfach, da du bei der orthogonalen Projektion ja eine ganz anderen Tiefenprojektion hast. Du müsstest deinen Text also weiterhin in 3D rendern, allerings als sog. Billboards (siehe WIKI), die so ausgerichtet werden dass sie immer mit der gleichen Fläche zur Kamera "blicken".
Jetzt wollte ich nur noch, dass der Text nicht immer vor dem 3D-Objekt erscheint.
Also dein PrintText ist ja so implementiert, zumindest ist das das einzige PrintText was ich gefunden habe.
Code:
procedure TGLForm.PrintText(pX,pY : Integer; const pText : String); begin if (pText = '') then exit; glPushAttrib(GL_LIST_BIT); glRasterPos2i(pX, pY); glListBase(FontBase); glCallLists(Length(pText), GL_UNSIGNED_BYTE, PChar(pText)); glPopAttrib; end;
glRasterPos2i setzt die Z-Koordinate auf 0. Es gibt aber auch glRasterPos3i, dann kann man die z-Koordinate , also die Tiefe im Bild, selbst angeben. Du musst also nur dein winz was du bei gluProject bekommst als z-Koordinate benutzen.
Nachtrag: Es ist natürlich ratsam glRasterPos3d zu benutzen die winx/winy/winz direkt da einzusetzen. Die z-Koordinate liegt nämlich zwischen 0 und 1...Integer sind da eher weniger hilfreich
Nachtrag: Es ist natürlich ratsam glRasterPos3d zu benutzen die winx/winy/winz direkt da einzusetzen. Die z-Koordinate liegt nämlich zwischen 0 und 1...Integer sind da eher weniger hilfreich
Danke für den Tipp. Das ist genau das, was ich gesucht habe
Allerdings habe ich jetzt noch eine letzte Frage: Bei der PrintText-Funktion wird der Ausgabetext an die Displaylist mit
übergeben. Wenn ich aber nun mehr als ein Zeichen (eigentlich sollten ja 256 Zeichen möglich sein) mit PrintText ausgeben möchte, dann gibt er nur das erste Zeichen aus und danach nur noch ein komisches Viereck, als wenn er das Zeichen nicht kennen würde (zumindest bei Delphi 2010, tritt auch bei dem OpenGl 1.5 Template auf).
Registriert: So Okt 21, 2007 14:16 Beiträge: 123
Programmiersprache: Delphi
Hallo,
ohne Garantie, aber das klingt nach einem Unicode-Problem. Hast du mal versucht, den Text erst in einem AnsiString zu speichern und dann an die Prozedur zu geben?
Leider habe ich immer noch ein kleines Problem mit dem 2D Text. An sich ist mein Programm mittlerweile fertig. Allerdings gibt es noch folgenden Bug:
Das PrintText wird mehrmals hintereinander aufgerufen um Text an verschiedene Stellen zu positionieren. Das klappt soweit alles gut. Allerdings: Ich positioniere 'x', 'y' und 'z' an verschiedene Stellen. Wenn ich die Szene so drehe/zoome, dass beispielsweise das 'x' nicht mehr im Bild ist, dann wird es an den zuletzt gesetzten Text - beispielsweise das 'z' - angehangen.
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.