L'exécutable
Le source: Bounce.cpp
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define COS(X) cos((X)*3.14159/180.0)
#define SIN(X) sin((X)*3.14159/180.0)
GLuint Ball;
GLenum Mode;
GLfloat Zrot = 0.0F,Zstep = 6.0F;
GLfloat Xpos = 0.0F,Ypos = 1.0F;
GLfloat Xvel = 0.2F,Yvel = 0.0F;
GLfloat Xmin=-4.0F,Xmax=4.0F;
GLfloat Ymin=-3.8F,Ymax=4.0F;
GLfloat G = -0.1F;
GLuint make_ball(void) {
GLuint list;
GLfloat a,b;
GLfloat da = 18.0,db = 18.0;
GLfloat radius = 1.0;
GLuint color;
GLfloat x,y,z;
list = glGenLists(1);
glNewList(list,GL_COMPILE);
color = 0;
for(a=-90.0;a+da<=90.0;a+=da) {
glBegin(GL_QUAD_STRIP);
for(b=0.0;b<=360.0;b+=db) {
if(color) {
GLfloat red[] = {1.0F,0.0F,0.0F,1.0F};
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,red) ;}
else {
GLfloat white[] = {1.0F,1.0F,1.0F,1.0F};
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,white); }
x =(float)(COS(b) * COS(a));
y =(float)(SIN(b) * COS(a));
z =(float) SIN(a);
glVertex3f(x,y,z);
glNormal3f(x,y,z);
x =(float)(radius * COS(b) * COS(a+da));
y =(float)(radius * SIN(b) * COS(a+da));
z =(float)(radius * SIN(a+da));
glVertex3f(x,y,z);
glNormal3f(x,y,z);
color = 1-color; }
glEnd(); }
glEndList();
return list;
}
void CALLBACK reshape(int width,int height){
glViewport(0,0,(GLint)width,(GLint)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-6.0,6.0,-height*6.0/width,height*6.0/width,-6.0,6.0);
glMatrixMode(GL_MODELVIEW);
}
void CALLBACK draw(void){
GLint i,j;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
GLfloat cyan[] = {0.0F,1.0F,1.0F,1.0F};
glMaterialfv(GL_FRONT,GL_DIFFUSE,cyan) ;
glBegin(GL_LINES);
for(i=-5;i<=5;i++) {
glVertex2i(i,-5);
glVertex2i(i,5);}
for(i=-5;i<=5;i++) {
glVertex2i(-5,i);
glVertex2i(5,i);}
for(i=-5;i<=5;i++) {
glVertex2i(i,-5);
glVertex2f(i*1.15,-5.9);}
glVertex2f(-5.3,-5.35);
glVertex2f(5.3,-5.35);
glVertex2f(-5.75,-5.9);
glVertex2f(5.75,-5.9);
glEnd();
glPushMatrix();
glTranslatef(Xpos,Ypos,0.0);
glScalef(2.0,2.0,2.0);
glRotatef(8.0,0.0,0.0,1.0);
glRotatef(90.0,1.0,0.0,0.0);
glRotatef(Zrot,0.0,0.0,1.0);
glCallList(Ball);
glPopMatrix();
glFlush();
auxSwapBuffers();
}
static void CALLBACK idle(void){
static float vel0 = -100.0;
Zrot += Zstep;
Xpos += Xvel;
if(Xpos>=Xmax) {
Xpos = Xmax;
Xvel = -Xvel;
Zstep = -Zstep; }
if(Xpos<=Xmin) {
Xpos = Xmin;
Xvel = -Xvel;
Zstep = -Zstep; }
Ypos += Yvel;
Yvel += G;
if(Ypos<Ymin) {
Ypos = Ymin;
if(vel0==-100.0)
vel0 = fabs(Yvel);
Yvel = vel0; }
draw();
}
void init() {
Ball = make_ball();
glEnable(GL_LIGHTING) ;
glEnable(GL_LIGHT0) ;
glEnable(GL_DEPTH_TEST) ;
glEnable(GL_NORMALIZE) ;
glDepthFunc(GL_DEPTH) ;
glShadeModel(GL_FLAT);
}
void main(void) {
auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA|AUX_DEPTH);
auxInitPosition(0,0,250,250);
auxInitWindow("Une balle rebondissante") ;
init();
auxIdleFunc(idle);
auxReshapeFunc(reshape);
auxMainLoop(draw);
}
RETOUR