[OpenGL] Kamerafahrt
-
Ein Kreis im 3D-Raum?
Nun ja, eine Achse bleibt konstant.
Die Werte auf den anderen beiden Achsen ändern sich immer so, daß deren Quadrate zusammenaddiert den Radius ausmachen...
-
void RenderOpenGL() { static GLdouble rotate; static GLdouble view; static GLdouble look; rotate += 0.01; if (rotate >= 360.0) rotate = 0.0; view = sin(rotate); // look = cos(rotate); // ... gluLookAt(0.0, view, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); // ... }
Ich hab hier einen normalen Würfel gezeichnet + Textur und ich dachte gluLookAt würde wenigstens bei 360° einmal um den Kreis fahren, aber nein jetzt schwankt das Bild nur so komisch rum
Wie schaffe ich eine komplette Umrundung?
-
HAR schrieb:
void RenderOpenGL() { static GLdouble rotate; static GLdouble view; static GLdouble look; rotate += 0.01; if (rotate >= 360.0) rotate = 0.0; view = sin(rotate); // look = cos(rotate); // ... gluLookAt(0.0, view, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); // ... }
Ich hab hier einen normalen Würfel gezeichnet + Textur und ich dachte gluLookAt würde wenigstens bei 360° einmal um den Kreis fahren, aber nein jetzt schwankt das Bild nur so komisch rum
Wie schaffe ich eine komplette Umrundung?void gluLookAt
( GLdouble eyeX
, GLdouble eyeY
, GLdouble eyeZ
, GLdouble centerX
, GLdouble centerY
, GLdouble centerZ
, GLdouble upX
, GLdouble upY
, GLdouble upZ
);eyeX, eyeY, eyeZ
Specifies the position of the eye point.
centerX, centerY, centerZ
Specifies the position of the reference point.
upX, upY, upZ
Specifies the direction of the up vector.
Der Referenzpunkt ist bei Dir ein konstanter Wert (die Mitte Deines Würfels nehme ich an), der Up-Vector ist auch konstant auffe Y-Achse... schön...
Dein Auge ist nur von view auf der Y-Achse abhängig. Da view = sin(0 - 360) ist, und Sinus nunmal die ganze Zeit zwischen 1 und -1 schwankt, wird Dein Auge also nur auf der Y-Achse hoch und runter-schwingen... is' doch klar!
Da ein Kreis auch mehr als 1-dimensionale Ausdehnung hat, wirst Du nicht viel erreichen, wenn Du nur EINE Achse von irgendwas abhängig machst...
-
Also, ich habe das bislang nicht probiert, weil ich auch noch recht neu bei OpenGL dabei bin. Aber vielleicht sind einige meiner Vermutungen und Hinweise doch richtig (sollten sie jedenfalls teilweise *g*).
1. Statt "sin(rotate)" versuchs vielleicht mal mit "sin(2 * M_PI * rotate / 360)", damit du auch GRAD benutzt. Dann bekommst du auch bei Eingaben von 0.0f bis 360.0f die von dir gewünschten "richtigen" Werte von -1.0f bis 1.0f. M_PI ist nicht ANSI, falls es dein Compiler also nicht anerkennt solltest du es dir erst noch definieren (ist jedoch unwahrscheinlich, daß du das machen mußt):
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif2. bei gluLookAt veränderst du momentan nur die Y-Achse, du solltest da aber zwei Achsen verändern, damit auch die Kreisbewegung zustande kommt. Ansonsten bekommst du nämlich nur eine Hoch-Runter-Bewegung.
Ich hoffe, ich konnte helfen :).
Cheers,
BassPlace
-
Aaaah, danke Jungs, jetzt kapier ich auch wenigstens die gluLookAt() Funktion und was es mit der "Referenz" auf sich hat!
Und danke, werde die 2. Achse auch berücksichtigen, wenn ich Zeit dazu habe...
-
Ich komme nicht weiter, es scheint dass der hintere Teil des Würfels verschluckt wird, hier mal Code:
void InitOpenGL() { glViewport(0, 0, WIDTH, HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (GLfloat)WIDTH/(GLfloat)HEIGHT, 0.1, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_SMOOTH); glClearDepth(1.0); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glClearColor(0.0, 0.0, 0.0, 0.0); if(!LoadGLTextures()) { fprintf(stderr, "Unable to load bitmap file!\n"); exit(-1); } glEnable(GL_TEXTURE_2D); } void RenderOpenGL() { //static bool b_rotate; static GLdouble rotate; static GLdouble viewx; static GLdouble viewz; /*if(b_rotate) { ++rotate; if (rotate >= 360.0) b_rotate = false; } else { --rotate; if (rotate <= 0.0) b_rotate = true; }*/ ++rotate; if(rotate >= 360.0) rotate = 0.0; viewx = sin(2 * M_PI * rotate / 360); viewz = cos(2 * M_PI * rotate / 360); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0, 0.0, -6.0); gluLookAt(viewx, 0.0, viewz, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); }
-
gluLookAt(viewx, 0.0, viewz, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
habe ich in
gluLookAt(viewx, 0.0, viewz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
geändert, das schien das Problem zu sein. Wie bewertet ihr den Code?
-
2-
-
jippi :p
-
Herzlichen Glückwunsch :).