liquid
2003-06-06, 13:45:33
Moinsen,
ich habe eine virtuelle Kameraklasse in OGL gebaut (weil es unter OGL ja in dem Sinne keine Cam gibt).
Jedenfalls basiert die momentane Kamera (ich habe noch Quaternionen im Angebot, aber das ist momentan nicht relevant) auf einem Achsensystem und einem Positionsvektor.
Das Achsensystem sieht folgendermaßen aus:
front = 0|0|1
up = 0|1|0
right = 1|0|0
Der Positionsvektor is standard auf 0|0|0
Der Up-Vektor bleibt konstant auf 0|1|0, da die Kamera nicht die Möglichkeit haben soll um die Z-Achse herum zu rotieren (ähnlich der Bewegung wenn man den Kopf nach links/rechts neigt). Der right und front Vektor werden durch den Input von Maus und Tastatur geändert.
Dazu speichere ich noch einen roll und pitch Wert (X- und Y-Achsen Rotation). Ja, es werden jetzt welche sagen, dass roll und pitch falsch zugeordnet sind, aber ich habe einfach so viel Material im inet gefunden, was sich auch gegenseitig bei der Namensgebung widersprochen hat, sodass ich am Ende bei roll und pitch geblieben bin. Naja, ist ja auch egal.
Jedenfalls werden pro Frame die roll und pitch Werte verändert (durch den Input) und dann mit Sinus und Cosinus die neuen front und right Vektoren errechnet (Kreuzprodukt mit dem up-Vektor, um ein orthonormales System zu erhalten).
So, nun meine eigentliche Frage. Ich hab jetzt ja die roll und pitch Werte. Ich habe es vorher so gemacht, dass ich die bei der toGL Methode (welche die Kamera an die OGL state machine weitergibt) die Rotation mit glRotate durchgeführt habe. Ich käme dabei auf insgesamt 3 Aufrufe. Zweimal glRotate und dann noch glTranslate für die Verschiebung der Kamera.
Eine andere Methode wäre ja noch die Positionierung der Kamera über die GLU Bibliothek. Ich habe mir das mal angeguckt, da die Funktion in vielen OGL Applikationen benutzt wird, um die virtuelle Kamera richtig zu positionieren. Der Sourcecode ist ja erhältlich und was da passiert ist ja einfach nur das Zusammenbasteln einer passenden Matrix.
Ich habe mir das weiter angeguckt und rausgefunden, dass eigentlich alle Vektoren, die in dieser Matrix stecken bei mir schon fast fertig berechnet sind. Ich habe deshalb meinen toGL Code umgeändert, sodass er glMultMatrix benutzt. Sind deshalb nur noch zwei GL Aufrufe (glMultMatrix und glTranslate).
Frage, ist das jetzt besser, oder ist es schneller die Rotation über glRotate durchzuführen? Ich meine irgendwo gelesen zu haben, dass es besser wäre die normalen Funktion (ala glTranslate/Rotate) zu benutzen, als sich selbst die Rotationsmatrix zusammenzubasteln. Aber... warum GL die Matrix in mehr Schritten zusammenbasteln lassen, wenn sie ja schon fertig serviert werden kann.
Außerdem wäre es ja gar kein Problem, wenn ich jetzt noch Z-Rotation haben wollte, auch den Up-Vektor entsprechnend zu modifizieren. An der Matrix-Bastelei müsste ich da ja gar nichts ändern.
Mit glRotate käme dann ja noch ein Rotationskommando hinzu. Und dazu muss dieses noch Sinus und Cosinus durchführen, um den Winkel entsprechend zu verwenden. Das habe ich allerdings alles schon getan, warum also das doppelt durchführen lassen?
Was meint ihr? Ich bin eigentlich der Meinung, dass man das mit glMultMatrix ruhig machen sollte, schließlich hat man schon alle Werte und übersichtlicher ist es auch.
Ahja, was mit gerade einfällt. Es ist mit Sicherheit möglich (ich weiß, dass es möglich ist) die Verschiebung (glTranslate) auch in der Matrix unterzubringen (ist ja schließlich homogen, damit die Rechnung einheitlicher ist, nur Multis schließlich, bei 3x3 Matrizen bräuchte man ne Addition).
Wo genau kommt der Positionsvektor hin?
[00][04][08][12]
[01][05][09][13]
[02][06][10][14]
[03][07][11][15]
Ist doch richtig so mit den Indizes (bei DirectX wäre es transponiert)?
Also der "quadratische" Bereich von 00|02|08|10 ist ja mit den right, front und up-Vektoren "besetzt".
15 ist 1.0
Wo kommt der Pos-Vektor hin? Auf 03|07|11 oder 12|13|14 ?
Schonmal besten Dank für Antworten!!
cya
liquid
ich habe eine virtuelle Kameraklasse in OGL gebaut (weil es unter OGL ja in dem Sinne keine Cam gibt).
Jedenfalls basiert die momentane Kamera (ich habe noch Quaternionen im Angebot, aber das ist momentan nicht relevant) auf einem Achsensystem und einem Positionsvektor.
Das Achsensystem sieht folgendermaßen aus:
front = 0|0|1
up = 0|1|0
right = 1|0|0
Der Positionsvektor is standard auf 0|0|0
Der Up-Vektor bleibt konstant auf 0|1|0, da die Kamera nicht die Möglichkeit haben soll um die Z-Achse herum zu rotieren (ähnlich der Bewegung wenn man den Kopf nach links/rechts neigt). Der right und front Vektor werden durch den Input von Maus und Tastatur geändert.
Dazu speichere ich noch einen roll und pitch Wert (X- und Y-Achsen Rotation). Ja, es werden jetzt welche sagen, dass roll und pitch falsch zugeordnet sind, aber ich habe einfach so viel Material im inet gefunden, was sich auch gegenseitig bei der Namensgebung widersprochen hat, sodass ich am Ende bei roll und pitch geblieben bin. Naja, ist ja auch egal.
Jedenfalls werden pro Frame die roll und pitch Werte verändert (durch den Input) und dann mit Sinus und Cosinus die neuen front und right Vektoren errechnet (Kreuzprodukt mit dem up-Vektor, um ein orthonormales System zu erhalten).
So, nun meine eigentliche Frage. Ich hab jetzt ja die roll und pitch Werte. Ich habe es vorher so gemacht, dass ich die bei der toGL Methode (welche die Kamera an die OGL state machine weitergibt) die Rotation mit glRotate durchgeführt habe. Ich käme dabei auf insgesamt 3 Aufrufe. Zweimal glRotate und dann noch glTranslate für die Verschiebung der Kamera.
Eine andere Methode wäre ja noch die Positionierung der Kamera über die GLU Bibliothek. Ich habe mir das mal angeguckt, da die Funktion in vielen OGL Applikationen benutzt wird, um die virtuelle Kamera richtig zu positionieren. Der Sourcecode ist ja erhältlich und was da passiert ist ja einfach nur das Zusammenbasteln einer passenden Matrix.
Ich habe mir das weiter angeguckt und rausgefunden, dass eigentlich alle Vektoren, die in dieser Matrix stecken bei mir schon fast fertig berechnet sind. Ich habe deshalb meinen toGL Code umgeändert, sodass er glMultMatrix benutzt. Sind deshalb nur noch zwei GL Aufrufe (glMultMatrix und glTranslate).
Frage, ist das jetzt besser, oder ist es schneller die Rotation über glRotate durchzuführen? Ich meine irgendwo gelesen zu haben, dass es besser wäre die normalen Funktion (ala glTranslate/Rotate) zu benutzen, als sich selbst die Rotationsmatrix zusammenzubasteln. Aber... warum GL die Matrix in mehr Schritten zusammenbasteln lassen, wenn sie ja schon fertig serviert werden kann.
Außerdem wäre es ja gar kein Problem, wenn ich jetzt noch Z-Rotation haben wollte, auch den Up-Vektor entsprechnend zu modifizieren. An der Matrix-Bastelei müsste ich da ja gar nichts ändern.
Mit glRotate käme dann ja noch ein Rotationskommando hinzu. Und dazu muss dieses noch Sinus und Cosinus durchführen, um den Winkel entsprechend zu verwenden. Das habe ich allerdings alles schon getan, warum also das doppelt durchführen lassen?
Was meint ihr? Ich bin eigentlich der Meinung, dass man das mit glMultMatrix ruhig machen sollte, schließlich hat man schon alle Werte und übersichtlicher ist es auch.
Ahja, was mit gerade einfällt. Es ist mit Sicherheit möglich (ich weiß, dass es möglich ist) die Verschiebung (glTranslate) auch in der Matrix unterzubringen (ist ja schließlich homogen, damit die Rechnung einheitlicher ist, nur Multis schließlich, bei 3x3 Matrizen bräuchte man ne Addition).
Wo genau kommt der Positionsvektor hin?
[00][04][08][12]
[01][05][09][13]
[02][06][10][14]
[03][07][11][15]
Ist doch richtig so mit den Indizes (bei DirectX wäre es transponiert)?
Also der "quadratische" Bereich von 00|02|08|10 ist ja mit den right, front und up-Vektoren "besetzt".
15 ist 1.0
Wo kommt der Pos-Vektor hin? Auf 03|07|11 oder 12|13|14 ?
Schonmal besten Dank für Antworten!!
cya
liquid