Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 14:53

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: 2D Text in 3D Szene
BeitragVerfasst: Fr Mai 21, 2010 11:27 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Tach!

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);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

//Die besagten Transformationen
glTranslatef(shiftx, shifty, z);
glRotatef(alpha,0,0,1);
glRotatef(beta,1,0,0);
glRotatef(gamma,0,0,1);
glPushMatrix();

//Rendern einer Displaylist mit dem Graphen
glCallList(DisplayList);

//Achsenbeschriftung (Beispiel x-Achse)
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(0,ClientWidth,0,ClientHeight,NearClipping,FarClipping);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glPopMatrix();
gltranslatef(xax,xay,xaz); //Koordinaten der x-Achse
PrintText(ClientWidth div 2,ClientHeight div 2, 'x');

SwapBuffers(DC);

end;

Das x erscheint auch. Nur leider an einer ganz anderen Stelle^^

Vielen Dank schonmal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Fr Mai 21, 2010 12:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

http://textsuite.dev-center.de/features
viewtopic.php?f=13&t=8103

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Fr Mai 21, 2010 12:39 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Danke für deine Antwort.

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Fr Mai 21, 2010 12:43 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: So Mai 23, 2010 10:54 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Vielen Dank!

Wird direkt ausprobiert!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: So Mai 23, 2010 10:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Du rotierst zweimal um die Z-Achse. Ist das Absicht?

j0hnnie hat geschrieben:
Tach!
glRotatef(alpha,0,0,1);
glRotatef(beta,1,0,0);
glRotatef(gamma,0,0,1);

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: So Mai 23, 2010 16:35 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
damadmax hat geschrieben:
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:

Code:
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(0,ClientWidth,0,ClientHeight,0,1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
gluProject(xax,xay,xaz,modelMatrix,projMatrix,viewport,@winx,@winy,@winz);  //xax, xay, xaz : Koordinaten der x-Achse
PrintText(Round(winx) ,Round(winy), 'x');


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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Mo Mai 24, 2010 09:18 
Offline
DGL Member
Benutzeravatar

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".

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Mo Mai 24, 2010 09:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Mo Mai 24, 2010 09:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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 ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Mo Mai 24, 2010 10:43 
Offline
DGL Member

Registriert: Do Mai 20, 2010 10:54
Beiträge: 10
Programmiersprache: C/C++
Wenn du an einer shaderbasierten Textausgabe interessiert bist, dann hilft dir evtl. das folgende Programmbeispiel weiter:

http://www.spieleprogrammierung.net/2010/03/opengl-3-textausgabe-font-rendering.html


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Mo Mai 24, 2010 13:56 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Coolcat hat geschrieben:
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 8)

Allerdings habe ich jetzt noch eine letzte Frage: Bei der PrintText-Funktion wird der Ausgabetext an die Displaylist mit
Code:
glCallLists(Length(pText), GL_UNSIGNED_BYTE, PChar(pText))
ü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).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Mo Mai 24, 2010 14:15 
Offline
DGL Member

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?

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Mo Mai 24, 2010 14:28 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Joni hat geschrieben:
Hast du mal versucht, den Text erst in einem AnsiString zu speichern und dann an die Prozedur zu geben?


Hat gefunzt! Perfekt! Danke (an alle). Super Forum :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D Text in 3D Szene
BeitragVerfasst: Mi Jun 02, 2010 11:04 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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.

Kann man diesen "Bug" irgendwie beheben?

Dankeschön!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]