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

Aktuelle Zeit: Fr Jul 18, 2025 08:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 11, 2008 07:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Solange du nicht noch "fliegen" willst (sprich wenn du nach oben guckst gehts nach oben)
müsste es reichen wenn du aus:
Code:
  1.  
  2.       glRotatef(rotation, 0, 1, 0); // Drehung um Y-Achse um rotation Grad
  3.  
  4.       glTranslatef(-X, -Y, Z); // Y ist die Höhe, X und Z die entsprechenden Koordinaten
  5.  

folgendes machst:
Code:
  1.  
  2.       glRotatef(rotationY, 0, 1, 0); // Drehung um Y-Achse um rotation Grad
  3.       glRotatef(rotationX, 1, 0, 0); // Drehung um X-Achse um rotation Grad
  4.  
  5.       glTranslatef(-X, -Y, Z); // Y ist die Höhe, X und Z die entsprechenden Koordinaten
  6.  

Dann musst du natürlich rotationY & rotationX von Tastertur / Maus / ... einlesen

(Hab aber gerade keinen Compiler, also korregiert mich wenn ich falsch liege ^^)

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 11, 2008 09:33 
Offline
DGL Member
Benutzeravatar

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:

++++1. glTranslate(-PosX,-PosY,-PosZ)
++++2. glRotate(Winkel,X,Y,Z)
++++3. glTranslate(+PosX,+PosY,+PosZ)

sondern so:

++++1. glTranslate(+PosX,+PosY,+PosZ)
++++2. glRotate(Winnkel,X,Y,Z)
++++3. glTranslate(-PosX,-PosY,-PosZ)

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. :wink:

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.

Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 12, 2008 23:04 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Zu 5):

Code:
  1. glPushMatrix;
  2. glTranslate(+PosX,+PosY,+PosZ);
  3. glRotate(Winnkel,X,Y,Z);
  4. bla;
  5. glPopMatrix;

wäre eine Möglichkeit, die ganz sinnvoll ist, wenn mehrere Transformationen benutzt werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 03, 2009 13:13 
Offline
DGL Member

Registriert: Mo Jun 30, 2008 12:47
Beiträge: 69
Hab mal vor ewigkeiten ne Klasse dafür geschrieben ...
weiß nicht mehr genau wie aktuell das ist ...
schaus dir mal an

die docam methode sollte in der projections-matrix gemacht werden ...

Code:
  1.  
  2. variablen:
  3.   cam: TCam;
  4.  
  5. oncreater ereignis:
  6.   cam.Init;
  7.  
  8. render methode:
  9.   glMatrixMode( gl_Projection );
  10.   ...
  11.   cam.DoCam;
  12.   ..
  13.   glMatrixMode( gl_ModelView );
  14.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
...GOD is wearing black...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

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