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

Aktuelle Zeit: Di Mai 21, 2019 15:29

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rotatsion will nicht wie ich will.
BeitragVerfasst: Mo Dez 31, 2018 10:31 
Offline
DGL Member

Registriert: Sa Jul 24, 2010 12:34
Beiträge: 7
Also ich habe drei Winkel je einen für x, y, z den ich jeweils frei einstellen kann von 0 bis 360°.

Dann Gehe ich aktuell mit glTranslatef etwas zurück um mein Objekt zu sehen.

Mein Objekt sage ich dann

glRotatef(z,0,0,1);
glRotatef(X,1,0,0);
glRotatef(Y,0,1,0);
ZeichneObjekt;

so jetzt sehe ich das Objekt. Solange das Objekt in seine Uhrspurng ist also nach Z schaut funktionieren alle Winkel für sich einzeln super. Sobald ich das Objekt zb 90° nach rechts drehe (Schaut dann auf Y bekomme ich für Rot X und Rot Z das selbe Ergebniss. Hab es auch direkt im Zentrum probiert da ich ursprünglich dachte das glTranslatef -z der Kammera verusacht das aber auch dort vershiebt sich die Rotation. Habe jetzt zwei Tage rum Probiert und viel gelernt aber leider kein Ergebniss gefunden.

Danke für Eure Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 31, 2018 20:16 
Offline
DGL Member

Registriert: Sa Jul 24, 2010 12:34
Beiträge: 7
So habe jetzt etwas geändert aber funktioniert noch nicht perfekt.

glRotatef(z,0,0,1);
glRotatef(-X,CosZ,SinZ,0);
glRotatef(-Y,SinZ,CosZ,0);
ZeichneObjekt;

Bewegung funktioniert nun auf allen Achsen. Jedoch wenn Winkel Z bei 45° ist hänge ich auf der Uhrsprünglichen Y Achse ohne Funktion. Wie machen das andere Spiele mit Freier Bewegung im Raum? Was mir Googel dazu sagt ist Gimbal Locked jedoch bin ich mir unsicher ob dies wirklich das Problem sein soll. Das wäre ja dann eigentlich ein fehler in der Matrix von Haus aus das kann ich mir kaum vorstellen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 31, 2018 20:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 570
Programmiersprache: C++
Mir wird aus deinem Post zwar nicht genau klar, was du erreichen willst, jedoch scheint das Ergebnis, das du nach mehreren Rotationen bekommst, nicht das von dir gewünschte zu sein. Wenn du nacheinander um X-, Y- und Z-Achse rotierst, solltest du dir klar machen, das sich bei der Rotation um eine Achse die beiden anderen Achsen ändern (sie rotieren mit). Um das zu verstehen, nimmt man sich am besten einen Würfel in die Hand (ganz un-virtuell) oder irgendeinen anderen Gegenstand, der irgendwie Würfel-ähnlich ist, wie etwa einen kleinen Karton.

Für die folgende Erläuterung gehe ich von einem Spielwürfel aus. Anfangs hältst du ihn so, dass die 1 nach rechts schaut (X-Achse), die 2 nach oben (Y-Achse) und die 3 zu dir hin (Z-Achse).
  1. Du drehst den Würfel 90° um die X-Achse, d.h. um die Achse, die von der 6 zur 1 geht. Jetzt zeigt die Y-Achse des Würfels, die ja von der 5 zur 2 verläuft plötzlich nicht mehr nach oben, sondern zu dir hin.
  2. Nun drehst du um 90° um die Y-Achse. Fällt dir was auf? Du musst dich entscheiden, um welche Y-Achse du drehen möchtest. Die Y-Achse des Würfels geht von der 5 zur 2. Die Y-Achse des Raumes zeigt nach oben. Die Y-Achse des Würfels entspricht der Z-Achse des Raumes und die Y-Achse des Raumes entspricht nun dem Negativen der Z-Achse des Würfels.
  3. Je nachdem, für welche der beiden Y-Achsen du dich entschieden hast, ist das Ergebnis ein völlig anderes. Hast du um die Y-Achse des Würfels gedreht, zeigt nun die 1 nach oben, die 2 zu dir und die 3 nach rechts. Hast du hingegen um die Y-Achse des Raumes gedreht, zeigt nun die 4 nach oben, die 6 zu dir und die 2 nach rechts.

Wenn du Rotationen um eine Achse angibst, musst du dir also immer klar machen, in welchem Koordinatensystem deine Rotationsachse angegeben ist. Ansonsten bekommst du unerwartete Ergebnisse. Wenn du in OpenGL mehrmals nacheinander glRotate aufrufst, werden die Rotationen auf das bereits von vorherigen Rotationen transformierte Koordinatensystem angewandt – sprich: du arbeitest mit Würfelkoordinaten, nicht mit Raumkoordinaten, um bei dem Beispiel oben zu bleiben.

Da jeder OpenGL-Anfänger auf solche Probleme stößt haben wir übrigens mehrere Tutorials zu dem Thema im Wiki:
Tutorial Objekt gedreht und dennoch nach vorne bewegt
Tutorial Objekt immer um eigene Achse drehen

Edit: Mist, nun warst du schneller. Ich lösche trotzdem nicht, was ich mühsam ausformuliert habe ;)

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 31, 2018 20:53 
Offline
DGL Member

Registriert: Sa Jul 24, 2010 12:34
Beiträge: 7
Also ich möchte ein Raumschif Frei im Raum fliegen lassen.
Dafür habe ich:

Rot.X := 0 ... 360° --> Pitch
Rot.Y := 0 ... 360° --> Yaw
Rot.Z := 0 ... 360° --> Roll

Mein Raumschiff sieht man von hinten, direkt aus dem 0,0,0 oder von einer festen Kammera aus je nach dem welche Option ich einstelle. Der fehler trift auf sobald ich die Z Achse welche ich als erste Rotiere verändere. Hier mal der ganze Aufruf der Procedur.

Code:
  1.  
  2. glMatrixMode(GL_MODELVIEW);
  3. glLoadIdentity;
  4. SteuerungShip; // Hier werden die Winkel von 0...360 erzeugt;
  5. glTranslatef(ActivShip.Pos.X, ActivShip.Pos.Y, ActivShip.Pos.Z);
  6. glRotatef( ActivShip.Rot.Z, 0, 0, 1);
  7. glRotatef(-ActivShip.Rot.X, ActivShip.Cos.Z, ActivShip.Sin.Z, 0);
  8. glRotatef(-ActivShip.Rot.Y, ActivShip.Sin.Z, ActivShip.Cos.Z, 0);
  9. glTranslatef(0,0,-5+Maus.Rad);
  10. glGetFoatv(GL_MODELVIWE_MATRIX, @KMatrix);
  11.  
  12. // Ab hier zeichne ich einfach alle Raumschiffe in einer Procedur hintereinander weg, das intressante was nicht funktioniert sind wenn LoadIdentity ture
  13. // übergeben wird damit werden die Objekte im Raum gezeichnet welche sich ja bewegen sollen. Der Kamera.Rot ist einfach ein Effekt der das eigene Schiff
  14. // etwas in die Seite zieht bei bewegeung. Das funktioniert ohne Probleme.
  15.  
  16. if LoadIdentity then begin
  17.   glLoadMatrixf(@KMatrix);
  18.   glTranlatef(Chunk.Pos.X, Chunk.Pos.Y, Chunk.Pos.Z);
  19.   glRotatef(Chunk.Rot.Z, 0, 0, 1);
  20.   glRotatef(Chunk.Rot.X, 1, 0, 0);  // Tests mit Sin und Cos ergeben hier keine erkennbare veränderung sind allerdings aktuell auch Feste Objekte im Raum
  21.   glRotatef(Chunk.Rot.Y, 0, 1, 0);
  22. end else begin
  23.   glLoadIdentity; // Hier das eigene Shiff
  24.   glTranslatef(0, 0, -5+Maus.Rad);
  25.   glRotatef(Kamera.Rot.Z, 0, 0, 1);
  26.   glRotatef(Kamera.Rot.X, 1, 0, 0);
  27.   glRotatef(Kamera.Rot.Y, 0, 1, 0);
  28. end;
  29. for I: 0 to Hight(Chunk.Cube) do begin  // Das Zeichnen passt sind aktuell nur Würfel.
  30.   ZeichneQuadsfürdasSchiff;
  31. end;
  32.  


Ach so der Kamera.Rot.z...x...y wird bei stillstand langsam richtung 0 gesetzt kann man eigentlich vernachlässigen für den Fehler. Tritt auch ohne die Rotationen dort auf.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 01, 2019 10:26 
Offline
DGL Member

Registriert: Sa Jul 24, 2010 12:34
Beiträge: 7
https://wiki.delphigl.com/index.php/Tutorial_OpenGL3_Lineare_Algebra#Rotation_um_alle_Achsen_mit_einer_Matrix

Das die Lösung. Hab ich schon eingebaut und funktioniert winderbar. Zuerst hatte ich die Spalten mit den Zeilen vertauscht was den selben fehler wie bei meiner vorherigen Lösung verursacht hat. So jetzt fehlt nur noch die Bewegung was aber ein hoffentlich einfacheres Problem darstellt da mir ja der Vektor in die vorwärts Richtung schon gegeben ist.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.023s | 15 Queries | GZIP : On ]