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

Aktuelle Zeit: Mo Jul 07, 2025 19:05

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Apr 20, 2008 10:44 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

ich hab hier ein kleines Programm, dass mir beliebige Bilder im Vollbildformat mit Hilfe von OpenGL anzeigt. Das sind einfache Quads, auf denen das anzuzeigende Bild als Textur gebunden ist.

Das Ganze wird im Perspective-Mode gerendert. Mein Fenster hat ein Seitenverhältnis von 1:0,5625 (das ist z.B. 1280x720 oder 1920x1080).

Zur Zeit zeige ich das Bild mit folgendem Code mit richtigen Proportionen im Vollbild an:

Code:
  1.  
  2. procedure calcProportions();
  3. begin
  4.   // Proportionen errechnen
  5.   scalex := form1.ClientWidth  / picture.getWidth;
  6.   scaley := form1.ClientHeight / picture.getHeight;
  7.   scale := Min(scalex, scaley);
  8.  
  9.   // Nicht auf Vollbild vergrößern wenn die Auflösung des Bildes nicht ausreicht  
  10.   if scale>1 then scale := 1;
  11.  
  12.   // Neue Auflösung berechnen
  13.   scalex := picture.getWidth * scale;
  14.   scaley := picture.getHeight * scale;
  15.  
  16.   // Auflösung auf Fenstergröße umrechnen: Das Bild nimmt die gesamte Bildfläche ein, wenn es mit dem Faktor 1.778 in der Breite skaliert wird, und mit dem Faktor 1 in der Höhe.
  17.   scalex := (1.778/form1.ClientWidth) * scalex;
  18.   scaley := (1/form1.ClientHeight) * scaley;
  19. end;
  20.  


Danach zeichne ich mein Quad mit der Textur und skaliere es vorher mit scalex und scaley:

Code:
  1.  
  2. glLoadIdentity();
  3. glRotatef(rotAngle, 0, 1, 0);
  4. glTranslatef(0, 0, -2.41);
  5. glScalef(scalex, scaley, 1);
  6.  glBegin(GL_QUADS);
  7.    glColor4f(1, 1, 1, 1);
  8.    glTexCoord2f( 0,  1);      glVertex2f(-1, -1);
  9.    glTexCoord2f( 1,  1);      glVertex2f( 1, -1);
  10.    glTexCoord2f( 1,  0);      glVertex2f( 1,  1);
  11.    glTexCoord2f( 0,  0);      glVertex2f(-1,  1);
  12.  glEnd();
  13.  


Das funktioniert soweit auch wunderbar. Jetzt möchte ich das Bild aber in 90°-Schritten drehen können. Natürlich sollen dabei die Proportionen des Bildes erhalten bleiben.

Ich dachte, ich tausche nun ganz einfach die Höhe mit der Breite des Bildes aus, errechne dann mein scalex und scaley neu, und drehe das Bild dann einfach durch glRotatef.

Das sieht so aus:
Code:
  1.  
  2.   tmp := picture.getWidth;
  3.   picture.setWidth(picture.getHeight);
  4.   picture.setHeight(tmp);
  5.  
  6.   calcProportions();
  7.  


Leider funktioniert das nicht. Das Verhalten ist folgendes: Bei Bildern, die schon vor dem Drehen im Querformat vorliegen, funktioniert nur das Drehen von Quer- zum Hochformat nicht: Das Bild ist zu hoch und zu schmal. Bei Bildern die im Hochformat vorliegen, ist es andersherum.

Leider finde ich meinen Fehler einfach nicht. Da die Proportionen immer stimmen, bevor das Bild gedreht wird (also egal ob es im Hoch- oder Querformat vorliegt), sollte es doch so funktionieren.. das ich einfach Höhe/Breite tausche und dann neu Berechne. Oder?

Hoffe Ihr könnt mir helfen :)

Schönen Sonntag!

Grüße
Pascal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 20, 2008 10:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du es mal versucht, glRotatef nur in der Texturmatrix auszuführen?

Durch das vertauschen von scalex und scaley hast du im prinzip schon die Drehung was die Seitenformate angeht, dann musst du nurnoch die Textur drehen. Dazu wechelst du in die Texturmatrix, mittels glMatrixMode, setzt die mittels glLoadIdentity zurück und wendest da dann dein glRotatef an.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 20, 2008 12:29 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

vielen Dank! Hab es zwar anders gelöst, aber durch Dich hab ich das Problem erkannt ;)!

Meine Lösung sieht wie folgt aus (als Ergänzung zur calcProportions-Methode):

Code:
  1.  
  2.   picRotAngle_Src := picture.getRotAngle;
  3.   if rotLeft then
  4.   begin
  5.     picRotAngle_Dst := picture.getRotAngle + 90;
  6.   end
  7.   else
  8.   begin
  9.     picRotAngle_Dst := picture.getRotAngle - 90;
  10.   end;
  11.  
  12.   // Hier prüfe ich, ob ich die evtl. doppelte Drehung quasi rückgänig machen muss - wenn ja, einfach Breiten- und Höhenskalierung tauschen
  13.   if (round(picRotAngle_Dst) mod 180)<>0 then
  14.   begin
  15.     tmpr := scalex;
  16.     scalex := scaley;
  17.     scaley := tmpr;
  18.   end;
  19.  


Also vielen Dank nochmal und schönen Sonntag!

Grüße
Pascal


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


Wer ist online?

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.

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