
adess00
|
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
|