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

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

1

30.05.2013, 13:11

Problem bei Rotation in OpenGL

Hey Leute,
Ich will meine kleine Fenstererstellungsbibliothek zu einer kleinen 3D-Engine machen.
Hat bis jetzt auch alles gut geklappt (GL 1.1 Render Context, Texturen, Vektoren).
Jetzt habe ich mir gerade eine Matrix-Klasse erstellt, sowie einige Funktionen diese zu füllen
(z.B. Translationen, Skalierungen, Perspektivische Projektion, Kamera-Matrix, Rotationen um die Z-Achse),
aber bei den Rotationen um X- und Y-Achse passiert folgendes (X-Achse):



anstatt, dass das Viereck einfach seine Orientierung ändert.

Der Code für Kamera-Matrix und Rotations-Matrix:

Quellcode

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
ENGINE_API CMatrix MCamera(CVector3D pos, CVector3D lookAt, CVector3D up) {
    CVector3D zAxis(V3Normalize(lookAt - pos));
    CVector3D xAxis(V3Normalize(V3Cross(up, zAxis)));
    CVector3D yAxis(V3Normalize(V3Cross(zAxis, xAxis)));
    
    float m[] = {
        xAxis.x, yAxis.x, zAxis.x, 0.0f, 
        xAxis.y, yAxis.y, zAxis.y, 0.0f, 
        xAxis.z, yAxis.z, zAxis.z, 0.0f, 
        0.0f, 0.0f, 0.0f, 1.0f
    };

    return MTranslation(-pos) * CMatrix(m);
}

ENGINE_API CMatrix MRotationX(float f) {
    float m[] = {
        1.0f, 0.0f, 0.0f, 0.0f, 
        0.0f, cosf(f), -sinf(f), 0.0f, 
        0.0f, sinf(f), cosf(f), 0.0f, 
        0.0f, 0.0f, 0.0f, 1.0f
    };

    return CMatrix(m);
}


Den Code für die Kamera-Matrix habe ich aus der TriBase-Engine, während ich die Rotations-Matrix auf das rechtshändige Koordinatensystem von OpenGL angepasst habe.

Ich habe schon versucht die Funktionen durch gluLookAt und glRotatef auszutauschen, aber dann habe ich nichts mehr gesehen.

In der main.cpp habe ich dann folgendes getan:

Quellcode

1
2
3
4
5
6
7
8
9
MProjection();
MLoadMatrix(MPerspective(45.0f, float(800 / 800), 0.1f, 100.0f)); // MLoadMatrix = glLoadMatrix

MModelView();

CMatrix matModel = MRotationX(45.0f) * MTranslation(CVector3D(0.0f, 0.0f, -5.0f));
CMatrix matView = MCamera(CVector3D(0.0f, 0.0f, 0.0f), CVector3D(0.0f, 0.0f, -1.0f), CVector3D(0.0f, 1.0f, 0.0f));

MLoadMatrix(matModel * matView);


Bin dankbar für jede Antwort, weil ich bin echt am verzweifeln :dash:

FSA

Community-Fossil

  • Private Nachricht senden

2

30.05.2013, 16:24

Right Handed wäre so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
ENGINE_API CMatrix MRotationX(float f) {
    float m[] = {
        1.0f, 0.0f, 0.0f, 0.0f, 
        0.0f, cosf(f), sinf(f), 0.0f, 
        0.0f, -sinf(f), cosf(f), 0.0f, 
        0.0f, 0.0f, 0.0f, 1.0f
    };

    return CMatrix(m);
}

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

3

30.05.2013, 16:35

Ok, danke.
Dann habe ich das wohl verwechselt :whistling:

Aber das ändert ja nur die Richtung der Rotation.

Ich frage mich immer noch, wo die Translation herkommt ?(

FSA

Community-Fossil

  • Private Nachricht senden

4

30.05.2013, 16:39

Wie soll das Ergebnis denn aussehen? Oder besser gefragt: Was ist an dem Bild falsch? Du weißt, dass du nach der Rotation eine Translation durchführst?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

5

30.05.2013, 18:17

Zitat

Wie soll das Ergebnis denn aussehen?
Das Viereck soll nicht seine Position ändern, sondern seine Orientierung, in diesem Fall soll es sich nach oben drehen.

Zitat

Du weißt, dass du nach der Rotation eine Translation durchführst?
Ja, es soll sich auf der x-Achse drehen und dann von der Kamera weg bewegt werden.

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

6

30.05.2013, 19:40

Matrixmultiplikationen sind nicht kommutativ, heißt also, die Reihenfolge ist wichtig. Und wenn du erst rotieren und dann verschieben willst, musst du die Multiplikation genau anders herum machen.

FSA

Community-Fossil

  • Private Nachricht senden

7

30.05.2013, 19:53

@Sp3iky: Quatsch. Er multipliziert die Translation mit der Rotation (Rotation*Translation). Das stimmt alles.
Also zum Mitschreiben: Dein Quadrat hat sich nicht gedreht?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

8

30.05.2013, 20:49

Doch hat es, aber es sieht so aus, als ob es sich um den Ursprung gedreht hat.

FSA

Community-Fossil

  • Private Nachricht senden

9

30.05.2013, 21:13

Hast du das Modell in deinem Modellierungsprogramm vor dem Exportieren auf den Ursprung gesetzt? Wenn nicht mach das mal.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

10

30.05.2013, 21:31

OK ?!!?
Ich habe meine main.cpp einfach nochmal neu geschrieben und siehe da: es funktioniert !
Keine Ahnung, was ich gemacht habe ?(
Aber Danke für euer Engagement FSA und Sp3iky

PS:
@FSA: Ich habe das Viereck mit glBegin und glEnd gemacht :P

Werbeanzeige