adess00
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008
1
17 avril 2006 à 18:05
ok je poste ma fonction
const int NB_CUBE=30;
//--------------VARIABLES
float rz=0;
float x=0;
extern bool keys[256];
float camerax=0,cameray=4,cameraz=-80;
Objet cube[NB_CUBE];
Objet sol;
//Initalisation des objets
void InitObjet()
{
int i,j=0;
for (i=0;i!=NB_CUBE;i++)
{
cube[i].centreg.x=0;
cube[i].centreg.y=0;
cube[i].centreg.z=0;
cube[i].position.x=(3*i)%36;
if ((3*i)%2==0) {j++;}
cube[i].position.y=10;
cube[i].position.z=3*j;
cube[i].vitesse.x=0;
cube[i].vitesse.y=0;
cube[i].vitesse.z=0;
cube[i].masse=(i+1);
cube[i].rayon=1;
cube[i].transforce=1;
}
//sol
cube[0].rayon=20;
cube[0].position.x=10;
cube[0].position.y=-30;
cube[0].position.z=20;
cube[0].vitesse.x=0;
cube[0].vitesse.y=0;
cube[0].vitesse.z=0;
cube[0].transforce=0;
cube[0].masse=0;
cube[1].masse=2;
}
int DrawGLScene() // Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
if (keys[VK_NUMPAD8]==1) {cameraz+=1;}
if (keys[VK_NUMPAD5]==1) {cameraz-=1;}
if (keys[VK_NUMPAD4]==1) {camerax+=1;}
if (keys[VK_NUMPAD6]==1) {camerax-=1;}
if (keys[VK_UP]==1) {cube[1].vitesse.y+=0.01;}
if (keys[VK_DOWN]==1) {cube[1].vitesse.y-=0.01;}
if (keys[VK_LEFT]==1) {cube[1].vitesse.x+=0.01;}
if (keys[VK_RIGHT]==1) {cube[1].vitesse.x-=0.01;}
if (keys[VK_SPACE]==1) {InitObjet();}
//---------------------------------------------evenements physiques
int i;
//motion
for (i=0;i!=NB_CUBE;i++)
{
cube[i].position.x+=cube[i].vitesse.x;
cube[i].position.y+=cube[i].vitesse.y;
cube[i].position.z+=cube[i].vitesse.z;
}
//gravity
float f;
for (i=0;i!=NB_CUBE;i++)
{
f=cube[i].masse*-0.001;
cube[i].vitesse.y+=f;
}
//collision
int i1=0,i2=0; //indices pour les objets
float px1,py1,pz1,px2,py2,pz2,r1,r2,tmp; //pour simplifier les var de la structure
float dcx,dcy,dcz; //distance de collision en x,y,z
int nb_objet=NB_CUBE; //nombre d objets
int nb_collision=(nb_objet-1)/2*nb_objet; //nombre de collisions possibles
for (i=0;i<nb_collision;i++)
{
i2++;
i2%=nb_objet;
if (i2==0) {i1+=1;i2=i1+1;}
px1=cube[i1].position.x;
py1=cube[i1].position.y;
pz1=cube[i1].position.z;
px2=cube[i2].position.x;
py2=cube[i2].position.y;
pz2=cube[i2].position.z;
r1=cube[i1].rayon;
r2=cube[i2].rayon;
if (!(cube[i1].vitesse.y==0 && cube[i2].vitesse.y==0)) //si les 2 objets ne sont pas immobiles
{
//on retrouve la distance separant les 2 points sur chaque axe
if (py2-py1<0) {dcy=py1-py2;} else {dcy=py2-py1;}
if (px2-px1<0) {dcx=px1-px2;} else {dcx=px2-px1;}
if (pz2-pz1<0) {dcz=pz1-pz2;} else {dcz=pz2-pz1;}
if (dcx < r1+r2 && dcy < r1+r2 && dcz < r1+r2)
{
//on transfere les forces en X avec un coeff d amplitude
tmp=cube[i1].vitesse.x;
cube[i1].vitesse.x=cube[i2].vitesse.x*cube[i1].transforce;
cube[i2].vitesse.x=tmp*cube[i2].transforce;
//on transfere les forces en Y avec un coeff d amplitude
tmp=cube[i1].vitesse.y;
cube[i1].vitesse.y=cube[i2].vitesse.y*cube[i1].transforce;
cube[i2].vitesse.y=tmp*cube[i2].transforce;
//on transfere les forces en Z avec un coeff d amplitude
tmp=cube[i1].vitesse.z;
cube[i1].vitesse.z=cube[i2].vitesse.z*cube[i1].transforce;
cube[i2].vitesse.z=tmp*cube[i2].transforce;
}
}
}
//---------------------------------------------------------------------
//------------camera
gluLookAt(camerax,cameray,cameraz,0,0,0,0,1,0);
//---cube
glDisable(GL_BLEND);
//int i;
for (i=1;i!=NB_CUBE;i++)
{
glPushMatrix();
glTranslatef(cube[i].position.x,cube[i].position.y,cube[i].position.z);
//glRotatef(rz,0,1,0);
glBegin(GL_QUADS);
glColor3f(0.1,0.6,0.6);
glVertex3f(-1,-1,-1);glVertex3f(1,-1,-1);glVertex3f(1,1,-1);glVertex3f(-1,1,-1);
glColor3f(0.1,0.6,0.6);
glVertex3f(-1,-1,1);glVertex3f(1,-1,1);glVertex3f(1,1,1);glVertex3f(-1,1,1);
glColor3f(0.4,0.4,0.6);
glVertex3f(-1,-1,-1);glVertex3f(-1,-1,1);glVertex3f(-1,1,1);glVertex3f(-1,1,-1);
glColor3f(0.4,0.4,0.6);
glVertex3f(1,-1,-1);glVertex3f(1,-1,1);glVertex3f(1,1,1);glVertex3f(1,1,-1);
glColor3f(0.7,0.4,0.6);
glVertex3f(-1,-1,-1);glVertex3f(-1,-1,1);glVertex3f(1,-1,1);glVertex3f(1,-1,-1);
glColor3f(0.7,0.4,0.6);
glVertex3f(-1,1,-1);glVertex3f(-1,1,1);glVertex3f(1,1,1);glVertex3f(1,1,-1);
glEnd();
glPopMatrix();
}
//--sol
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);
glColor4f(1,1,1,0.6);
glPushMatrix();
glTranslatef(cube[0].position.x,cube[0].position.y,cube[0].position.z);
//glRotatef(rz,0,1,0);
glBegin(GL_QUADS);
glColor3f(0.1,0.6,0.6);
glVertex3f(-20,-20,-20);glVertex3f(20,-20,-20);glVertex3f(20,20,-20);glVertex3f(-20,20,-20);
glColor3f(0.20,0.6,0.6);
glVertex3f(-20,-20,20);glVertex3f(20,-20,20);glVertex3f(20,20,20);glVertex3f(-20,20,20);
glColor3f(0.4,0.4,0.6);
glVertex3f(-20,-20,-20);glVertex3f(-20,-20,20);glVertex3f(-20,20,20);glVertex3f(-20,20,-20);
glColor3f(0.4,0.4,0.6);
glVertex3f(20,-20,-20);glVertex3f(20,-20,20);glVertex3f(20,20,20);glVertex3f(20,20,-20);
glColor3f(0.7,0.4,0.6);
glVertex3f(-20,-20,-20);glVertex3f(-20,-20,20);glVertex3f(20,-20,20);glVertex3f(20,-20,-20);
glColor3f(0.7,0.4,0.6);
glVertex3f(-20,20,-20);glVertex3f(-20,20,20);glVertex3f(20,20,20);glVertex3f(20,20,-20);
glEnd();
glPopMatrix();
rz+=0.5;
return TRUE; // Keep Going
}
voila