Opengl: Kugel rotieren im Kreis
-
Hallo,
ich habe eine ganz einfache "3D Szene" (einen Grid Boden) und eine Kugel erstellt, und zwar folgendermaßen:
#include <windows.h> #include "gridroom.h" #include <GL/glut.h> #include <math.h> #include <stdio.h> void init(void) { //Hintergrund ist schwarz glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH); glEnable(GL_DEPTH_TEST); GLfloat light0_pos[]={1.0, 5.0, 3.0, 1.0}; /*Position der Lichtquelle*/ glLightfv(GL_LIGHT0, GL_POSITION, light0_pos); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } void grid(void){ glDisable(GL_LIGHTING); /* * glTranslate(a,b,c) verschiebt den Koordinatenursprung * des aktuellen Koordinatensystems * um a Einheiten in die Richtung der X-Achse, um b * Einheiten in die Richtung der Y-Achse und um c Einheiten in die Richtung der Z-Achse. */ glTranslatef(1,-1,-1); /* * glRotate(w,x,y,z) rotiert das * Koordinatensystem um w Grad um die Rotationsachse * welche durch (0,0,0) und (x,y,z) verläuft. glRotate * richtet also die Achsen neu aus. (Die Richtung der Achsen * ist z.B. wichtig für glTranslate) */ glRotatef(0,0,1,0); //glScalef(0.9,0.5,0.5); glBegin(GL_LINES); for(int i=-10;i<=10;++i) { glVertex3f(i,0,-10); glVertex3f(i,0,10); glVertex3f(10,0,i); glVertex3f(-10,0,i); } glEnd(); glEnable(GL_LIGHTING); } GLfloat angle=0.0; void spin(void) { angle+=1; glutPostRedisplay(); } //zeichnet die Kugel in die Szene void sphere(void){ glTranslatef(-1,1,-2); glRotatef(angle,0,1,0); // Set the current OpenGL color to red glColor4f(1.0, 0.0, 0.0, 1.0); // Draw a wire sphere glutWireSphere(0.3, 30, 30); } void zeichenfunktion(void) { glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); grid(); sphere(); glLoadIdentity(); glutSwapBuffers(); } void reshape(int w, int h) { if(w==0) h = 1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,(float)w/h,0.1,100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB|GLUT_DEPTH); //wie z.B. das Fenster //hier die Größe glutInitWindowSize (640, 480); //der Ort wo das Fenster erscheinen soll glutInitWindowPosition (100, 100); //und der Titel des Fensters glutCreateWindow ("3Droom"); init (); glutDisplayFunc(zeichenfunktion); glutReshapeFunc(reshape); glutIdleFunc(spin); glutMainLoop(); return 0; }
Mit diesem Code rotiert du Kugel um die y-Achse. Ich möchte aber, dass sie sich nicht um sich selbst dreht, sondern im Kreis fliegt. Das wäre ja dann die y-Achse des Bodens, sprich die Weltkoordinate?
Leider weiß ich nicht wie ich das bewerkstelligen soll. Wäre für jede Hilfe dankbar.
-
In OpenGL werden die Transformationsmatrizen (und Vektoren) von rechts "anmultipliziert".
Wenn du also schreibst:glTranslatef(...); glRotatef(...); // zeichne was
, T die Translationsmatrix ist, R die Rotationsmatrix und A die alte Matrix auf dem Matritzenstapel, dann steht auf dem Stapel nun: (ATR).
Wird nun ein Punkt v transformiert, so geschiecht dies durch: (ATR)v.
Wenn man jetzt ein paar Klammern entsprechend der Assoziativitätsregeln bei Matrizen etwas umstellt, steht da: A(T(Rv)). Das macht die Sache etwas einfach zum Nachvollziehen.
v wird also erst rotiert, dann bewegt und dann ge-A't. Man kann so erkennen, dass die Transformation, die zuerst auf den Punkt ausgeführt werden soll, als letztes bei OpenGL spezifiziert werden muss (sei es durch MultMatrix oder durch die Helferfunktionen). Ich hoffe, das hilft Dir, Dein Problem zu lösen.
-
glRotate rotiert halt Objekte. Willst du nur die Position eines Objektes ändern, darfst du glRotate nicht verwenden, sondern nur translate. Die Position, die du dann haben willst, kannst du ganz leicht mit den trigonometrischen Funktionen ausrechnen.
-
Hi,
hab es jetzt erstmal soweit dass sich meine Kugel entlang der x-Achse hin und her bewegt. Das mit der Kreisbewegung bekomme ich dann hoffentlich auch noch hin.