Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallo, Leute
um eine Drehung/Positionierung der Kamera ordentlich hinzukriegen, ist es vielleicht nicht schlecht, Folgendes zu wissen:
1) Die beiden Befehle Translate/Rotate reichen vollkommen aus.
2) Es ist bei Drehungen wichtig, um welches "Ende" einer Achse man sich dreht: eine Rechts-Drehung um die positive Y-Achse ist das Gegenteil einer Rechts-Drehung um die negative Y-Achse. Man sollte sich beim Bau einer OpenGL-Kamera bei Drehungen festlegen, dass man z.B. bei einer Drehung immer die positive Seite einer Achse meint.
3) Eine Links-Drehung um die positive Y-Achse (gegen den Uhrzeigersinn = counter-clockwise CCW) macht man so:
glRotate(+Winkel,0,1,0)
Eine Rechts-Drehung um die positive Y-Achse (mit dem Uhrzeigersinn = clockwise CW) macht man so:
glRotate(-Winkel,0,1,0) ODER AUCH SO: glRotate(+Winkel,0,-1,0)
Die zweite Version ist eine positive Drehung um die negative Y-Achse.
4) Dem obigen Schema folgen alle Achsen, also ist eine Rechts-Drehung um die positive X-Achse so zu bewerkstelligen:
glRotate(-Winkel,1,0,0) oder (+Winkel,-1,0,0)
5) Wie dreht man einen Gegenstand?
***A): Drehung eines Gegenstandes, der sich im Koordinatenursprung befindet um sich selbst:
Die Drehung wird wie oben angegeben mit einem einfachen glRotate ausgeführt.
***B): Drehung eines Gegenstandes, der sich NICHT im Koordinatenursprung befindet um sich selbst:
Zuerst den Gegenstand in den Koordinatenursprung verschieben mit glTranslate(-PosX,-PosY,-PosZ)
dann in die gewünschte Richtung drehen mit glRotate.....
und dann wieder zurückverschieben mit glTranslate(+PosX,+PosY,+PosZ)
ACHTUNG! Die Reihenfolge der Transformationsbefehle ist genau umgekehrt. Es heißt NICHT etwa:
und zwar deshalb, weil OpenGL die Matrizen intern andersherum multipliziert.
6) Und jetzt das letzte Verwirrspiel, aber das ist auch im Kameratutorial nachzulesen:
Die Kamera verhält sich prinzipiell so wie ein Gegenstand. Der einzige Unterschied ist, dass man alles genau umgekehrt machen muss: will man sich nach rechts drehen, muss sich die Kamera nach links drehen (das gilt für alle Achsen); will man nach vorne, muss sich die Kamera nach hinten verschieben (das gilt für alle Richtungen).
Warum? Weil es eine OpenGL Kamera gar nicht gibt. Daher kann sie sich auch nicht bewegen. Weil die Kameramatrix beim Transformationsvorgang als allerletztes hinzumultipliziert wird (weil man sie als erste hineinschreibt und OpenGL wie oben schon gesagt alle Transformationenin der umgelehrten Reihenfolge berücksichtigt), transformiert man mit der Kameramatrix ALLES, was man gezeichnet hat: das ist gemeint mit der Aussage "Drehen wir uns um die Sonne oder dreht sich die Sonne um uns?".
Angenommen, Euer EGO-Shooter hat einen Gegner, der genau rechts von der Kamera (= Euer Protagonist) steht und greift Euch an. Dann ist es in Wirklichkeit nicht so, dass Ihr Euch nach rechts umdreht, sondern die Kameramatrix greift sich den Kerl und schubst ihn linksherum vor Eure Nase damit Ihr ihm die Faust ins Gesicht pflanzen könnt.
7) Und zum Schluss eine Definition: Die Kameramatrix ergibt sich aus der Summe aller Transformationen, die im Programm VOR den spezifischen Transformation der gezeichneten Objekte stehen. Ich sage bewußt nicht "passieren", denn die Kameratransformationen "passieren" erst ganz zuletzt.
Mitglieder in diesem Forum: Google [Bot] und 7 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.