PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL und Kamera bewegen ???


Einfachkrank
2002-08-26, 19:54:27
Hi,

ich habe jetzt mal eine etwas peinliche Frage. In OpenGL gibt es ja die sogenannte gluLookAt() Funktion. Darf ich das so verstehen, dass ich mit Hilfe von dieser Funktion die Kamera "bewegen" kann? Und wenn ja, dann wie muss ich das einstellen, also welche glMatrixMode() muss ich setzen etc.

MFG Einfachkrank

zeckensack
2002-08-26, 20:13:28
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); //ganz wichtig!!!
gluLookAt(blablabla);

Noch was zur Begrifflichkeit: gluLookAt kommt aus der Utility-Sammlung glu, ist also nicht Teil von OpenGL.

Mit etwas Kreativität und Mathe kann man die Matrizen auch selbst erzeugen und an OpenGL übergeben (mit glLoadMatrix und glMultMatrix).

'Die Kamera bewegen' ist übrigens das gleiche, wie die Welt zu bewegen - nur in die andere Richtung. OpenGL trennt dies nicht, deswegen heißt der entsprechende Matrix-Stack auch 'Modelview'.

Einfachkrank
2002-08-26, 20:22:31
@zeckensack
Ja ich kenn mich eigentlich mit den Matrixfunktion aus, nur bringt mir das Speed oder kommt es auf dasselbe raus?

zeckensack
2002-08-26, 20:29:08
Originally posted by Einfachkrank
@zeckensack
Ja ich kenn mich eigentlich mit den Matrixfunktion aus, nur bringt mir das Speed oder kommt es auf dasselbe raus? Hmmm ...
Kommt eigentlich auf dasselbe raus. Ich denke, man kann das möglicherweise viel schneller machen als die GLU, aber man backt ja nicht tausende von 'Kamera'-Matrizen pro Frame ... in der Regel nur eine. Ist also IMO total unkritisch.

Der Vorteil, der sich ergibt, ist daß man halt flexibler ist. Wenn du zB mal angefangen hast, deine Kamera intern als Quaternion darzustellen ... naja egal, du kannst halt mit gluLookAt nur eine Klasse Matrizen erzeugen, und du mußt die Parameter dafür passend haben. Solange du mehr nicht brauchst, gibt es in der Praxis keinen Nachteil.

Einfachkrank
2002-08-26, 20:42:56
@zeckensack
Also ich erklärs dir mal kurz. Mein Vorhaben ist, die kamera um einen Würfel zu drehen. Sie soll sich einmal im Kreis um ihn drehen und dabei immer auf ihn sehen. kennt ja jeder und ich dachte es ginge mit der gluLookAt() vielleicht. Kannst du mir da mal einen Vorschlag machen? :eyes:

MeLLe
2002-08-26, 21:15:19
wieso drehst du nicht den würfel an sich? :D :D :D

zeckensack
2002-08-26, 21:15:53
Klor ...

1)Der Würfel sollte für dieses Beispiel koordinatenmäßig um (0;0;0) zentriert sein.

2)float camera_rotation=0.0f; //note: radians, not degrees
float camera_distance=20.0f; //whatever
glMatrixMode(GL_MODELVIEW);
while (running)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
float camera_x=sin(camera_rotation)*camera_distance;
float camera_z=cos(camera_rotation)*camera_distance;
gluLookAt(camera_x,0.0,camera_z,0.0,0.0,0.0,0.0,1.0,0.0);
render_cube();
SwapBuffers(...);
camera_rotation+=pi*daumen*(am besten zeit seit letztem frame für saubere animation);
}
oder so :)
Den Würfel mußt du selber machen, kleine Hausaufgabe :D

Einfachkrank
2002-08-27, 14:18:16
Einen Würfel zu machen ist eigentlich nicht schwer. Ich habe jetzt einfach mal sechs GL_QUADS zeichnen lassen. Aber geht das auch einfacher, gibt es da vorgefertigte Funktionen?

zeckensack
2002-08-27, 17:38:49
Erstmal Frage:
Hat's soweit geklappt? Dreht sich das Teil jetzt?

Originally posted by Einfachkrank
Einen Würfel zu machen ist eigentlich nicht schwer. Ich habe jetzt einfach mal sechs GL_QUADS zeichnen lassen. Aber geht das auch einfacher, gibt es da vorgefertigte Funktionen? Optimieren kann man bei 'nem einzelnen Würfel schon, das lohnt sich IMO aber nicht wirklich.

Wenn man nur einen Würfel auf den Bildschirm zaubert, dann wird die Performance idR rein davon bestimmt, wie schnell die Karte die Puffer löschen kann :D
Und ein klein wenig Füllrate geht natürlich auch drauf.

Wenn du trotzdem optimieren willst,
Hint:
Ein Würfel lässt sich mit zwei Triangle Fans darstellen.

Was man sich angewöhnen sollte, ist den Oberflächen ein gemeinsames 'Winding' zu verpassen und backface culling einzuschalten.
Du kannst es zB so drehen, daß alle Oberflächen (von der Außenseite des 'Modells' betrachtet) im Gegenuhrzeigersinn verlaufen (wird durch die Reihenfolge der Koordinatenübergabe gesteuert). Wenn du dann Backface culling anschaltest, sparst du bis zu 50% füllrate.

Schau dir mal die NeHe-Tutorials (http://nehe.gamedev.net/) an, da findest du 'ne Menge guter Infos für den Anfang.

Einfachkrank
2002-08-27, 18:08:00
Also den Würfel ist zu sehen, sogar mit beleuchtung und Alpha Blending dass sich rauf und runter drehen lässt, aber die Kamera bleibt einfach stehen und rührt sich nicht, zeigt aber alles an.

aths
2002-08-27, 19:11:47
Was habe ich mich damals mit Würfeln rumgequäl0rt. Meine Würfelroutine war zum Schluß relativ flexibel, aber leider nicht objektorientiert, und irre lahm.