Sistema Solar OpenGl

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