Fichier image de la terre au format png: Terre-02048.png
 
 
 avec
glutSolidSphere
 avec
glutSolidSphere
 sans
texturage
 sans
texturage
 en
affichant les facettes avant en fil de fer et les facettes arrières en solide
 en
affichant les facettes avant en fil de fer et les facettes arrières en solide
Fichier librairie statique: Libpng.lib
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Novembre 2007                                */
/* Une sphere texturee avec une image           */
/* de la terre                                  */
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "ChargePngFile.h"
#include "ModuleSpheres.h"
/* Variables globales                           */
static int disc = 72;
static int texturage = 1;
static int sphere = 0;
static int mode = 1;
static float angle = 0.0F;
/* Variables globales de gestion                */
/* de l'interactivite clavier et souris         */
static int clic = 0;
static int mx;
static int my;
static float rx = 0.0F;
static float ry = 0.0F;
void init(void) {
  const GLfloat mat_shininess[] = { 100.0 };
  const GLfloat blanc[] = { 1.0,1.0,1.0,1.0 };
  int resx;
  int resy;
  GLubyte *image;
  glLightfv(GL_LIGHT0,GL_DIFFUSE,blanc);
  glMaterialfv(GL_FRONT,GL_DIFFUSE,blanc);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glEnable(GL_DEPTH_TEST);
  image = chargeImagePng("Terre-02048.png",&resx,&resy);
  if ( image ) { 
    glPixelStorei(GL_UNPACK_ALIGNMENT,1); 
    glTexImage2D(GL_TEXTURE_2D,0,3,
                 resx,resy,0,
                 GL_RGB,
                 GL_UNSIGNED_BYTE,
                 image); 
    glTexParameterf(GL_TEXTURE_2D,
                    GL_TEXTURE_WRAP_S,
                    GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D,
                    GL_TEXTURE_WRAP_T,
                    GL_REPEAT ); 
    glTexParameterf(GL_TEXTURE_2D,
                    GL_TEXTURE_MAG_FILTER,
                    GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D,
                    GL_TEXTURE_MIN_FILTER,
                    GL_NEAREST); 
    free(image); }
}
/* Scene dessinee                               */
void scene(void) {
  glPushMatrix();
  const GLfloat light0_position[] = { 1.0,0.0,0.0,0.0 };
  glLightfv(GL_LIGHT0,GL_POSITION,light0_position);
  glRotatef(-23.0F,0.0F,0.0F,1.0F);
  glRotatef(angle,0.0F,1.0F,0.0F);
  switch ( sphere ) {
    case 0 : glutSolidSphere(4.0,disc,disc);
             break;
    case 1 : mySolidSphere(4.0,disc,disc);
             break; }
  glPopMatrix();
}
/* Fonction executee lors d'un rafraichissement */
/* de la fenetre de dessin                      */
void display(void) {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glPushMatrix();
  glPolygonMode(GL_FRONT,(mode) ? GL_FILL : GL_LINE);
  if ( texturage )
    glEnable(GL_TEXTURE_2D);
    else
    glDisable(GL_TEXTURE_2D);
  glRotatef(rx,1.0F,0.0F,0.0F);
  glRotatef(ry,0.0F,1.0F,0.0F);
  scene();
  glPopMatrix();
  glFlush();
  glutSwapBuffers();
  int error = glGetError();
  if ( error != GL_NO_ERROR )
    printf("Attention, erreur OpenGL %d\n",error);
}
/* Fonction executee lors d'un clic de souris   */
/* dans la fenetre                              */
void mouse(int bouton,int etat,int x,int y) {
  if ( bouton == GLUT_LEFT_BUTTON ) {
    if ( etat == GLUT_DOWN ) {
      clic = 1;
      mx = x;
      my = y; }
    if ( etat == GLUT_UP ) {
      clic = 0; } }
}
/* Fonction executee lors d'un deplacement      */
/* de la souris sur la fenetre                  */
/* avec un bouton appuye                        */
void motion(int x,int y) {
  if ( clic ) {
    ry += (x-mx);
    rx += (y-my);
    mx = x;
    my = y;
    glutPostRedisplay(); }
}
/* Fonction executee lors d'un changement       */
/* de la taille de la fenetre OpenGL            */
void reshape(int x,int y) {
  glViewport(0,0,x,y); 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-5.0,5.0,(double) -5.0*y/x,(double) 5.0*y/x,-5.0,5.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
void idle(void) {
  angle += 0.5F;
  glutPostRedisplay();
}
/* Fonction executee lors de la frappe          */
/* d'une touche alphanumerique du clavier       */
void key(unsigned char key,int x,int y) {
  switch ( key ) {
    case 43   : disc++;
                glutPostRedisplay();
                break;
    case 45   : disc--;
                if ( disc < 1 )
                  disc = 1;
                glutPostRedisplay();
                break;
    case 'f'  : mode = !mode;
                glutPostRedisplay();
                break;
    case 0x20 : sphere = !sphere;
                glutPostRedisplay();
                break;
    case 0x0D : texturage = !texturage;
                glutPostRedisplay();
                break;
    case 'a'  : { static int anim = 1;
                  anim = !anim;
                  glutIdleFunc((anim) ? idle : NULL); }
                break;
    case 0x1B : exit(0);
                break; }
}
/* Fonction principale                          */
int main(int argc,char **argv) {
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
  glutInitWindowSize(260,260); 
  glutInitWindowPosition(50,50); 
  glutCreateWindow("La terre"); 
  init();
  glutReshapeFunc(reshape);
  glutKeyboardFunc(key);
  glutMotionFunc(motion);
  glutMouseFunc(mouse);
  glutIdleFunc(idle);
  glutDisplayFunc(display);
  glutMainLoop();
  return(0);
}
Fichier source: ModuleSpheres.cpp
/* Auteur: Nicolas JANEY                  */
/* nicolas.janey@univ-fcomte.fr           */
/* Novembre 2007                          */
/* Module de dessin des spheres           */
#include <stdio.h>
#include <math.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "ModuleSpheres.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846264338327950288
#endif
void mySolidSphere(float rayon,int nlat,int nlon) {
  for ( int i = 0 ; i < nlat ; i++ ) {
    float a1 = -M_PI/2.0F + i*M_PI/nlat ;
    float a2 = a1 + M_PI/nlat ;
    float cs1 = cos(a1);
    float cs2 = cos(a2);
    float sn1 = sin(a1);
    float sn2 = sin(a2);
    float t1 = 1.0F-(float) i/nlat;
    float t2 = 1.0F-(float) (i+1)/nlat;
    glBegin(GL_QUAD_STRIP);
    for ( int j = 0 ; j <= nlon ; j++ ) {
      float a = j*2*M_PI/nlon;
      float x1 = cs1*cos(a);
      float z1 = cs1*sin(a);
      float x2 = cs2*cos(a);
      float z2 = cs2*sin(a);
      float s = 1.0F-(float) j/nlon;
      glTexCoord2f(s,t1);
      glNormal3f(x1,sn1,z1);
      glVertex3f(rayon*x1,rayon*sn1,rayon*z1);
      glTexCoord2f(s,t2);
      glNormal3f(x2,sn2,z2);
      glVertex3f(rayon*x2,rayon*sn2,rayon*z2); }
    glEnd(); }
}
Fichier source: ModuleSpheres.h
/* Auteur: Nicolas JANEY                  */
/* nicolas.janey@univ-fcomte.fr           */
/* Novembre 2007                          */
/* Module de dessin des spheres           */
#ifndef MODULESPHERE
#define MODULESPHERE
void mySolidSphere(float rayon,int nlat,int nlon);
#endif
Fichier source: ChargePngFile.h
Fichier librairie statique: LibChargePngFile.lib