Sistema Solar realizado en OpenGl que muestra el render de 3 esferas ubicadas en el espacio en reprecentacion al sistema solar (Sol, Tierra y la luna).
En este ejemplo se utiliza la librería GLUT como extensión de OpenGl y es un código sencillo con fines didácticos, en lo que se utiliza las funciones básicas de (render imediato) OpenGl para generación de cuerpos en 3D y la ubicación de los mismo en el espacio.
Podemos observar el trabajo en las matrices y la pila de matrices para ir cuidando las posiciones relativas de trabajo utiles para ubicar las figuras en el espacio.
Tambien en el ejemplo manejamos los eventos del teclado que permiten realizar los movimientos basicos del sistema, como son la rotacion y traslacion del planeta, que representan los dias y los años, y la traslacion de la luna alrededor del planeta, representando las horas.
En este ejemplo se utiliza la librería GLUT como extensión de OpenGl y es un código sencillo con fines didácticos, en lo que se utiliza las funciones básicas de (render imediato) OpenGl para generación de cuerpos en 3D y la ubicación de los mismo en el espacio.
Podemos observar el trabajo en las matrices y la pila de matrices para ir cuidando las posiciones relativas de trabajo utiles para ubicar las figuras en el espacio.
Tambien en el ejemplo manejamos los eventos del teclado que permiten realizar los movimientos basicos del sistema, como son la rotacion y traslacion del planeta, que representan los dias y los años, y la traslacion de la luna alrededor del planeta, representando las horas.
1 //gcc SolarSystem.c -lGL -lGLU -lglut 2 #include <GL/gl.h> 3 #include <GL/glu.h> 4 #include <GL/glut.h> 5 6 static int year = 0, day = 0, moon=0; 7 //Variables de Control 8 9 void init(void){ 10 glClearColor (0.0, 0.0, 0.0, 0.0); 11 glShadeModel (GL_FLAT); 12 } 13 14 void display(void){ 15 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 16 glDepthFunc(GL_LEQUAL); 17 glEnable(GL_DEPTH_TEST); 18 glClearDepth(1.0); 19 glColor3f (1.0, 0.0, 0.0); 20 glPushMatrix(); 21 glutWireSphere(0.7, 20, 16); 22 /* Dibuja el Sol */ 23 glRotatef (15, 0.0, 0.0, 1.0); //angulo constante de inclinacion en z 24 glRotatef ((GLfloat) year, 0.0, 1.0, 0.0); //angulo segun el año 25 glTranslatef (3.0, 0.0, 0.0); //Distancia entre el sol y le planeta 26 glPushMatrix(); 27 glRotatef ((GLfloat) day, 0.0, 1.0, 0.0); //angulo del planeta Dia 28 glColor3f (0.0, 0.0, 1.0); 29 glutWireSphere(0.3, 10, 8); //planeta 30 glPopMatrix(); 31 /* Dibuja un planeta */ 32 glRotatef (-25, 0.0, 0.0, 1.0); //Angulo constante de la luna 33 glRotatef ((GLfloat) moon, 0.0, 1.0, 0.0); //Angulo de la luna segun la hora 34 glTranslatef (0.5, 0.0, 0.0); //Distancia planeta luna 35 glColor3f (0.7, 0.7, 0.7); 36 glutWireSphere(0.07, 10, 8); //luna 37 /* draw smaller planet */ 38 glPopMatrix(); 39 glutSwapBuffers(); 40 } 41 42 void reshape (int w, int h) 43 { 44 glViewport (0, 0, (GLsizei) w, (GLsizei) h); 45 glMatrixMode (GL_PROJECTION); 46 glLoadIdentity (); 47 gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 48 glMatrixMode(GL_MODELVIEW); 49 glLoadIdentity(); 50 gluLookAt (0.0, 1.0, 6.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 51 } 52 53 void keyboard (unsigned char key, int x, int y) 54 { 55 switch (key) { 56 case 'd': 57 day = (day + 10) % 360; 58 glutPostRedisplay(); 59 break; 60 case 'D': 61 day = (day - 10) % 360; 62 glutPostRedisplay(); 63 break; 64 case 'y': 65 year = (year + 5) % 360; 66 glutPostRedisplay(); 67 break; 68 case 'Y': 69 year = (year - 5) % 360; 70 glutPostRedisplay(); 71 break; 72 case 'm': 73 moon = (moon + 10) % 360; 74 glutPostRedisplay(); 75 break; 76 case 'M': 77 moon = (moon - 10) % 360; 78 glutPostRedisplay(); 79 break; 80 default: 81 break; 82 } 83 } 84 85 int main(int argc, char** argv) 86 { 87 glutInit(&argc, argv); 88 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 89 glutInitWindowSize (500, 500); 90 glutInitWindowPosition (100, 100); 91 glutCreateWindow (argv[0]); 92 init (); 93 glutDisplayFunc(display); 94 glutReshapeFunc(reshape); 95 glutKeyboardFunc(keyboard); 96 glutMainLoop(); 97 return 0; 98 }
0 comentarios: