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

Aktuelle Zeit: Do Jul 10, 2025 16:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: GUI an Bildschirm anpassen
BeitragVerfasst: Fr Okt 12, 2007 13:13 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Hi,

ich bin mir sicher das soetwas schonmal gefragt wurde aber ich habe mindestens 4 Stunden lang jeden Artikel durchgelesen den mir die Suche ausgespuckt hat und nichts gefunden..

Ich möchte ein GUI für ein Spiel schreiben welche sich an die Auflösung anpasst (zB. bei WXGA breiter wird etc.). Bis jetzt habe ich sowas immer mit Probieren gemacht, da der Ursprung ja immer in der Mitte des Bildschirmes ist hab ich mich mit translatef an die Außengrenzen rangetestet und das geht auch ganz gut. Das Problem ist nur das mein Ergebnis nicht genau sondern nur nach Augenmaß richtig ist und das es eben nicht dynamisch anpassbar ist. (und es kommt mir auch falsch vor das so zu machen)

Kann ich mit OpenGL direkt auf dem Bildschirm zeichnen und Koordinaten Entfernungen in Pixeln angeben? oder wenigstens die Bildschirmränder bestimmen?

Ich habe es versuchsweise mit
Code:
  1.  
  2.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  3.   glMatrixMode(GL_PROJECTION);
  4.   glLoadIdentity;
  5.   gluPerspective(45, ClientWidth/ClientHeight, NearClipping, FarClipping);
  6.   glMatrixMode(GL_MODELVIEW);
  7.   glLoadIdentity;
  8.   gltranslatef(0,0,-1);
  9.    glBegin(GL_QUADS);
  10.     glVertex3f(-5,-5,-5);
  11.     glVertex3f(5,-5,-5);
  12.     glVertex3f(5,5,-5);
  13.     glVertex3f(-5,5,-5);
  14.    glend;
  15.   leftcorner := GetPos(1,1);
  16.   rightcorner := GetPos(1279,799);  // ??dyn-resolution
  17.   SwapBuffers(DC);          
  18.  


im Formcreat getestet aber erstmal stimmt das Ergebnis nicht und ausserdem verändert es sich je nach Größe der Fläche :S

Wäre super wenn ihr mir helfen könnten.

Gruß, gucky


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 12, 2007 13:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du solltest wohl eher das ganze im orthogonalen Modus zeichnen. Dann sind genaue Pixelangaben problemlos möglich. So lange du dich dann in diesem Modus befindest hast du dann aber keine Perspektive mehr. Und auf zu häufiges Wechseln solltest du eher verzichten, da der Wechsel einiges an Zeit benötigt.

Für näheres solltest du mal das 2D Tutorial anschauen.

Ansonsten wäre es evtl auch mit gluUnProject möglich die Koordinaten der Eckpunkte zu berechnen. Nur, dass du eben keine Tiefe auslist sondern die benutzt auf der du zeichnest. Aber ich bevorzuge echtes 2D.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 12, 2007 13:44 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mit glOrtho kannst du eine 2D Projektion einrichten. Dort kannst du angeben wie viele Einheiten Hoch und breit die sein soll. Wenn du dort die Größe des Bildschirms angibst hast du pixelgenaue positionierung.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 12, 2007 19:06 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Mit gluUnProject hab ichs ja probiert, GetPos ist ne Procedure die das benutzt.

Ja den Ortho mode hatte ich auch gefunden aber irgendwie klappt das nicht so wie ich dachte, ich poste mal wie ich es benutzt habe vielleicht hab ichs auch falsch gemacht:
Code:
  1.  
  2. glOrtho(0,1280,800,0,-1,1);
  3.   glMatrixMode(GL_MODELVIEW);
  4.   glLoadIdentity;
  5.   renderGUI;
  6.  


In renderGUI erstelle ich nur die gui aus Quads (zur Zeit is da net mehr drin) und hab da auch Sachen wie:

gltranslatef(-0.665,0.414,-1);

drin stehen damit sie an der richtigen Position sind.

Übrigens funktioniert mein MouseOver nicht mehr wenn das an ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 12, 2007 19:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du musst natürlich in der GUI berücksichtigen, dass dein System auf ganzen Zahlen basiert ansonsten wirds natürlich nicht genau. Entsprechend muss dein Translate auch ganze Zahlen haben. Der Aufruf von glOrtho scheint so aber richtig zu sein. Du musst wie gesagt nur dein System darauf einstellen ansonsten wirds nicht genau.

MouseOver: Da kann ich dir so nichts zu sagen. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 12, 2007 20:05 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Wie muss ich mein System einstellen? Wie kann ich da ganze Zahlen eingeben? Der springt doch dann total weit weg.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 12, 2007 21:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie in dem 2D Tutorial sicherlich irgendwo geschrieben. Du setzt glOrtho auf deine Wunschwert. Je nach Anwendungsfall dann ClientWidth/ClientHeight oder sonst was. Und die Koordinaten erstreken sich in genau diesem Bereich. Also wenn du bei glOtho 640x480 einstellst dann genötigst du ein Quad welches 640x480 groß ist um den gesammten Bildschirm auszufüllen. Und wenn du ClientWidth/ClientHeight setzt dann kannst du es erreichen, dass du direkte Pixelangaben tätigen kannst.

Wenn du normal in der Perspektive arbeitest dann sind Größenangaben von 1-2 teilweise schon ziemlich groß. Evtl wurde es bei deinem Versuch ja doch schon vernünftig dargestellt. Aber eben nur winzig klein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 13, 2007 11:05 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Bei meinem Versuch wird es ganau so dargestellt wie ich es will, das ist ja das Problem, die kleinen ANgaben sind aufjedenfall "richtig" da er sie nimmt.

Muss ich nicht noch was anderes aktivieren? (beim start des Ortho Modusses gebe ich ja meine Bildschirmauflösung an)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 14, 2007 21:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also normal reicht das Setzen von glOrtho vollkommen aus. Evtl solltest du mal ein bisschen Code der enttsprechenden Stellen posten oder anhängen. So kann ich sonst nur sagen wo das Problem sein könnte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 14, 2007 22:00 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Zitat:
die kleinen ANgaben sind aufjedenfall "richtig" da er sie nimmt.

@gucky: Glaub ich nicht.

So wie ich das abschätze setzt du irgendwo deine Projektion wieder zurück, denn ein glTranslate im 0,xxx Bereich ist bei deiner Auflösung im glOrtho-Modus nicht wahrnehmbar. Das kann ich dir garantieren.

Also Entwender du zerschiest deine Ortho-Projektion oder 2. deine GUI basiert bereits auf Größenangaben jenseits von 0-1 oder 3. Deine Ausgabe sieht nicht korrekt aus. ;)

Als Lösung würde ich dir Vorschlagen mal deine GUI komplett zu deaktivieren und anstelle dessen ein Einfaches Quad zu zeichnen. Nur zum prüfen ob alles so geht wies soll. Wenn das i.O. dann guck mal nach ob in irgendeiner Funktion gaaaaaaanz hinten in deiner GUI irgendwo die Projektion neu gesetzt wird. (Bei mir ist dafür z.B. ein GUI-Manager zuständig)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 15, 2007 09:16 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Meine GUI besteht zur Zeit nur aus 4 Quads. (Wollte erstmal die Positionierung richtig hinbekommen bis ich da weiter mache)

Code:
  1.  
  2. procedure TForm1.Render;
  3. var
  4. mo : integer;
  5. begin
  6.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.   glMatrixMode(GL_PROJECTION);
  8.   glLoadIdentity;
  9.   gluPerspective(45, ClientWidth/ClientHeight, NearClipping, FarClipping);
  10.   glMatrixMode(GL_MODELVIEW);
  11.   glLoadIdentity;
  12.   glpushmatrix;
  13.   glrotatef(-90,1,0,0);
  14.   glTranslatef(-21-pos.X,60,-295+pos.y);
  15.  
  16.   hexfield; // Draw the floor
  17.  
  18.   glpopmatrix;
  19.   glOrtho(0,1280,800,0,-1,1);
  20.   glMatrixMode(GL_MODELVIEW);
  21.   glLoadIdentity;
  22.   renderGUI;
  23.  
  24.   SwapBuffers(DC);
  25. end;
  26.  



Code:
  1.  
  2. Procedure tform1.rendergui;
  3. begin
  4. glpushmatrix;
  5. gltranslatef(-0.665,0.414,-1);
  6.   glColor3f(0.6,0.6,0.6);
  7.    glBegin(GL_QUADS);
  8.     glVertex3f(0,0,0);
  9.     glVertex3f(1.328,0,0);
  10.     glVertex3f(1.328,-0.02,0);
  11.     glVertex3f(0,-0.02,0);
  12.    glend;
  13. glpopmatrix;
  14. glpushmatrix;
  15. gltranslatef(-0.665,0.414,-1);
  16.   glColor3f(0.6,0.6,0.6);
  17.    glBegin(GL_QUADS);
  18.     glVertex3f(0,0,0);
  19.     glVertex3f(0.02,0,0);
  20.     glVertex3f(0.02,-1.328,0);
  21.     glVertex3f(0,-1.328,0);
  22.    glend;
  23. glpopmatrix;
  24. glpushmatrix;
  25. gltranslatef(0.665,0.414,-1);
  26.   glColor3f(0.6,0.6,0.6);
  27.    glBegin(GL_QUADS);
  28.     glVertex3f(0,0,0);
  29.     glVertex3f(-0.02,0,0);
  30.     glVertex3f(-0.02,-1.328,0);
  31.     glVertex3f(0,-1.328,0);
  32.    glend;
  33. glpopmatrix;
  34. glpushmatrix;
  35.   glColor3f(0.6,0.6,0.6);
  36. gltranslatef(-0.665,-0.394,-1);
  37.    glBegin(GL_QUADS);
  38.     glVertex3f(0,0,0);
  39.     glVertex3f(1.328,0,0);
  40.     glVertex3f(1.328,-0.02,0);
  41.     glVertex3f(0,-0.02,0);
  42.    glend;
  43. glcolor3f(1,1,1);
  44. glpopmatrix;
  45. end;
  46.  


Das ganze ergibt einen Rahmen um den gesammten Bildschirm. Übrigens verstehe ich immernoch nicht warum der gluunproject falsche bzw. viel zu hohe Werte ausgibt wenn ich vor meine Zeichenroutine (also vom normalem Inhalt) pushe und dann vor der gui poppe. Das passiert übrigens auch wenn ich den Orthomodus garnicht aktiviere und auch die gui nicht zeichne.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 15, 2007 09:26 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Vor glOrtho musst du natürlich wieder die projektionsmatrix aktivieren. Das steht jedenfalls nicht im Code den du gepostet hast.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 21, 2007 00:14 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Super, Danke!

Ich wusste nicht das man das nochmal machen muss..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 21, 2007 23:07 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du musst dir immer überlegen welche Matrix du ändern/aktualisieren willst. Die welche die Punkte in deiner welt transformiert (GL_MODELVIEW) oder die welche die Ausgabe anpasst (GL_PROJECTION) oder die welche die Texturkoordinaten auf die Fragmente mappt (GL_TEXTURE). Es gibt in der beziehung keine Faustregel a la "Die Matrix muss man nur einmal aktivieren".

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 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.008s | 15 Queries | GZIP : On ]