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

Aktuelle Zeit: Fr Jul 18, 2025 08:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Quaternionen!
BeitragVerfasst: Mo Aug 31, 2009 18:01 
Offline
DGL Member

Registriert: So Aug 30, 2009 15:35
Beiträge: 2
Die einzelnen Definitionen hab ich in Pascalcode geschrieben. Einfach damit es übersichtlicher ist. Es ist also kein Code

Also ich versuch mich grad daran ein Flugzeug mit Quaternionen zu rotieren.

Ich habe auch ein sehr gutes Buch "Mathematics for Computergraphics" gefunden, welche diese sehr gut, meiner Meinung nach, erklärt. Naja ich dachte ich hätte sie verstanden, aber jetzt bieten sie mir doch Kopfzerbrechen.


Und zwar hab ich mich ziemlich nach dem Buch gerichtet mein Programm zu implementieren.

Da steht folgendes:

1. Ein Quaternion hat die Form:
Code:
  1. q = (s + xi + yj + zk)


2. Konvertierung eines Punktes p zu einem Quaternion q:
Code:
  1. q = (0 + p.xi + p.yj + p.zk)


3. Eine Rotationsachse wird in einem Einheitsvektor u gespeichert. (zB x-Achse: u= (1,0,0))

4. Ein Transformationsquaternion ist definiert als
Code:
  1. q_trans = (cos(winkel/2), sin(winkel/2)*u)


5. Ein inverser Transformationsquaternion ist definiert als
Code:
  1. q_trans_inv = (cos(winkel/2), -sin(winkel/2)*u)


6. Man kann die Drehungen pitch (Drehung um die x-Achse), yaw(Drehung um die y-Achse), roll(Drehung um die z-Achse) in drei verschiedene Quaternionen
zusammenfassen:
Code:
  1.     q_roll = (cos(roll-Winkel), (sin(roll-Winkel)*(0,0,1)))
  2.     q_pitch = (cos(pitch-Winkel), (sin(pitch-Winkel)*(1,0,0)))
  3.     q_yaw = (cos(yaw-Winkel), (sin(yaw-Winkel)*(0,1,0)))


7. Diese 3 Quaternionen kann man wieder zu einer multiplizieren.
Code:
  1.  q_z = q_yaw * q_pitch * q_roll = (s + xi + yj + zk)



Um nun einen Punkt zu tranformieren, bzw zu rotieren geht man wie folgt vor:

8. Multipliziere den Tranformationsquaternion mit dem zu rotierenden Punkt und schließlich mit der inversen Transformationsquaternion, um den transformierten Punkt p' zu erhalten. Das sieht wie folgt aus:

Code:
  1.  p' = q_trans * p * q_trans_inv


In dem oben verlinkten Buch, wird ab Seite 90 nochmal alles gut erklärt. Auch das Beispiel auf Seite 96 ist super. Falls ich was falsch verstanden hab, dann wäre ich für jede Berichtigung dankbar.

Also soviel zur Theorie.

Mein Problem ist die Implementation. Und zwar möchte ich mein Flugzeug durch die Tasten pitchen, rollen und yaw'n, falls man das so sagen kann :wink: .

Als erstes hab ich mir ne Klasse Quaternion.cpp erstellt:

Code:
  1.  
  2.  
  3.  
  4. Quaternion::Quaternion()
  5. {
  6.     s = 1;
  7.     x = y = z = 0;
  8. }
  9.  
  10. Quaternion::~Quaternion(){}
  11.  
  12. // Ich glaube hier
  13. void Quaternion::dir_vector(float pos[])
  14. {
  15.     if(!pos) return;
  16.    
  17.     pos[0] = 2*(x*z + y*s);
  18.     pos[1] = 2*(y*z - x*s );
  19.     pos[2] = 1 - 2*(x*x + y*y);
  20. }
  21.  
  22. Quaternion Quaternion::quat_mult(Quaternion p, Quaternion q)
  23. {
  24.     Quaternion res;
  25.        
  26.     res.s = (p.s*q.s) - (p.x*q.x) - (p.y*q.y) - (p.z*q.z);
  27.     res.x = (p.s*q.x) + (q.s*p.x) + (p.y*q.z) - (q.y*p.z);
  28.     res.y = (p.s*q.y) + (q.s*p.y) + (p.z*q.x) - (q.z*p.x);
  29.     res.z = (p.s*q.z) + (q.s*p.z) + (p.x*q.y) - (q.x*p.y);
  30.    
  31.     return res;
  32. }
  33.  
  34. Quaternion Quaternion::quat_point(Vector p)
  35. {
  36.     Quaternion res;
  37.    
  38.     res.s = 0;
  39.     res.x = p.x;
  40.     res.y = p.y;
  41.     res.z = p.z;
  42.    
  43.     return res;
  44. }
  45.  
  46. void Quaternion::quat_rotate(float degree, Vector p)
  47. {
  48.     float angle = float((degree / 180.0f) * PI);  // Man muss wohl in Opengl zu radian umrechnen
  49.     float res   = (float)sin( angle / 2.0f );
  50.     s = (float)cos( angle / 2.0f );
  51.  
  52.     x = float(p.x * res);
  53.     y = float(p.y * res);
  54.     z = float(p.z * res);
  55. }
  56.  
  57. void Quaternion::quat_rotate_inv(float degree, Vector p)
  58. {
  59.     float angle = float((degree / 180.0f) * PI);
  60.     float res   = (float)(-sin( angle / 2.0f ));
  61.     s = (float)cos( angle / 2.0f );
  62.  
  63.     x = float(p.x * res);
  64.     y = float(p.y * res);
  65.     z = float(p.z * res);
  66. }
  67.  
  68.  


Dann meine Flugzeugklasse.

Code:
  1.  
  2.  
  3. Flugzeug::Flugzeug()
  4. {
  5.  
  6.     pos.x = 0;
  7.     pos.y = 0;
  8.     pos.z = 0;
  9.     rotX = Tripel_Vector(1, 0, 0);
  10.     rotY = Tripel_Vector(0, 1, 0);
  11.     rotZ = Tripel_Vector(1, 0, 1);
  12. }
  13.  
  14.  
  15.  
  16. Flugzeug::~Flugzeug(){}
  17.  
  18. void Flugzeug::rotiere(float pitch_degree, float yaw_degree, float roll_degree)
  19. {
  20.     float Matrix[3];
  21.     Quaternion q, q_inv, res, temp;
  22.     Vector newPos;
  23.    
  24.     // Berechnung der Quaternionen für die jeweilige Achse
  25.     rotarX.quat_rotate(pitch_degree, rotX);
  26.     rotarY.quat_rotate(yaw_degree, rotY);
  27.     rotarZ.quat_rotate(roll_degree, rotZ);
  28.    
  29.     // Berechnung der inversen Quaternionen für die jeweilige Achse
  30.     rotarX_inv.quat_rotate(pitch_degree, rotX);
  31.     rotarY_inv.quat_rotate(yaw_degree, rotY);
  32.     rotarZ_inv.quat_rotate(roll_degree, rotZ);
  33.    
  34.     // Bestimmung der zusammengesetzten Quaternion
  35.     q     = quat_mult(quat_mult(rotarY, rotarX),rotarZ);
  36.     // Bestimmung der inversen zusammengesetzten Quaternion
  37.     q_inv = quat_mult(quat_mult(rotarY_inv, rotarX_inv),rotarZ_inv);
  38.    
  39.         // Ab hier bin ich mir ziemlich sicher, dass ein Fehler vorliegt.
  40.         // Ich glaube, dass ich das mit dem Vektor nicht so richtig verstanden hab.
  41.     q.dir_vector(Matrix);
  42.     pos = Tripel_Vector(Matrix[0], Matrix[1], Matrix[2]);
  43.    
  44.     temp = quat_point(pos);
  45.    
  46.     res = quat_mult(quat_mult(q,temp),q_inv);
  47.    
  48.     newPos.x = res.x;
  49.     newPos.y = res.y;
  50.     newPos.z = res.z;
  51.  
  52.    
  53.     glTranslatef(newPos.x,newPos.y,newPos.z);
  54.     zeichne_Flugzeug();
  55. }
  56.  
  57. void Flugzeug::zeichne_Flugzeug()
  58. {
  59.     // Ich stell das Flugzeug erstmal als Koordinatensystem dar. Später werd ich es richtig modellieren.
  60.        
  61.         glPushMatrix();
  62.         GLUquadricObj *coordObj;
  63.         coordObj = gluNewQuadric();
  64.         gluQuadricNormals(coordObj, GLU_SMOOTH);
  65.         glColor3f(1,0,0);                               // ROT Z-Achse
  66.         gluCylinder(coordObj, 0.5, 0.5, 8, 24, 8);
  67.        
  68.         glRotatef(-90,1,0,0);                            
  69.         glColor3f(0,1,0);                               // GRÜN Y-Achse
  70.         gluCylinder(coordObj, 0.5, 0.5, 8, 24, 8);
  71.        
  72.         glRotatef(90,0,1,0);
  73.         glColor3f(0,0,1);                               // BLAU X-Achse
  74.         gluCylinder(coordObj, 0.5, 0.5, 8, 24, 8);
  75.     glPopMatrix();
  76. }
  77.  


in der main

Code:
  1.  
  2.  
  3. Flugzeug FlugObj;
  4.  
  5. // Vorher zeichne ich schon mein Flugzeug mit FlugObj.rotiere(0,0,0);
  6.  
  7. void keyboard (unsigned char key, int x, int y) {
  8.     // Keyboard callback function.
  9.     switch (key) {
  10.        
  11.     case '32':
  12.         FlugObj.rotiere(0,0,0);
  13.         display();
  14.     break; 
  15.     case 'd':
  16.         FlugObj.rotiere(90,0,0);
  17.         display();
  18.     ....
  19.      }
  20.    
  21.  



Die Sache ist mein Objekt rührt sich kein Stück
Also ich glaube mein Hauptproblem liegt darin, dass ich mit Quadriken arbeite und deshalb auf die einzelnen Vertices nicht zugreifen kann.
Ich hatte im Nehe Tutorial zur Implementierung mit Quaternionen gelesen, dass der Tranformationsvektor immer in der Matrix an Stelle 8,9,10 gespeichert ist.
Nehe - Camera Class Quaternionen (in Kästchen 5)
Ich berechne diese 3 Werte in void Quaternion::dir_vector(float pos[]) und übergebe sie dann in meiner Flugzeugklasse an einen Vektor, den ich dann an glTranslate übergebe.

Also irgendwo da liegt grad der Wurm begraben.

Ich hoffe ich hab mein Problem klar genug beschrieben und euch nicht mit dem Riesenpost erschlagen.

Falls ihr irgendwo mein Text zu unklar ist, einfach fragen.
Ich starre schon so lange auf den Code und hab langsam keine Ideen mehr.

Ich wäre für eure Hilfe sehr sehr sehr dankbar.

Danke euch

Liebe Grüße

Lena


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 31, 2009 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ok, ich habe deinen Post nicht zu 100% gelesen, aber hier mal ein paar Hinweise :)
  • Mit yaw/pitch/roll zu arbeiten ist nicht so sonderlich sinnvoll. Modifiziere das Quaternion direkt indem du ein anderes daran multiplizierst.
  • Wo wird den in deinem Code die Rotation vom Quaternion an OpenGL übergeben?
  • Eine Methode die ein Quaterion in eine Matrix umwandelt ist ganz hilfreich. Einfach mal Copy&Paste aus meinem Code:
    Code:
    1.  
    2. // bei mir ist a = s, b = x, c =  y und d = z
    3. // möglicherweise musst du die Matrix transponieren
    4. template<class T> inline CMatrix44<T> CQuaternion4<T>::getMatrix44() const
    5. {
    6.     return CMatrix44<T>( (a*a + b*b - c*c - d*d), 2*(c*b+a*d)            , 2*(d*b-a*c)            , 0.0f,
    7.                          2*(b*c-a*d)            , (a*a - b*b + c*c - d*d), 2*(d*c+a*b)            , 0.0f,
    8.                          2*(b*d+a*c)            , 2*(c*d-a*b)            , (a*a - b*b - c*c + d*d), 0.0f,
    9.                          0.0f                   , 0.0f                   , 0.0f                   , 1.0f  );
    10. }
    11.  
    12. // wie getMatrix44() nur eben eine 3x3-Matrix
    13. template<class T> inline CMatrix33<T> CQuaternion4<T>::getMatrix33() const
    14. {
    15.     return CMatrix33<T>( (a*a + b*b - c*c - d*d), 2*(c*b+a*d)            , 2*(d*b-a*c)            ,
    16.                          2*(b*c-a*d)            , (a*a - b*b + c*c - d*d), 2*(d*c+a*b)            ,
    17.                          2*(b*d+a*c)            , 2*(c*d-a*b)            , (a*a - b*b - c*c + d*d)  );
    18. }
    19.  
    20. // einen Punkt mittels dem Quaternion rotieren
    21. template<class T> inline CVector3<T> CQuaternion4<T>::rotate(const CVector3<T> v) const
    22. {
    23.     return v * getMatrix33();
    24. }

    Diese Matrix kannst du dann an OpenGL übergeben.
  • Mit Quaternationen alleine lassen sich keine Translationen darstellen!
  • Verwende ein Tupel aus einem Quaternion und einem Translationsvektor. Ich nenne sowas "Frame". Man kann solche Frames dann auch miteinander multiplizieren, sodass man sie wie gewöhnliche Matrizen behandeln kann, mit dem Unterschied das z.B. das invertieren wesentlich leichter ist! Ich verweise da mal auf dieses Paper, Abschnitt III. Auch hier mal ein wenig Copy&Paste:
    Code:
    1.  
    2. // ein Frame besteht bei mir aus einem CVector3<T> p und einem CQuaternion4<T> q
    3.  
    4. // zwei Frames multiplizieren (als wären es Matrizen...)
    5. template<class T> inline CFrame7<T> CFrame7<T>::operator*(const CFrame7<T>& f) const
    6. {
    7.     return CFrame7<T>(p + q.rotate(f.p), q * f.q);
    8. }
    9.  
    10. // Frame in Matrix umwandeln
    11. template<class T> inline CMatrix44<T> CFrame7<T>::getMatrix() const
    12. {
    13.     // Quaternion-Matrix holen und Translations-Teil überschreiben
    14.     return q.getMatrix44().setW(p);
    15. }
    16.  
    17. // inverse Abbildung berechnen
    18. template<class T> inline CFrame7<T> CFrame7<T>::getInverse() const
    19. {
    20.     const CQuaternion4<T>& c = q.conjugated();
    21.     return CFrame7<T>(c.rotate(-p), c);
    22. }
    23.  
    24.  



_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 31, 2009 21:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Lena,

willkommen im Forum.

OK, Coolcat ist mir zuvor gekommen. Mein Post ist nicht so toll wie seiner. Aber da ich ihn nunmal schon geschrieben habe, stelle ich das Ganze mal rein. :wink:

Hmm, für mich sieht das so aus, als ob Du mit riesig viel Arbeit den Vektor "newPos" errechnest. Diesen steckst Du dann in die OpenGL-Funktion "glTranslatef". Das kann deshalb nicht funktionieren, denn Du möchtest eine Rotation erreichen, aber dann verschiebst Du das ganze Gebilde nur. Der Unterschied ist leicht erklärt: stell Dir mal vor, wir beide stehen uns gegenüber, das soll heißen, Deine Nase zeigt in meine Richtung. Dann drehst Du Dich (von Dir aus geshen) um 90 Grad nach rechts. Ich sehe Dich jetzt im Profil.

Dein Programm würde aber Deine Nasenspitze nicht rotieren, sondern nur verschieben (also nicht nur Deine Nasenspitze, sondern Dich als Ganzes), weil Du glTranslate benutzt. Wenn der errechnete Vertex stimmt, verschiebt er Dich ein Stück nach hinten und eine Stück nach rechts (von Dir aus gesehen). Du schaust aber nach wie vor in die gleiche Richtung.

Immer vorausgesetzt das Quaternionen-Ergebnis ist prizipiell richtig - was ich nicht nachgerechnet habe.

Was ich mit dieser langen Vorrede sagen will: Der Ansatz ist falsch, so wirst Du keine Rotation erreichen.

Ich würde einen Step-by-Step-Ansatz vorschlagen:
1. Zunächste eine einfache OpenGL-Anwendung zum Funktionieren bringen, und zwar mit glRotate anstatt des Quaternions.
2. Dann eine Lösung mit einem Quaternion verwirklichen, das nur um *eine* Achse dreht.
3. Wenn das mal erreicht ist, schließlich die Quaternionen-Multiplikation dazunehmen.

Hinweis1: wenn man keine Shader benutzt, ist es nicht möglich, ein Quaternion in einer OpenGL-Anwendung zu benutzen. Die einzige Möglichkeit, die mir einfällt: das Quaternion in eine Matrix umwandeln und als Input für glMultMatrix benutzen. Ist aber das Gleiche, was Coolcat schon gesagt hat.

Hinweis2: die Matrix, die dabei erzeugt wird, ist als Rotations-Input anzusehen, und muss sich genauso verhalten wie glRotatef.

Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 31, 2009 22:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Hinweis1: wenn man keine Shader benutzt, ist es nicht möglich, ein Quaternion in einer OpenGL-Anwendung zu benutzen. Die einzige Möglichkeit, die mir einfällt: das Quaternion in eine Matrix umwandeln und als Input für glMultMatrix benutzen. Ist aber das Gleiche, was Coolcat schon gesagt hat.

Ähm, genau....Shader braucht man eigentlich nicht...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 01, 2009 15:01 
Offline
DGL Member

Registriert: So Aug 30, 2009 15:35
Beiträge: 2
Vielen lieben Dank Coolcat und Traude.

Also gut ich wollte eigentlich so gut wie möglich vermeiden mit den Matrizen zu arbeiten, aber jetzt muss ich wohl in den sauren Apfel beißen.

Nun Coolcat ich hab mir deinen Code angeschaut. Ich bin leider in Templateklassen nicht so bewandert. Ich kann sie zwar halbwegs lesen, aber selber nutze ich sie nicht so gern, weil das ist irgendwie immer voll das Durcheinader und ich krieg immer nur Fehler.

Aber gut deinen Code habe ich, denke ich, halbwegs verstanden und kann ihn wohl in etwas, für mich, einfachere Strukturen umwandeln.

Ich hab allerdings n paar Fragen zu deinem Code.

Bitte nicht killen, wenn ich völligen Blödsinn schreibe.

1. Also, wenn ich das richtig verstanden habe bedeuted die Funktion
Code:
  1. setW(CVector3<T> p)
, dass ich aus der Matrix44 drei Werte entnehme und im Vector überschreibe.
Ist das richtig, dass es die Werte aus der dritten Zeile sind, also:

Code:
  1. 2*(b*d+a*c)            , 2*(c*d-a*b)            , (a*a - b*b - c*c + d*d)


2. Die Funktion
Code:
  1. conjugated()
erstellt aus einem Quaternion
Code:
  1. q = s + xi + yj + zk
den Quaternion
Code:
  1. q = s - xi - yj - zk


3. Bei der Funktion rotieren wird wohl ein Punkt(bzw. Vektor) übergeben, welcher zum Objekt gehört. Da ist aber mein Problem, dass ich keine konkreten Punkte übergeben kann, da mein Objekt aus Quadriken besteht. Und ich nicht auf die Punkte zugreifen kann.

Also falls ihr jetzt nur noch mit dem Kopf schüttelt, verweise ich auf den Satz aus der Sesamstraße: Wer nicht fragt, bleibt dumm.

Dank euch :wink:

Liebe Grüße

Lena


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 01, 2009 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Also gut ich wollte eigentlich so gut wie möglich vermeiden mit den Matrizen zu arbeiten, aber jetzt muss ich wohl in den sauren Apfel beißen.

Die Grafikkarte und OpenGL arbeiten nun mal mit Matrizen.

Zitat:
Ich bin leider in Templateklassen nicht so bewandert.

Das "template<class T>" kannst du auch einfach weglassen. Auch ein "<T>" kannst du ignorieren. Wenn irgendwo der Datentyp "T" benutzt wird kannst du einfach "float" annehmen. "inline" und "const Datentyp&" sind immer nur Optimierungen, kann man auch weglassen, also einfach "Datentyp" schreiben.

zu 1:
Nein. Der gegebene Vektor p = (x,y,z) wird in der Matrix an die Stellen _41, _42 und _43 geschrieben. Es handelt sich um die 4. Zeile der Matrix. In diesen Zellen befindet sich die Translation der Matrix. Anschließend wird von setW eine Referenz auf die Matrix zurückgegeben, was die Handhabung vereinfacht, da man so z.B. mehrere set*()-Aufrufe verketten kann. Die Methode setW ist wie folgt definiert:
Code:
  1. template<class T> inline CMatrix44<T>& CMatrix44<T>::setW(const CVector3<T>& vPos)
  2. {
  3.     _41 = vPos.x; _42 = vPos.y; _43 = vPos.z;
  4.     return *this;
  5. }


Die 4x4-Matrix ist bei mir übrigens so definiert. Die Werte stehen in dieser Reihenfolge im Speicher und werden daher auch so an OpenGL übergeben wenn man glMultMatrixf(&matrix._11); aufruft.
Code:
  1.  
  2. // wie oben schon geschrieben, der Typ T ist einfach float...
  3. /* _YX   => Y Line, X Column */
  4. T _11, _12, _13, _14; // X-axis
  5. T _21, _22, _23, _24; // Y-axis
  6. T _31, _32, _33, _34; // Z-axis
  7. T _41, _42, _43, _44; // Position


zu 2:
korrekt. Hier der Code:
Code:
  1. template<class T> inline CQuaternion4<T> CQuaternion4<T>::conjugated() const
  2. {
  3.     return CQuaternion4<T>(a,-b,-c,-d);
  4. }


zu 3:
Zitat:
Da ist aber mein Problem, dass ich keine konkreten Punkte übergeben kann, da mein Objekt aus Quadriken besteht.

Wenn ich mich nicht irre kannst du die Quadrik Q mit einer Transformationsmatrix M transformieren und so die gewünschte Quadrik Q' erhalten. Eine Quadrik ist ja definiert als:
Code:
  1. f(x) = x^T * Q * x

Wahrscheinlich musst du einfach x vorher transformieren, also wahrscheinlich irgendwie so etwas:
Code:
  1. Q' = M^T * Q * M

Möglicherweise musst du M auch invertieren (*), müsste man mal länger drüber nachdenken.

(*) was ja ganz leicht geht, wenn deine Matrix aus einem Quaternion erzeugt wird...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 01, 2009 17:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich arbeite nicht mit Quadriken, aber ich wette, Du musst nur die die Transformation setzen bevor Du die Quadrik zeichnest, entweder mit den OpenGL-Befehlen glTranslate/glRotate oder mit glMultMatrix (vorher glLoadIdentity nicht vergessen). Das würde ich außerst merkwürdig finden, wenn man hier noch irgendwas invertieren müsste. Man muss auch gar nicht auf die einzelnen Punkte zugreifen, denn für die Transformation ist OpenGL zuständig. Du könntest die einzelnen Punkte - wenn Du sie hättest - selber transformieren. Aber es ist eine *langsame* Methode.

Falls die Umwandlung QuaternionToMatrix in Deinem Buch nicht drin ist, hier kannst Du fündig werden:
http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm.

Das ist übrigens eine außerst nützliche Website, ein zweiter Blick drauf lohnt sich.

Zitat:
Also falls ihr jetzt nur noch mit dem Kopf schüttelt, verweise ich auf den Satz aus der Sesamstraße: Wer nicht fragt, bleibt dumm.
Genau. :)

Viele Grüße,
Traude


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 » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]