Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Mathias

Frischling

  • »Mathias« ist der Autor dieses Themas

Beiträge: 29

Wohnort: Berlin

Beruf: Schüler

  • Private Nachricht senden

1

11.05.2005, 10:41

Textur rotieren

Hallo!

Ich bin gerade dabei ein wenig mit OpenGL rumzuspielen.
Aktuell habe ich mir eine Level-Klasse geschrieben die ein bestimmtes Format laden kann. In diesem Format können bisher "SimpleCubes" definiert werden.
Das sind (nach meiner Definition) einfach nur ein Quader der u.A. durch Breite, Höhe und Tiefe beschrieben wird. Nun habe ich eine Funktion zum Zeichnen dieses Quaders:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
bool ObjSimpleCube::Draw(CTextureManager& tex)
{
    if(szTexture == "") return false;

    // Textur auswählen

    tex[szTexture]->Bind();

    glPushMatrix();

     glTranslatef(vPos.x, vPos.y, vPos.z);

     glRotatef(vRot.x,1,0,0);
     glRotatef(vRot.y,0,1,0);
     glRotatef(vRot.z,0,0,1);

     // Ausmaße

     GLfloat x = vDim.x / 2;
     GLfloat y = vDim.y / 2;
     GLfloat z = vDim.z / 2;

     // Texturen

     GLfloat tx = vTexScale.x;
     GLfloat ty = vTexScale.y;

     glColor3ub(255,255,255); 

     glBegin(GL_QUADS);
     
      // Vorderseite

      glNormal3f(0.0f,0.0f,1.0f);
      glTexCoord2f(0,0); glVertex3f(-x,-y, z);
      glTexCoord2f(x,0); glVertex3f( x,-y, z);
      glTexCoord2f(x,y); glVertex3f( x, y, z);
      glTexCoord2f(0,y); glVertex3f(-x, y, z);
      // Hinterseite

      glNormal3f(0.0f,0.0f,-1.0f);
      glTexCoord2f(0,0); glVertex3f(-x,-y,-z);
      glTexCoord2f(x,0); glVertex3f( x,-y,-z);
      glTexCoord2f(x,y); glVertex3f( x, y,-z);
      glTexCoord2f(0,y); glVertex3f(-x, y,-z);
      // Linke Seite

      glNormal3f(-1.0f,0.0f,0.0f);
      glTexCoord2f(0,0); glVertex3f(-x,-y,-z);
      glTexCoord2f(z,0); glVertex3f(-x, y,-z);
      glTexCoord2f(z,y); glVertex3f(-x, y, z);
      glTexCoord2f(0,y); glVertex3f(-x,-y, z);
      // Rechte Seite

      glNormal3f(1.0f,0.0f,0.0f);
      glTexCoord2f(y,0); glVertex3f( x,-y,-z);
      glTexCoord2f(y,z); glVertex3f( x, y,-z);
      glTexCoord2f(0,z); glVertex3f( x, y, z);
      glTexCoord2f(0,0); glVertex3f( x,-y, z);
      // Oberseite

      glNormal3f(0.0f,1.0f,0.0f);
      glTexCoord2f(0,0); glVertex3f(-x, y,-z);
      glTexCoord2f(x,0); glVertex3f( x, y,-z);
      glTexCoord2f(x,z); glVertex3f( x, y, z);
      glTexCoord2f(0,z); glVertex3f(-x, y, z);
     // Unterseite

      glNormal3f(0.0f,-1.0f,0.0f);
      glTexCoord2f(0,0); glVertex3f(-x,-y,-z);
      glTexCoord2f(x,0); glVertex3f( x,-y,-z);
      glTexCoord2f(x,x); glVertex3f( x,-y, z);
      glTexCoord2f(0,x); glVertex3f(-x,-y, z);

     glEnd();

    glPopMatrix();

    //return false;


    return true;

}


In der Funktion stimmen einige Textur-Koordinaten noch nicht,
aber das ist erstmal egal. Ober-, Vorder- und Hinterseite sind eigentlich richtig. Aber auf der linken und rechten Seite wird dann die Textur "falsch rum" gezeichnet. Die Textur muss um 90° rotiert werden damit sich richtig steht. Aber wie kann ich das machen? Gibt es einen Alghoritmus mit dem man die Koordinaten mit einem beliebigen Winkel rotieren kann, besser gesagt ein Alghoritmus der die Koordinaten so verändert, dass die Textur "rotiert" wird.

Andi

Frischling

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

2

13.05.2005, 14:29

Moinsen,

es gibt in OpenGl die Textur- Matrix, genau wie wie Modelview und Projection. Wenn Du die lädst mit:

glMatrixMode(GL_TEXTURE);

kannst Du mit glRotate, glTranslate... Deine Texturen rumschieben und drehen. Das ist das gleiche Prinzip, wie Du Körper und Kamerapositionen veränderst.

Andi

Mathias

Frischling

  • »Mathias« ist der Autor dieses Themas

Beiträge: 29

Wohnort: Berlin

Beruf: Schüler

  • Private Nachricht senden

3

13.05.2005, 16:59

Das ist super, dann ist das ja genau so leicht wie sonst. :D
Vielen Dank für den Tipp!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

13.05.2005, 18:09

Warum änderst Du die Texturkoordinaten nicht einfach da, wo sie falsch sind? Immerhin gibst Du sie ja manuell an.

Mathias

Frischling

  • »Mathias« ist der Autor dieses Themas

Beiträge: 29

Wohnort: Berlin

Beruf: Schüler

  • Private Nachricht senden

5

14.05.2005, 08:57

Ja, in dieser "Momentaufnahme" des Codes schon.
Aber am Ende soll es möglich sein für die Textur beliebige Rotations/Translations-Faktoren anzugeben,
deshalb eignet sich die Textur-Matrix wahrscheinlich sehr gut für meine Zwecke. :) Natürlich wäre die Translation auch ohne die Textur-Matrix möglich, allerdings auch nur begrenzt wenn man bedenkt, dass es bei einer rotierten Textur nicht mehr reicht einfach meine manuell angegebenen Textur-Koordinaten durch eine additive Variable zu verändern.

Werbeanzeige