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

Aktuelle Zeit: Fr Jul 18, 2025 07:25

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Apr 08, 2010 08:20 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Huhu,

ist ne Weile her das ich an meinem Projekt ernsthaft weitergearbeitet habe...
Derzeit stellt sich mir folgende Aufgabe:

Wie kann ich Text, den ich mit der Textsuite erstelle an einen 3D Punkt "heften", allerdings so, das er immer lesbar ist.
So ähnlich wie bei den meisten MMO's, wenn über den Köpfen die Namen der Avatare stehen allerdings ohne zoom, der text soll immer lesbar bleiben, egal wie weit der 3D Punkt in der Tiefe gezoomt ist.

Ich habe mir die Textsuite Samples angeschaut und die haben mir soweit geholfen das ich innerhalb meines Projekts auch Text darstellen kann.

Aber das mit der Positionierung bekomme ich nicht hin.

Gruß

Wölfchen


Zuletzt geändert von Wölfchen am Mi Apr 14, 2010 06:28, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 08, 2010 09:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bei dem was du haben willst musst du das 3D Objekt und den Text getrennt betrachten. Bzw solltest du den Text nicht direkt dann zeichnen wenn du das Objekt zeichnest. Sondern du solltest zu erst deine Szene zeichnen und anschließend im 2D Modus die Texte zu deinen Objekten zeichen. Du musst vor dem Zeichnen deiner Texte allerdings zu erst die 2D Position errechnen. Das geht mit gluProject. Dort übergibst du die 3D Koordinate die du umrechnen willst (typischerweise ein Stück darüber) und ein paar Matrizen. Heraus bekommst du dann WinX, WinX und WinZ. WinZ kannst du ingnorieren. Den Text musst du dann an der Position WinX, WinY ausrichten. Wichtig. Win* enthält Werte in Pixel. Dein OrthoModus muss dann auch Pixelgenau gesetzt werden, da sonst die Position nicht überein stimmt. Wie du an die Matrizen zum Übergeben kommst kannst du in dem Wiki Artikel zu gluUnProject sehen. Dort existiert ein Beispiel zum Erfragen.

Wie du den Text dann zeichnest hängt davon ab was du alles zeichnen willst. Sobald es aber mehr als eine Zeile ist würde ich zum Blockmodus raten dessen untere Kante auf dem errechneten Punkt liegt. Und zwar genau Zentriert. Den Text dann auch zentriert und mit VAlign = Bottom ausgeben.

PS: Bei den MMOs die ich gerade noch in Gedanken habe ist es oft auch so, dass der Text zu dem Avatar gehört. Also mit zunehmender Tiefe auch weiter in den Raum verschoben wird bzw auch von Objekten verdeckt werden kann. Dadurch gehört er mehr oder minder direkt zum Objekt und kann direkt dann mit gezeichnet werden. Benötigt aber eine ganz andere Herangehensweise.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 08, 2010 09:55 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Vielen Dank für die rasche Antwort.
Das mit den Avataren war nur ein Beispiel, bei meinem Projekt (einem popligen 3D viewer) will ich einfach nur Abstände messen und die Zahl (denke mal net mehr als 12 Stellen inclusive komma und 2 nachkommastellen + einheit) in die Mitte der Masslinie schreiben.

etwa so wie in der CAD software mit der ich arbeite:

hier mal paar screenshots wie es da aussieht:

ein 3D Masz...
http://file1.npage.de/003341/04/bilder/beispielbild_fuer_mass_1.jpg
Objekt weit weg gezoomt, das Masz bleibt lesbar!
http://file1.npage.de/003341/04/bilder/beispielbild_fuer_mass_2.jpg
Orientierung verschiedener Masze immer lesbar:
http://file1.npage.de/003341/04/bilder/beispielbild_fuer_mass_3.jpg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 08, 2010 10:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Beispiel: Dann sag auch direkt was du willst. ;) Hier in dem Forum gibt mehr Leute die eher Spiele als normale 3D Visualisierung programmieren wollen. Um nicht zu sagen, dass normal Visualisierung eher seltenheit ist. Da dazwischen schon Unterschiede exisitieren kannst du mit einem weniger glücklich gewählten Beispiel die meisten auf eine falsch Fährte locken. Was dann darin resultieren kann, dass du eher unpassende Tipps bekommst.

Visualisierung. Aber ja. Bei dem was du vor hast macht es wohl nur so Sinn wie ich das beschrieben habe. Also zu erst die Szene und anschließend die Texte im 2D Modus drüber zeichnen. Das Berechnen des 3D Punktes sollte eher kein Problem sein. Wie du auf den 2D Punkt habe ich ja beschrieben.

Was das Zeichnen der Texte angeht. Wenn du nur einzeligen Text ausgeben willst, dann kannst du auch den SingleLine Modus benutzen. Also Positionieren und dann mit tsTextOut den Text ausgeben. Das vereinfacht das Handling des Textes noch weiter. Die Grundlinie des Textes befindet sich dann allerdings genau an dem Punkt den du positioniert hast. Die Grundlinine ist die Linie wo die Buchstaben (wie abcdeh) drauf sitzen. Je nachdem was du optisch erzeugen möchtest musst du den Text noch etwas verschieben bzw auch zentriert anzeigen etc. Bzw kannst du den Text auch rotieren um dafür zu sorgen, dass der Text genau an der Linie ausgerichtet ist. Die Möglichkeiten wie man das gestalten will hängt dann einzig und alleine davon ab was du haben willst.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 08, 2010 11:25 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Ja, habe inzwischen mitbekommen, dass es hier zu 95% um Spieleprogrammierung geht, deswegen dachte ich ein Beispiel aus dem Bereich wäre verständlicher :D

Die Ausrichtung des Textes soll unabhängig von der Bauteilorientierung parallel zum Bildschirm/Viewpoint (?) sein. Aber das müsste ja genauso gehen wie beim Zeichnen des Hintergrund Quads.

Nach Feierabend probier ich mich daran und meld mich wahrscheinlich nochmal mit neuen Fragen :P

winke und danke


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Apr 10, 2010 12:09 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Hi,

so endlich bin ich mal wieder ein wenig zum Programmieren gekommen und habe es jetzt auch geschafft ins 3D text reinzuschreiben. Das klappt jetzt soweit...

Bild

aber einige Problemchen sind noch ungelöst.

1.) Der Text sieht mir noch zu "bold" aus, könnte aber am Font liegen... ich habe nach einem Font gesucht, bei dem Zahlen gut lesbar sind.

2.) Die Textgröße bekomme ich derzeit nicht verkleinert... wie macht man das am besten? Ich hätte die Schriftgröße gern einen Ticken kleiner.
[EDIT] OK, zumindest das hat sich erledigt... mit fsFontSize lässt sich das einstellen.[/Edit]

3.) Da ich ja den Text erst zur Laufzeit schreibe, und auch nicht weiss wie lang die Zahl sein wird müsste ich vor dem Zeichnen des kleinen hintergrundquads wissen wie groß es sein muß, dafür muß ich aber "berechnen" wie groß mein geschriebener Text sein wird. Gibt es da eine Möglichkeit?

Hier noch bissi code - für tipps und so bin ich immer dankbar - ihr wisst ja, ich hab eigentlich kein Plan vom Programmieren!

Code:
procedure TForm1.BoxFuerMassText(punkt:TGLVectord3);
var Viewport: TVector4i;
begin
  glGetIntegerv(GL_VIEWPORT, @Viewport[0]);       //ViewPort speichern

  glMatrixMode(GL_PROJECTION);                    //in die ProjektionsMatrix
  glPushMatrix;                                   //Matrix speichern
  glLoadIdentity;                                 //Matrix zurücksetzen
  glOrtho(0, Viewport[2], Viewport[3], 0, 0, 10); //2D-Sicht festlegen (mit Viewport als Grenzen)

  glMatrixMode(GL_MODELVIEW);                     //in die ModelMatrix
  glPushMatrix;                                   //Matrix speichern
  glLoadIdentity;                                 //Matrix zurücksetzen
  gldisable(GL_Depth_test);                       //Tiefentest ausschalten
  glBegin(GL_QUADS);
  glcolor3f(1,1,1);
    glTexCoord2f(0,0);  glVertex2f(          punkt[0],          punkt[1]);
    glTexCoord2f(0,1);  glVertex2f(          punkt[0],          punkt[1]+20);
    glTexCoord2f(1,1);  glVertex2f(          punkt[0]+80,       punkt[1]+20);
    glTexCoord2f(1,0);  glVertex2f(          punkt[0]+80,       punkt[1]);
  glEnd;

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);// ohne das hier gibts nur schwarze blöcke zu sehen...
  glenable(GL_BLEND);

  glTranslatef(0, 0, -10);

  // setting color or with glColor
  tsTextColor3f(0, 0, 0);

  // activate small font
  tsFontBind(fsmallFontID);

  // set align to left
  tsSetParameteri(TS_ALIGN, TS_ALIGN_LEFT);

  // draw Text
  glPushMatrix;

    glTranslatef(punkt[0]+10, punkt[1]+20, 0);
    tsTextOutA('123,4');

  glPopMatrix;

  //Zustand zurücksetzen

  glenable(GL_DEPTH_TEST);
  gldisable(GL_BLEND);



  glMatrixMode(GL_PROJECTION);                    //in die ProjektionsMatrix
  glPopMatrix;                                    //alte Matrix wieder laden

  glMatrixMode(GL_MODELVIEW);                     //in die ModelMatrix
  glPopMatrix;                                    //alte Matrix wieder laden
  glenable(gl_depth_test);

end;


PS: die code formatierung funzt wohl nicht mehr? ich habs mit "[code=delphi]" versucht


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Apr 11, 2010 09:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
1. Wenn du als Style kein TS_STYLE_BOLD angegeben hast, dann liegt es am Font. Musst entsprechen dann ein Anderes auswählen. Da musst du normal auch gar nicht lange suchen. Im Windows sind ein paar recht ansehnliche Fonts dabei.

3. Hier kann es etwas komplexer/verwirrender werden. Das liegt aber daran wie einzelne Textzeilen normal gezeichnet werden. Und zwar an der BaseLine.
Bild
Dadurch wird das Positionieren deines Hintergrundes schwieriger (aber nicht unmöglich). Du musst halt dafür sorgen, dass dein Quad die Höhe des Fonts wieder rausrechnet bzw. musst du auch nach unterhalb der Baseline gehen. Da sonst solche Effekte eintreten wie bei dem Komma.

Nach Oben hin kannst du das mit TS_FONT_ASCENT erfragen.
Bild

Nach Unten mit TS_FONT_DESCENT.
Bild

Erfragen geht so. Ascent/Descent sind ganz ordinäre Integer.
Code:
tsFontBind(fsmallFontID);

Ascent := tsGetParameteri(TS_FONT_ASCENT);
Descent := tsGetParameteri(TS_FONT_DESCENT);


Die Breite des Textes kannst du mit tsTextGetWidth. Mit den Werten solltest du ein Quad zeichnen können welches immer genau an der Stelle liegt wo der Text ist. Und zwar passend. Ascent nach oben. Descent nach unten. Und tsTextGetWidth nach rechts. Du solltest das Quad auch direkt vor dem Zeichnen des Textes zeichnen. Zeitlicher Ablauf wäre in etwa so.
- Font binden
- Größen erfragen.
- Quadzeichnen
- Farbe setzen
- Text ausgeben

Mit dem Parameter TS_SINGLE_LINE kannst du den Zeichenpunkt nach ObenLinks legen. Dann bräuchtest du nur die Breite und Höhe deines Textes erfragen und könntest so ein Quad zeichnen. Die Voreinstellungen der Textsuite sind eher auf normales Zeichnen ausgelegt. Und da erscheint es mir besser die Koordinatenursprung auf die Baseline zu legen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Apr 13, 2010 19:41 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Habs hinbekommen :)

*freu!*

vielen Dank nochmal!

Bild

Echt Super DGL!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.

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