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:
procedure calcProportions();
begin
// Proportionen errechnen
scalex := form1.ClientWidth/ picture.getWidth;
scaley := form1.ClientHeight/ picture.getHeight;
scale :=Min(scalex, scaley);
// Nicht auf Vollbild vergrößern wenn die Auflösung des Bildes nicht ausreicht
if scale>1then scale :=1;
// Neue Auflösung berechnen
scalex := picture.getWidth* scale;
scaley := picture.getHeight* scale;
// 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.
scalex :=(1.778/form1.ClientWidth)* scalex;
scaley :=(1/form1.ClientHeight)* scaley;
end;
Danach zeichne ich mein Quad mit der Textur und skaliere es vorher mit scalex und scaley:
Code:
glLoadIdentity();
glRotatef(rotAngle,0,1,0);
glTranslatef(0,0,-2.41);
glScalef(scalex, scaley,1);
glBegin(GL_QUADS);
glColor4f(1,1,1,1);
glTexCoord2f(0,1); glVertex2f(-1,-1);
glTexCoord2f(1,1); glVertex2f(1,-1);
glTexCoord2f(1,0); glVertex2f(1,1);
glTexCoord2f(0,0); glVertex2f(-1,1);
glEnd();
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:
tmp := picture.getWidth;
picture.setWidth(picture.getHeight);
picture.setHeight(tmp);
calcProportions();
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?
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 network • my 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
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.