El objetivo principal consiste en dibujar una serie de esferas que simulen un sistema planetario. Para lo cual debe permitir que los planetas giren alrededor de un eje en común, en este caso un sol. Cada planeta a su vez tendrá una luna, la cual también deberá girar alrededor del mismo.
Para realizar estos movimientos, debe mantenerse presionada una tecla, para este caso será la letra a para trasladar los planetas alrededor del sol y la letra s para girar las lunas alrededor de los planetas.
El código final utilizado quedó de la siguiente manera:
--------------------------------------------------------------------------------------------
/*
Sáenz Morales Carlos Giovanni
*/
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
int anio=0, dia=0, luna=0;
int anio1=0, dia1=0, luna1=0;
int anio2=0, dia2=0, luna2=0;
int anio3=0, dia3=0, luna3=0;
int angulo_z= 10;
int angulo_z1= 220;
int angulo_z2= 50;
int angulo_z3= 70;
void init(void){
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void display(void){
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearDepth(1.0);
glColor3f (1.0, 1.0, 0.0);// color del sol
glPushMatrix();
glutWireSphere(0.7, 20, 16);/* Dibuja el Sol */
glRotatef (angulo_z, 0.0, 0.0, 1.0); //angulo constante de inclinacion en z
glRotatef ((GLfloat)anio, 0.0, 1.0, 0.0); //angulo segun el numero de años
glTranslatef (3.0, 0.0, 0.0); //Distancia entre el sol y el primer planeta
glPushMatrix();
glRotatef ((GLfloat) dia, 0.0, 1.0, 0.0); //angulo del planeta segun el dia
glColor3f (0.0, 0.0, 1.0); // color del planeta
glutWireSphere(0.3, 10, 8); /* Dibuja el primer planeta */
glPopMatrix();
glRotatef (25, 0.0, 0.0, 1.0); //Angulo constante de la luna respecto al primer planeta
glRotatef ((GLfloat) luna, 0.0, 1.0, 0.0); //Angulo de la luna segun la hora
glTranslatef (0.5, 0.0, 0.0); //Distancia de la luna respecto al primer planeta
glColor3f (0.7, 0.7, 0.7);
glutWireSphere(0.07, 10, 8); // dibuja la luna del primer planeta
glPopMatrix();
//glutSwapBuffers();
//Segundo planeta
glPushMatrix();
glRotatef (angulo_z1, 0.0, 1.0, 0.0); //angulo constante de inclinacion en z
glRotatef ((GLfloat)anio1, 0.0, 0.0, 1.0); //angulo segun el numero de años
glTranslatef (0.0, 2.0, 0.0); //Distancia entre el sol y el segundo planeta
glPushMatrix();
glRotatef ((GLfloat) dia1, 0.0, 0.0, 1.0); //angulo del planeta segun el dia
glColor3f (1.0, 0.0, 0.0); // color del planeta
glutWireSphere(0.2, 10, 8); /* Dibuja el segundo planeta */
glPopMatrix();
glRotatef (25, 0.0, 1.0, 0.0); //Angulo constante de la luna respecto al segundo planeta
glRotatef ((GLfloat) luna1, 0.0, 0.0, 1.0); //Angulo de la luna segun la hora
glTranslatef (0.0, 0.4, 0.0); //Distancia de la luna respecto al segundo planeta
glColor3f (0.5, 0.5, 0.5);
glutWireSphere(0.06, 10, 8); // dibuja la luna del segundo planeta
glPopMatrix();
//Tercer planeta
glPushMatrix();
glRotatef (angulo_z2, 1.0, 0.0, 0.0); //angulo constante de inclinacion en z
glRotatef ((GLfloat)anio2, 1.0, 0.0, 0.0); //angulo segun el numero de años
glTranslatef (0.0, 0.0, 2.0); //Distancia entre el sol y el segundo planeta
glPushMatrix();
glRotatef ((GLfloat) dia1, 1.0, 0.0, 0.0); //angulo del planeta segun el dia
glColor3f (0.6, 0.2, 0.7); // color del planeta
glutWireSphere(0.4, 10, 8); /* Dibuja el segundo planeta */
glPopMatrix();
glRotatef (25, 0.0, 1.0, 0.0); //Angulo constante de la luna respecto al segundo planeta
glRotatef ((GLfloat) luna1, 1.0, 0.0, 0.0); //Angulo de la luna segun la hora
glTranslatef (0.0, 0.0, 0.6); //Distancia de la luna respecto al segundo planeta
glColor3f (0.9, 0.9, 0.9);
glutWireSphere(0.08, 10, 8); // dibuja la luna del segundo planeta
glPopMatrix();
//Cuarto planeta
glPushMatrix();
glRotatef (angulo_z3, 0.0, 0.0, 1.0); //angulo constante de inclinacion en z
glRotatef ((GLfloat)anio3, 0.0, 1.0, 0.0); //angulo segun el numero de años
glTranslatef (3.0, 0.0, 0.0); //Distancia entre el sol y el primer planeta
glPushMatrix();
glRotatef ((GLfloat) dia3, 0.0, 1.0, 0.0); //angulo del planeta segun el dia
glColor3f (0.0, 1.0, 0.8); // color del planeta
glutWireSphere(0.3, 10, 8); /* Dibuja el primer planeta */
glPopMatrix();
glRotatef (25, 0.0, 0.0, 1.0); //Angulo constante de la luna respecto al primer planeta
glRotatef ((GLfloat) luna3, 0.0, 1.0, 0.0); //Angulo de la luna segun la hora
glTranslatef (0.5, 0.0, 0.0); //Distancia de la luna respecto al primer planeta
glColor3f (1.0, 1.0, 1.0);
glutWireSphere(0.07, 10, 8); // dibuja la luna del primer planeta
glPopMatrix();
glutSwapBuffers();
}
void keyInput(unsigned char key,int x, int y){
switch(key){
case 27:
case 'q':
exit(0);
break;
case 'a':
anio=anio+2;
anio1=anio1+5;
anio2=anio2+2;
anio3=anio3+5;
break;
case 'd':
dia=dia+2;
dia1=dia1+5;
dia2=dia2+2;
dia3=dia3+5;
break;
case 's':
luna=luna+2;
luna1=luna1+5;
luna2=luna2+2;
luna3=luna3+5;
break;
}
glutPostRedisplay();
}
void reshape (int w, int h){
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (0.0, 1.0, 6.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutKeyboardFunc(keyInput);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
---------------------------------------------------------------------------------
Al final, en la ejecución del programa, podemos obtener una secuencia de imágenes como la siguiente:




