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

Aktuelle Zeit: Mo Jul 14, 2025 13:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur auf QUAD rotieren lassen
BeitragVerfasst: Sa Okt 08, 2005 02:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
Hallöchen,

nach längerer Abwesenheit melde ich mich gleich mit einem Problemchen zurück. Und zwar geht es diesmal darum, auf einem Quader (bzw GL_QUAD) eine Textur in beliebigem Winkel drehen zu können. Sprich, man sieht auf dieses Viereck, dessen Ecken können beliebig verzogen sein (müssen keine 90° Winkel haben) und hat nun eine Textur auf dieser Oberfläche. Die Textur soll sich nun drehen, das Objekt bleibt unverändert. Das Ganze geschieht in der Projektionsmatrix, keine dritte Dimension also. Ortho-Bereich ist 1024 x 768 Pixel.
Gegeben haben wir die Koordinaten der 4 Eckpunkte des Objekts.

Beim "Draufmappen" der Textur auf ein Objekt gehe ich immer von den windows-üblichen Koordinaten aus. Also das Vertex oben links ist mein erster Punkt, dann gehts im Uhrzeigersinn rum. Unten links ist also Punkt 4 des Quads.
"screen.client_size_y" ist in meinem Falle hier die Höhe des Bildschirmes. Diese Variable bringe ich ein um die Koordinate des Objekts vom Ursprung oben links anzeigen zu lassen anstatt wie üblich bei OGL von unten links. (Bildschirmhöhe - Koordinate von oben links = Koordinate von unten links, welche ich für OGL benötige)

Bisher rendere ich das Objekt mit der Textur wie folgt:

Code:
  1.  
  2.                 glBegin(GL_QUADS);
  3.                     glTexCoord2f( (float) pos_x1 / tex_size_x,        (1.0f )-  (float) pos_y1 / tex_size_y);            glVertex3f(pos_x1, (screen.client_size_y) - pos_y1, 0);      //Left upper corner
  4.                     glTexCoord2f( (float) pos_x2 / tex_size_x,        (1.0f )-  (float) pos_y2 / tex_size_y);            glVertex3f(pos_x2, (screen.client_size_y) - pos_y2, 0);     //right upper corner
  5.                     glTexCoord2f( (float) pos_x3 / tex_size_x,        (1.0f )-  (float) pos_y3 / tex_size_y);            glVertex3f(pos_x3, (screen.client_size_y) - pos_y3, 0);        //right lower corner
  6.                     glTexCoord2f( (float) pos_x4 / tex_size_x,        (1.0f )-  (float) pos_y4 / tex_size_y);            glVertex3f(pos_x4, (screen.client_size_y) - pos_y4, 0);     //left lower corner
  7.                 glEnd();
  8.  
  9.  


Hierbei wird also die Texturgröße nicht beeinflusst, der Ursprung der Textur ist beim Koordinatenursprung (bei mir oben links da ich ihn beim Rendern ja umlenke). Das Objekt liegt irgendwo auf dem Bildschirm und wird dann mit dem "gerade dort befundenen Teil" der Textur überspannt. Eine Bewegung des Objekts bewegt also nicht die Textur mit, diese bleibt immer an der Stelle stehen.
Zum besseren Verständnis hier zwei Bilder wie man es sich vorzustellen hat. Die Textur beginnt rechnerisch beim ursprung oben links, wird aber logischer Weise nur auf dem Objekt angezeigt. Die Drehung soll im Ursprung erfolgen. Der rote Pfeil zeigt die Drehrichtung (hier etwa -30° Drehung )
Das Bild oben zeigt die Textur also ohne Drehung, unten ist die Drehung erfolgt.
Bild

Soweit so gut, nur nun muss ich irgendwie eine Variable "Winkel" einbringen welche die Textur rotieren lässt. Und dafür hab ich keinen Ansatzpunkt. Wie berechne ich denn nun die neuen Texturkoordinaten welche ich dem Objekt zuweisen muss? Ich hoffe mir kann da jemand helfen. Die Sache mit dem Ursprung oben links sollte euch nicht abschrecken, ich nehme auch allgemeine Hinweise die ja meist für unten links gelten, sowas lässt sich ja umrechnen.


mfg.

Ynnus :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 03:29 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Mir fällt da spontan das ein:
Code:
  1.  
  2. glMatrixMode(GL_TEXTURE);
  3. glLoadIdentity;
  4. glrotatef(Winkel,0,0,1);
  5. glMatrixMode(GL_MODELVIEW);
  6.  

von hier
Musst du nur nach dem Zeichnen wieder rückgangig machen, sollte aber kein Problem sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 04:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
Oh, ich hätte jetzt einen durchaus längeren Code mit vielen Winkelfunktionen oder wenigstens ein paar Vektoren erwartet...
Das es nun doch so leicht funktioniert ist ja toll. :)
Jetzt muss ich also nur noch den Ursprung der Texturmatrix nach oben links ins Eck verfrachten damit um den korrekten Drehpunkt rotiert wird.
Gut, ich werd da jetzt (oder nachher, jetzt geh ich erstmal ins Bett) mal ein bisschen rumprobieren ob's soweit was wird.

Wo ich gerade schon dabei bin, ich hätte da noch eine Frage: Ich hab mir nun ein paar weitere Tutorials zu Gemüte geführt und dabei wurde ich etwas stutzig.
In dem Tutorial Matrix 2D wird beschrieben:

Zitat:
* GL_MODELVIEW - Die Modelviewmatrix

Die Modelviewmatrix sollte immer dann aktiviert sein, wenn ihr an die Grafikkarte Vertexdaten senden wollt. Diese Matrix wird auf die Position der Vertices, die mit glVertex gesendet werden angewandt. Ebenso beeinflusst sie die Ausrichtung der Normalen, die mit Hilfe von glNormal gesetzt werden. Kurz, alles was mit den Objekten eurer Welt zu tun hat, erfordert die Aktivierung dieser Matrix.

[Weiter unten heißt es ferner:]

Wie bereits erwähnt ist die Modelviewmatrix die wichtigste Matrix in der OpenGL Welt, denn sie wirkt sich auf Ausrichtung und Position aller Primitive und damit Objekte in der OpenGL Welt aus. Ohne Daten in der Modelviewmatrix, kann die Projektionsmatrix auch nichts ausgeben.

[Über die Projektionsmatrix:]

* GL_PROJECTION - Die Projektionsmatrix

Diese Matrix wird selten gebraucht. Sie bestimmt, wie am Ende alles angezeigt wird. Sie bestimmt quasi die Eigenschaften der "Kamera".


Jetzt bin ich etwas verwirrt, da ich in meinem ganzen Code nirgendwo die Modelview-Matrix verwende. Ich arbeite die ganze Zeit in der GL-PROJECTION Matrix und lasse dort meine Quads und Polygone platzieren. Wie oben erwähnt ist meine Projection-Matrix per glOrtho auf einen 2D-Bereich festgelegt. Die Frage ist, hab ich was falsch verstanden, die Projectionsmatrix für falsche Zwecke gebraucht oder kann man das durchaus so machen? In dem Zitat oben heißt es ja nun, dass immer die Modelview Matrix verwendet wird und die Projektionsmatrix nur zum Anzeigen der Objekte zum Schluss angewand wird. :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 09:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Einzig und allein die Befehle glScale, glTranslate, glRotate, glLoadMatrix usw. beziehen sich auf die aktuelle Matrix.
Wenn du deine Objekte zeichnest ohne glTranslate und Co zu verwenden ist es völlig egal, welche Matrix die aktive Matrix ist. In der Regel aktiviert man jedoch nach dem setzen der Projektionsmatrix (z.B. im OnResize-Ereignis oder bei der Initialisierung) die Modelviewmatrix.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 11:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
glVertex*() schaltet also immer in die Modelview-Matrix um und setzt dort die Punkte?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 11:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
letztlich wird der Punkt mit beiden matrizen multipliziert, die aktuelle Matrix bezieht sich wirklich nur auf die befehle, die die matrizen auch verändern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 00:13 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Außerdem soll das Tut bewirken, dass die Anfänger von anfang an die richtige Matrix benutzen. Wenn man sagt, ihr könnt rendern wie ihr wollt, kommen dann plötzlich Fragen hier im Forum auf nach Fehlern welche sich niemand erklären kann.... Es macht nämlich hin und wieder schon einen Unterschied in welcher Matrix man zeichnet. Wenn man die Lichtberechnung korrekt machen lassen will (GL_LIGHT_MODEL_LOCAL_VIEWER) wird dafür die Modelviewmatrix ausgewertet, und keine andere. Da hate ich schonmal böse unerklärliche effekte damit erzeugt (Lichtreflektionen, wo eigentlich schatten sein sollte :roll: ).

_________________
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  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.010s | 14 Queries | GZIP : On ]