/* Auteur: Nicolas JANEY */
/* nicolas.janey@univ-fcomte.fr */
/* Octobre 2007 */
/* Un programme OpenGL d'animation automatique */
/* d'une sphere selon une orbite circulaire de */
/* periode en pow(r,1.5) (orbite keplerienne) */
/* ou r est le rayon de l'orbite */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>
/* Variables globales */
/* c : vitesse de rotation */
/* angle : valeur d'angle de rotation */
/* instantanee de la sphere en orbite */
/* r : rayon de l'orbite de la sphere */
static float c = 2.0F;
static float angle = 0.0F;
static float r = 1.5F;
/* Fonction d'affichage d'une eventuelle */
/* erreur OpenGL */
static void checkError(int line) {
GLenum err = glGetError();
if (err) {
printf("GL Error %s (0x%x) at line %d\n",
gluErrorString(err), (int) err, line); }
}
/* Fonction de dessin de la sphere en orbite */
static void drawOrbite(void) {
glPushMatrix();
glRotatef(angle,0.0,0.0,1.0);
glTranslatef(r,0.0,0.0);
glutSolidSphere(1.0,36,36);
glPopMatrix();
}
/* Fonction executee lors d'un rafraichissement */
/* de la fenetre de dessin */
static void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
drawOrbite();
glPopMatrix();
glFlush();
checkError(__LINE__);
glutSwapBuffers();
}
/* Fonction executee lorsqu'aucun evenement */
/* n'est en attente de gestion */
static void idle(void) {
angle += c/pow((double) r,1.5);
glutPostRedisplay();
}
/* Fonction executee lors d'un changement */
/* de la taille de la fenetre OpenGL */
/* Configuration d'une camera de visualisation */
/* en projection en perspective */
void reshape(int tx,int ty) {
glViewport(0,0,tx,ty);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(28,(double) tx/ty,45.0,55.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0F,0.0F,-50.0F);
}
/* Fonction executee lors de la frappe */
/* d'une touche alphanumerique du clavier */
void key(unsigned char key,int x,int y) {
switch ( key ) {
case ' ' : { static int anim = 0;
anim = !anim;
glutIdleFunc(anim ? idle : NULL); }
break;
case 43 : r += 0.1F;
if ( r > 10.0F )
r = 10.0F;
glutPostRedisplay();
break;
case 45 : r -= 0.1F;
if ( r < 1.5F )
r = 1.5F;
glutPostRedisplay();
break;
case 0x1B : exit(0);
break; }
}
/* Fonction d'initialisation de certains */
/* parametres de l'environnement OpenGL */
static void init(void) {
glClearColor(0.0F,0.0F,0.0F,0.0F);
glEnable(GL_DEPTH_TEST);
}
/* Fonction principale */
int main(int argc,char *argv[]) {
glutInit(&argc,argv);
glutInitWindowPosition(10,10);
glutInitWindowSize(320,320);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("Sphere en orbite");
init();
glutReshapeFunc(reshape);
glutKeyboardFunc(key);
glutIdleFunc(idle);
glutDisplayFunc(display);
glutMainLoop();
return(0);
}