begin process at 2012 02 10 06:11:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > MODÉLISATION D'UNE SURFACE AVEC UN MAILLAGE MASE RESSORT OPENGL (GLUT)

MODÉLISATION D'UNE SURFACE AVEC UN MAILLAGE MASE RESSORT OPENGL (GLUT)


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :OpenGL Classé sous :masse, Ressort, dynamique, newton, glut Niveau :Initié Date de création :23/08/2008 Date de mise à jour :29/08/2008 11:09:05 Vu / téléchargé :4 827 / 275

Auteur : SebLinck

Ecrire un message privé
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Cette source utilise la seconde loie de newton,
Le maillage est utiliser pour simuler de la pluie qui tombe...

Source

  • ///----------------------------------------------------------------------------//
  • //
  • // Open GL
  • // simulation des matériaux : modélisation par les particules
  • // avec une liaison dynamique du type masse ressort
  • //
  • // LINCK Sébastien
  • //----------------------------------------------------------------------------//
  • //----------------------------------------------------------------------------//
  • #include "stdafx.h"
  • #include <stdio.h>
  • #include <math.h>
  • #include <stdlib.h>
  • #include "glut.h"
  • #define const_LX 20.0
  • #define const_LY 16.0
  • #define const_NX 81
  • #define const_NY 41
  • #define const_raideur 20.0
  • #define const_repos 0.0
  • #define const_masse 0.75
  • #define const_dissipation 0.10
  • #define const_dt 0.005
  • #define const_gravite 9.81
  • #define const_init_z 9.8
  • #define const_freq 2.0
  • #ifndef M_PI
  • #define M_PI 3.1415926535897932384626433832795
  • #endif
  • // tableau contenant les coordonnée en Z des noeuds
  • double TabZNoeuds[const_NX][const_NY];
  • // tableau contenant les vitesses des noeuds (composante sur Z)
  • double TabZVitesses[const_NX][const_NY];
  • double temps;
  • double const_ampl = 1.0;
  • int xpluie = 10;
  • int ypluie = 10;
  • double zpluie = const_init_z;
  • double const_pluie_z = 0.00;
  • int LightPos[4] = {0,0,15,0};
  • int MatSpec [4] = {1,1,1,1};
  • int fenw,fenh,afficher_lignes=0,afficher_interieur=1;
  • GLfloat rot_vue_H=0.0, rot_vue_V=0.0;
  • GLint startx,starty,moving=0;
  • double x,y,pasx = (double)const_LX/(double)const_NX
  • ,pasy = (double)const_LY/(double)const_NY,c;
  • unsigned rand_pluie(unsigned N)
  • {
  • return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
  • }
  • /***************************************************************/
  • void action()
  • {
  • int ix, iy;
  • double x,y,z,dx2,dy2,dz;
  • double F,A,V; // Force acceleration vitesse
  • static double nouvTabZNoeud[const_NX][const_NY];
  • temps += const_dt;
  • dx2 =(double)const_LX/(double)const_NX;
  • dx2*=dx2;
  • dy2=(double)const_LY/(double)const_NY;
  • dy2*=dy2;
  • //****************************PARTIE EXCITATION***********************/
  • // Excitaion de quelques points
  • /*
  • for (iy=5; iy<10; iy++)
  • {
  • TabZNoeuds[0][iy] = const_ampl * sin(const_freq *temps) ; // z = (ft)
  • TabZVitesses[0][iy] = const_ampl * const_freq * cos(const_freq * temps) ; // v = df(t) / dt
  • nouvTabZNoeud[0][iy]=TabZNoeuds[0][iy];
  • }
  • */
  • // La pluie qui tombe
  • if( zpluie <= 0)
  • {
  • TabZNoeuds[xpluie ][ypluie] = const_ampl * sin(const_freq *temps) ; // z = (ft)
  • TabZVitesses[xpluie ][ypluie] = const_ampl * const_freq * cos(const_freq * temps) ; // v = df(t) / dt
  • nouvTabZNoeud[xpluie ][ypluie] = TabZNoeuds[xpluie ][ypluie];
  • xpluie = rand_pluie( const_NX ); if( xpluie == 0) xpluie= 1;if( xpluie >= 79) xpluie= 78;
  • ypluie = rand_pluie( const_NY ); if( ypluie == 0) ypluie= 1;if( ypluie >= 39) ypluie= 38;
  • zpluie = const_init_z;
  • }
  • else
  • {
  • zpluie -= const_pluie_z;
  • }
  • /**************************** PARTIE DYNAMIQUE ****************/
  • // Equation de la 2ème loie de Newton
  • // La somme des forces = La masse * L'acceleration sur chaque noeud
  • for (ix = 1; ix < const_NX -1; ix++)
  • {
  • for (iy = 1; iy < const_NY -1; iy++)
  • {
  • // forces des 4 ressorts agissant sue le noeud selon l'axe z
  • //**********************************************/
  • // liaison 1er voisin
  • dz = TabZNoeuds[ix + 1][iy] - TabZNoeuds[ix][iy] ;
  • F = (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
  • // liaison 2eme voisin
  • dz = TabZNoeuds[ix - 1][iy] - TabZNoeuds[ix][iy] ;
  • F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
  • // liaison 3eme voisin
  • dz = TabZNoeuds[ix][iy + 1] - TabZNoeuds[ix][iy];
  • F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
  • // liaison 4eme voisin
  • dz = TabZNoeuds[ix][iy - 1] - TabZNoeuds[ix][iy];
  • F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
  • // Prise en compte de la force de frottement ou dissipation du noeud
  • // Prise en compte de la dissipation
  • F-= const_dissipation * TabZVitesses[ix][iy];
  • // calcul de l'accelerartion
  • A = F / const_masse;
  • // En déduire la vitese du noeud
  • TabZVitesses[ix][iy] = TabZVitesses[ix][iy] + (const_dt * A);
  • // En déduire la position courante du noeud
  • nouvTabZNoeud[ix][iy] = TabZNoeuds[ix][iy] + (const_dt * TabZVitesses[ix][iy]);
  • }
  • }
  • memcpy(TabZNoeuds,nouvTabZNoeud,const_NX*const_NY*sizeof(double));
  • }
  • void initTableaux()
  • { int ix,iy;
  • temps = 0.0;
  • for (ix=0; ix<const_NX; ix++)
  • { for (iy=0; iy<const_NY; iy++)
  • { TabZNoeuds[ix][iy]=0.0;
  • TabZVitesses[ix][iy]=0.0;
  • }
  • }
  • }
  • void dessinerGrille()
  • { int ix,iy;
  • if (afficher_interieur)
  • { for (ix=0,x=-const_NX/2.0*pasx; ix<const_NX-1; ix++)
  • { for (iy=0,y=-const_NX/2.0*pasy; iy<const_NY-1; iy++)
  • { glBegin(GL_QUADS);
  • c = (TabZVitesses[ix][iy]);
  • if (c>0.0)
  • { if (c>1) glColor3d(0.1,0.3,1); else glColor3d(0.46-c/2.8,0.64-c/2.95,0.89+c/9.1);
  • } else
  • { if (c<-1) glColor3d(0.4,0.9,1); else glColor3d(0.46-c/16.66,0.64+c/3.85,0.89+c/9.09);
  • }
  • glVertex3d(x,y,TabZNoeuds[ix][iy]);
  • c = (TabZVitesses[ix+1][iy]);
  • if (c>0.0)
  • { if (c>1) glColor3d(0.1,0.3,1); else glColor3d(0.46-c/2.8,0.64-c/2.95,0.89+c/9.1);
  • } else
  • { if (c<-1) glColor3d(0.4,0.9,1); else glColor3d(0.46-c/16.66,0.64+c/3.85,0.89+c/9.09);
  • }
  • glVertex3d(x+pasx,y,TabZNoeuds[ix+1][iy]);
  • c = (TabZVitesses[ix+1][iy+1]);
  • if (c>0.0)
  • { if (c>1) glColor3d(0.1,0.3,1); else glColor3d(0.46-c/2.8,0.64-c/2.95,0.89+c/9.1);
  • } else
  • { if (c<-1) glColor3d(0.4,0.9,1); else glColor3d(0.46-c/16.66,0.64+c/3.85,0.89+c/9.09);
  • }
  • glVertex3d(x+pasx,y+pasy,TabZNoeuds[ix+1][iy+1]);
  • c = (TabZVitesses[ix][iy+1]);
  • if (c>0.0)
  • { if (c>1) glColor3d(0.1,0.3,1); else glColor3d(0.46-c/2.8,0.64-c/2.95,0.89+c/9.1);
  • } else
  • { if (c<-1) glColor3d(0.4,0.9,1); else glColor3d(0.46-c/16.66,0.64+c/3.85,0.89+c/9.09);
  • }
  • glVertex3d(x,y+pasy,TabZNoeuds[ix][iy+1]);
  • glEnd();
  • y+=pasy;
  • }
  • x+=pasx;
  • }
  • }
  • if (afficher_lignes)
  • { glColor3d(1.0,1.0,1.0);
  • for (ix=0,x=-const_NX/2.0*pasx; ix<const_NX-1; ix++)
  • { for (iy=0,y=-const_NX/2.0*pasy; iy<const_NY-1; iy++)
  • { glBegin(GL_LINES);
  • glVertex3d(x,y,TabZNoeuds[ix][iy]);
  • glVertex3d(x+pasx,y,TabZNoeuds[ix+1][iy]);
  • glVertex3d(x,y,TabZNoeuds[ix][iy]);
  • glVertex3d(x,y+pasy,TabZNoeuds[ix][iy+1]);
  • glEnd();
  • y+=pasy;
  • }
  • glBegin(GL_LINES);
  • glVertex3d(x,y,TabZNoeuds[ix][iy]);
  • glVertex3d(x+pasx,y,TabZNoeuds[ix+1][iy]);
  • glEnd();
  • x+=pasx;
  • }
  • for (iy=0,y=-const_NX/2.0*pasy; iy<const_NY-1; iy++)
  • { glBegin(GL_LINES);
  • glVertex3d(x,y,TabZNoeuds[ix][iy]);
  • glVertex3d(x,y+pasy,TabZNoeuds[ix][iy+1]);
  • glEnd();
  • y+=pasy;
  • }
  • }
  • }
  • static void drawString(char *string, GLfloat x, GLfloat y)
  • { glRasterPos2f(x, y);
  • while (*string)
  • { glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *string);
  • string++;
  • }
  • }
  • static void draw( void )
  • { char texte[80];
  • // matériaux
  • glMaterialiv(GL_FRONT_AND_BACK,GL_SPECULAR,MatSpec);
  • glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,100);
  • glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  • glMatrixMode(GL_PROJECTION);
  • glPushMatrix();
  • glLoadIdentity();
  • glOrtho(0,fenw,0,fenh, -10, 100);
  • glMatrixMode(GL_MODELVIEW);
  • glPushMatrix();
  • glLoadIdentity();
  • /*glColor4d(1.0,1.0,1.0,2.0);
  • sprintf(texte,"Amplitude %4.1f",const_ampl);
  • drawString(texte,20,460);*/
  • glMatrixMode(GL_PROJECTION);
  • glPopMatrix();
  • glMatrixMode(GL_MODELVIEW);
  • glPopMatrix();
  • glPushMatrix();
  • /* rotation du point de vue autour des axes H et V */
  • glRotated(rot_vue_H,1.0,0.0,0.0);
  • glRotated(rot_vue_V,0.0,0.0,1.0);
  • dessinerGrille();
  • /*
  • glBegin(GL_POINTS);
  • glColor3f(0.5,0.9,0.7);
  • glVertex3d((xpluie - 40) * pasx,(ypluie -20) * pasy,zpluie);
  • glEnd();*/
  • glPushMatrix();
  • glColor3f(1.0,1.0,1.0);
  • glTranslated((xpluie - 40) * pasx,(ypluie - 40) * pasy,zpluie);
  • glutSolidSphere(0.1,20,20);
  • glPopMatrix();
  • glutSwapBuffers();
  • }
  • static void idle( void )
  • { double deltat=0.0;
  • while (deltat<0.1)
  • { action();
  • deltat+=const_dt;
  • }
  • draw();
  • }
  • /* new window size or exposure */
  • static void reshape( int width, int height )
  • { GLfloat h = (GLfloat) height / (GLfloat) width;
  • fenw = width;
  • fenh = height;
  • glViewport(0, 0, (GLint)width, (GLint)height);
  • glMatrixMode(GL_PROJECTION);
  • glLoadIdentity();
  • glFrustum( -1.0, 1.0, -h, h, 2.0, 100.0 );//25
  • gluLookAt(0.0,-30, 15 ,0.0,0.0,-8.0,0.0,0.0,1.0);
  • glLightiv(GL_LIGHT0,GL_POSITION,LightPos);
  • glMatrixMode(GL_MODELVIEW);
  • glLoadIdentity();
  • //glTranslatef( 0.0, 0.0, -15.0 );
  • //glRotatef(-90.0,1.0,0.0,0.0);
  • glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  • }
  • static void init()
  • { glEnable( GL_DEPTH_TEST );
  • glEnable( GL_NORMALIZE );
  • glEnable( GL_SMOOTH);
  • }
  • /*********************************************************/
  • /* fonction associée aux événements de menu. */
  • /* - item : code associé au menu selecitonné */
  • static void menuFunc(int item)
  • { if (item == 99) exit(0);
  • if (item==11) afficher_lignes = !afficher_lignes;
  • if (item==12) afficher_interieur = !afficher_interieur;
  • }
  • /*********************************************************/
  • /* fonction associée au clique de la souris */
  • /* paramètres : */
  • /* - button : nom du bouton pressé GLUT_LEFT_BUTTON, */
  • /* GLUT_MIDDLE_BUTTON ou GLUT_RIGHT_BUTTON */
  • /* - state : état du bouton button GLUT_DOWN ou GLUT_UP */
  • /* - x,y : coordonnée du curseur dans la fenêtre */
  • static void mouseFunc(int button, int state, int x, int y)
  • { if (button==GLUT_LEFT_BUTTON)
  • { if (state == GLUT_DOWN)
  • { startx = x;
  • starty = y;
  • moving =1;
  • }
  • if (state == GLUT_UP)
  • { moving = 0;
  • }
  • }
  • }
  • /*********************************************************/
  • /* fonction associée au déplacement de la souris bouton */
  • /* enfoncé. */
  • /* paramètres : */
  • /* - x,y : coordonnée du curseur dans la fenêtre */
  • static void motionFunc(int x, int y)
  • { if (moving)
  • { rot_vue_V += 0.5*(x-startx);
  • rot_vue_H += 0.5*(y-starty);
  • startx = x;
  • starty = y;
  • /* demande de redessin de la fenêtre */
  • glutPostRedisplay();
  • }
  • }
  • /*********************************************************/
  • /* fonction associée aux interruptions clavier */
  • /* paramètres : */
  • /* - c : caractère saisi */
  • /* - x,y : coordonnée du curseur dans la fenêtre */
  • static void kbdFunc(unsigned char c, int x, int y)
  • { /* sortie du programme si utilisation des touches ESC, */
  • /* 'q' ou 'Q'*/
  • switch (c)
  • { case 27 : case 'q' : case 'Q': exit(0);
  • case 'R' : case 'r' : glutIdleFunc( idle );
  • break;
  • case 'S' : case 's' : glutIdleFunc( NULL );
  • break;
  • case 'a' : case 'A' : const_ampl--;
  • break;
  • case 'p' : case 'P' : const_pluie_z += 0.01;
  • break;
  • case 'o' : case 'O' : const_pluie_z -= 0.01;
  • break;
  • }
  • }
  • int main(unsigned int argc, char **argv)
  • { GLint sousmenu;
  • glutInit((int *)&argc, argv);
  • glutInitWindowSize(640, 480);
  • glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
  • if (glutCreateWindow("3DPHY") == GL_FALSE)
  • { exit(0);
  • }
  • initTableaux();
  • init();
  • /* création d'un popup menu */
  • /* sous menu */
  • sousmenu = glutCreateMenu(menuFunc);
  • glutAddMenuEntry("ligne", 11);
  • glutAddMenuEntry("interieur", 12);
  • /* menu principal */
  • glutCreateMenu(menuFunc);
  • glutAddSubMenu("Affichage", sousmenu);
  • glutAddMenuEntry("Quit", 99);
  • /* association du menu au clique droit */
  • glutAttachMenu(GLUT_RIGHT_BUTTON);
  • /* association de la fonction d'événement souris */
  • glutMouseFunc(mouseFunc);
  • /* association de la fonction de DRAG */
  • glutMotionFunc(motionFunc);
  • /* association de la fonction d'événement du clavier */
  • glutKeyboardFunc(kbdFunc);
  • glutReshapeFunc( reshape );
  • glutDisplayFunc( draw );
  • glutMainLoop();
  • return 0;
  • }
///----------------------------------------------------------------------------//
//
// Open GL 
// simulation des matériaux : modélisation par les particules
// avec une liaison dynamique du type masse ressort
//
// LINCK Sébastien
//----------------------------------------------------------------------------//

//----------------------------------------------------------------------------//
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h> 
#include "glut.h"


#define const_LX				20.0
#define const_LY				16.0
#define const_NX				81
#define const_NY				41
#define const_raideur			20.0
#define const_repos				0.0
#define const_masse				0.75 
#define const_dissipation		0.10
#define const_dt				0.005
#define const_gravite			9.81

#define const_init_z			9.8

#define const_freq              2.0
#ifndef M_PI
#define M_PI					3.1415926535897932384626433832795
#endif

// tableau contenant les coordonnée en Z des noeuds
double TabZNoeuds[const_NX][const_NY];
// tableau contenant les vitesses des noeuds (composante sur Z)
double TabZVitesses[const_NX][const_NY];
double temps;

double const_ampl = 1.0;

 int  xpluie = 10;
 int ypluie = 10;
 double zpluie = const_init_z;
 double const_pluie_z = 0.00;

int LightPos[4] = {0,0,15,0};
int MatSpec [4] = {1,1,1,1};

int fenw,fenh,afficher_lignes=0,afficher_interieur=1;
GLfloat rot_vue_H=0.0, rot_vue_V=0.0;
GLint startx,starty,moving=0;

 double x,y,pasx = (double)const_LX/(double)const_NX
           ,pasy = (double)const_LY/(double)const_NY,c;

unsigned rand_pluie(unsigned N)
{
  return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
}

/***************************************************************/
void action()
{
	int ix, iy; 
	double x,y,z,dx2,dy2,dz;
	double F,A,V; // Force acceleration vitesse
    static double nouvTabZNoeud[const_NX][const_NY];

  temps += const_dt;
  dx2 =(double)const_LX/(double)const_NX;
  dx2*=dx2;
  dy2=(double)const_LY/(double)const_NY;
  dy2*=dy2;

//****************************PARTIE EXCITATION***********************/

  // Excitaion de quelques points
 /*  
   for (iy=5; iy<10; iy++)
	 { 
	   TabZNoeuds[0][iy] = const_ampl * sin(const_freq *temps)	;   // z = (ft)
	   TabZVitesses[0][iy] = const_ampl * const_freq * cos(const_freq * temps)	;   // v = df(t) / dt
	   nouvTabZNoeud[0][iy]=TabZNoeuds[0][iy];
	  } 
 */
  // La pluie qui tombe
  if( zpluie <= 0)
  {
		
		TabZNoeuds[xpluie ][ypluie] = const_ampl * sin(const_freq *temps)	;   // z = (ft)
		TabZVitesses[xpluie ][ypluie] = const_ampl * const_freq * cos(const_freq * temps)	;   // v = df(t) / dt
		nouvTabZNoeud[xpluie ][ypluie] = TabZNoeuds[xpluie ][ypluie];

		xpluie = rand_pluie( const_NX ); if( xpluie == 0) xpluie= 1;if( xpluie >= 79) xpluie= 78;
		ypluie = rand_pluie( const_NY ); if( ypluie == 0) ypluie= 1;if( ypluie >= 39) ypluie= 38;
		
		zpluie = const_init_z;
  }	
  else
  {
	  zpluie -= const_pluie_z;
  }
  

 /**************************** PARTIE DYNAMIQUE ****************/

// Equation de la 2ème loie de Newton
//  La somme des forces = La masse * L'acceleration sur chaque noeud

  
  for (ix = 1; ix < const_NX -1; ix++)
   { 
	   for (iy = 1; iy < const_NY -1; iy++)
    { 
	  // forces des 4 ressorts agissant sue le noeud selon l'axe z
	  //**********************************************/
		
				 // liaison 1er voisin 		
				dz = TabZNoeuds[ix + 1][iy] - TabZNoeuds[ix][iy] ;
				F = (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
				// liaison 2eme voisin
				dz = TabZNoeuds[ix - 1][iy] - TabZNoeuds[ix][iy] ;
				F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
				// liaison 3eme voisin
				dz = TabZNoeuds[ix][iy + 1] - TabZNoeuds[ix][iy];
				F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
				// liaison 4eme voisin
				dz = TabZNoeuds[ix][iy - 1] - TabZNoeuds[ix][iy];
				F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
			
		  // Prise en compte de la force de frottement ou dissipation du noeud
		  //  Prise en compte de la dissipation
		      F-= const_dissipation * TabZVitesses[ix][iy];
		
		// calcul de l'accelerartion 
		     A =   F  / const_masse;
		//	  En déduire la vitese du noeud
		      TabZVitesses[ix][iy] = TabZVitesses[ix][iy] + (const_dt * A);
		// En déduire la position courante du noeud
		      nouvTabZNoeud[ix][iy] =  TabZNoeuds[ix][iy] + (const_dt * TabZVitesses[ix][iy]);	
		}
  }
memcpy(TabZNoeuds,nouvTabZNoeud,const_NX*const_NY*sizeof(double));
}

void initTableaux()
{ int ix,iy;
  
  temps = 0.0;

  for (ix=0; ix<const_NX; ix++)
  { for (iy=0; iy<const_NY; iy++)
    { TabZNoeuds[ix][iy]=0.0;
      TabZVitesses[ix][iy]=0.0;
    }
  }
}

void dessinerGrille()
{ int ix,iy;
 

  if (afficher_interieur)
  { for (ix=0,x=-const_NX/2.0*pasx; ix<const_NX-1; ix++)
    { for (iy=0,y=-const_NX/2.0*pasy; iy<const_NY-1; iy++)
      { glBegin(GL_QUADS);
          c = (TabZVitesses[ix][iy]);
          if (c>0.0) 
          { if (c>1) glColor3d(0.1,0.3,1); else glColor3d(0.46-c/2.8,0.64-c/2.95,0.89+c/9.1);
          } else
          { if (c<-1) glColor3d(0.4,0.9,1); else glColor3d(0.46-c/16.66,0.64+c/3.85,0.89+c/9.09);
          }
          glVertex3d(x,y,TabZNoeuds[ix][iy]);

          c = (TabZVitesses[ix+1][iy]);
          if (c>0.0) 
          { if (c>1) glColor3d(0.1,0.3,1); else glColor3d(0.46-c/2.8,0.64-c/2.95,0.89+c/9.1);
          } else
          { if (c<-1) glColor3d(0.4,0.9,1); else glColor3d(0.46-c/16.66,0.64+c/3.85,0.89+c/9.09);
          }
          glVertex3d(x+pasx,y,TabZNoeuds[ix+1][iy]);

          c = (TabZVitesses[ix+1][iy+1]);
          if (c>0.0) 
          { if (c>1) glColor3d(0.1,0.3,1); else glColor3d(0.46-c/2.8,0.64-c/2.95,0.89+c/9.1);
          } else
          { if (c<-1) glColor3d(0.4,0.9,1); else glColor3d(0.46-c/16.66,0.64+c/3.85,0.89+c/9.09);
          }
          glVertex3d(x+pasx,y+pasy,TabZNoeuds[ix+1][iy+1]);

          c = (TabZVitesses[ix][iy+1]);
          if (c>0.0) 
          { if (c>1) glColor3d(0.1,0.3,1); else glColor3d(0.46-c/2.8,0.64-c/2.95,0.89+c/9.1);
          } else
          { if (c<-1) glColor3d(0.4,0.9,1); else glColor3d(0.46-c/16.66,0.64+c/3.85,0.89+c/9.09);
          }
          glVertex3d(x,y+pasy,TabZNoeuds[ix][iy+1]);
        glEnd();
        y+=pasy;
      }
      x+=pasx;
    }
  }
  if (afficher_lignes)
  { glColor3d(1.0,1.0,1.0);
    
    for (ix=0,x=-const_NX/2.0*pasx; ix<const_NX-1; ix++)
    { for (iy=0,y=-const_NX/2.0*pasy; iy<const_NY-1; iy++)
      { glBegin(GL_LINES);
        glVertex3d(x,y,TabZNoeuds[ix][iy]);
        glVertex3d(x+pasx,y,TabZNoeuds[ix+1][iy]);
        glVertex3d(x,y,TabZNoeuds[ix][iy]);
        glVertex3d(x,y+pasy,TabZNoeuds[ix][iy+1]);
        glEnd();
        y+=pasy;
      }
      glBegin(GL_LINES);
      glVertex3d(x,y,TabZNoeuds[ix][iy]);
      glVertex3d(x+pasx,y,TabZNoeuds[ix+1][iy]);
      glEnd();
      x+=pasx;
    }
    for (iy=0,y=-const_NX/2.0*pasy; iy<const_NY-1; iy++)
    { glBegin(GL_LINES);
      glVertex3d(x,y,TabZNoeuds[ix][iy]);
      glVertex3d(x,y+pasy,TabZNoeuds[ix][iy+1]);
      glEnd();
      y+=pasy;
    }
  }

  
}

static void drawString(char *string, GLfloat x, GLfloat y)
{ glRasterPos2f(x, y);
  while (*string)
  { glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *string);
    string++;
  }
}

static void draw( void )
{ char texte[80];

// matériaux
	glMaterialiv(GL_FRONT_AND_BACK,GL_SPECULAR,MatSpec);
	glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,100);

  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  
  glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glLoadIdentity();
  glOrtho(0,fenw,0,fenh, -10, 100);
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
  glLoadIdentity();
  
  /*glColor4d(1.0,1.0,1.0,2.0);  
  sprintf(texte,"Amplitude %4.1f",const_ampl);
  drawString(texte,20,460);*/
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();
  glMatrixMode(GL_MODELVIEW);
  glPopMatrix();

  glPushMatrix();

  /* rotation du point de vue autour des axes H et V */
  glRotated(rot_vue_H,1.0,0.0,0.0);
  glRotated(rot_vue_V,0.0,0.0,1.0);
	
	dessinerGrille();
  
/*
   glBegin(GL_POINTS);
		glColor3f(0.5,0.9,0.7);
		glVertex3d((xpluie - 40) * pasx,(ypluie -20) * pasy,zpluie);	
	glEnd();*/

glPushMatrix();
		glColor3f(1.0,1.0,1.0);
		glTranslated((xpluie - 40) * pasx,(ypluie - 40) * pasy,zpluie);
		glutSolidSphere(0.1,20,20);
glPopMatrix();	

	glutSwapBuffers();
	
}

static void idle( void )
{ double deltat=0.0;

  while (deltat<0.1)
  { action();
    deltat+=const_dt;
  }
  draw();
}

/* new window size or exposure */
static void reshape( int width, int height )
{ GLfloat  h = (GLfloat) height / (GLfloat) width;

  fenw = width;
  fenh = height;
  glViewport(0, 0, (GLint)width, (GLint)height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum( -1.0, 1.0, -h, h, 2.0, 100.0 );//25
  gluLookAt(0.0,-30, 15 ,0.0,0.0,-8.0,0.0,0.0,1.0);
  glLightiv(GL_LIGHT0,GL_POSITION,LightPos);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  //glTranslatef( 0.0, 0.0, -15.0 );
  //glRotatef(-90.0,1.0,0.0,0.0);
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
}

static void init()
{ glEnable( GL_DEPTH_TEST );
  glEnable( GL_NORMALIZE );
  glEnable( GL_SMOOTH);
  
}

/*********************************************************/
/* fonction associée aux événements de menu.             */
/* - item : code associé au menu selecitonné             */
static void menuFunc(int item)
{ if (item == 99) exit(0);
  if (item==11) afficher_lignes = !afficher_lignes;
  if (item==12) afficher_interieur = !afficher_interieur;
}

/*********************************************************/
/* fonction associée au clique de la souris              */
/* paramètres :                                          */
/* - button : nom du bouton pressé GLUT_LEFT_BUTTON,     */
/*   GLUT_MIDDLE_BUTTON ou GLUT_RIGHT_BUTTON             */
/* - state : état du bouton button GLUT_DOWN ou GLUT_UP  */
/* - x,y : coordonnée du curseur dans la fenêtre         */
static void mouseFunc(int button, int state, int x, int y)
{ if (button==GLUT_LEFT_BUTTON)
  { if (state == GLUT_DOWN)
    { startx = x;
      starty = y;
      moving =1;
    }
    if (state == GLUT_UP)
    { moving = 0;
    }
  }
}

/*********************************************************/
/* fonction associée au déplacement de la souris bouton  */
/* enfoncé.                                              */
/* paramètres :                                          */
/* - x,y : coordonnée du curseur dans la fenêtre         */
static void motionFunc(int x, int y)
{ if (moving)
  { rot_vue_V += 0.5*(x-startx);
    rot_vue_H += 0.5*(y-starty);
    startx = x;
    starty = y;
    /* demande de redessin de la fenêtre */
    glutPostRedisplay();
  }
}

/*********************************************************/
/* fonction associée aux interruptions clavier           */
/* paramètres :                                          */
/* - c : caractère saisi                                 */
/* - x,y : coordonnée du curseur dans la fenêtre         */
static void kbdFunc(unsigned char c, int x, int y)
{ /* sortie du programme si utilisation des touches ESC, */
  /* 'q' ou 'Q'*/
  switch (c)
  { case 27 : case 'q' : case 'Q': exit(0);
    case 'R' : case 'r' :   glutIdleFunc( idle );
                           break;
    case 'S' : case 's' :   glutIdleFunc( NULL );
                           break;
	case 'a' : case 'A'  : const_ampl--;
							break;

	case 'p' : case 'P'  : const_pluie_z += 0.01;
							break;

	case 'o' : case 'O'  : const_pluie_z -= 0.01;
							break;
  }   

}



int main(unsigned int argc, char **argv)
{ GLint sousmenu;

  glutInit((int *)&argc, argv);
  glutInitWindowSize(640, 480);
  glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );

  if (glutCreateWindow("3DPHY") == GL_FALSE) 
  { exit(0);
  }

  initTableaux();
  
  init();
  
  /* création d'un popup menu */
  /* sous menu */
  sousmenu = glutCreateMenu(menuFunc);
  glutAddMenuEntry("ligne", 11);
  glutAddMenuEntry("interieur", 12);
  /* menu principal */
  glutCreateMenu(menuFunc);
  glutAddSubMenu("Affichage", sousmenu);
  glutAddMenuEntry("Quit", 99);
  /* association du menu au clique droit */
  glutAttachMenu(GLUT_RIGHT_BUTTON);
  /* association de la fonction d'événement souris */
  glutMouseFunc(mouseFunc);
  /* association de la fonction de DRAG */
  glutMotionFunc(motionFunc);
  /* association de la fonction d'événement du clavier */
  glutKeyboardFunc(kbdFunc);

  glutReshapeFunc( reshape );
  glutDisplayFunc( draw );
  glutMainLoop();

  return 0;
}


 Conclusion






J'espère que vous aimerez, la pluie qui tombe c'est toujours fascinant à regarder..

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Surface
    •   debug
      • glut32.dllTélécharger ce fichier [Réservé aux membres club]221 184 octets
      • Surface.ilkTélécharger ce fichier [Réservé aux membres club]425 800 octets
    •   release
      • glut32.dllTélécharger ce fichier [Réservé aux membres club]221 184 octets
      • Surface.xTélécharger ce fichier [Réservé aux membres club]24 576 octets
    •   Surface
      •   Debug
        • BuildLog.htmTélécharger ce fichier [Réservé aux membres club]Voir ce fichier13 416 octets
        • mt.depTélécharger ce fichier [Réservé aux membres club]96 octets
        • stdafx.objTélécharger ce fichier [Réservé aux membres club]11 039 octets
        • Surface.exe.embed.manifestTélécharger ce fichier [Réservé aux membres club]405 octets
        • Surface.exe.embed.manifest.resTélécharger ce fichier [Réservé aux membres club]472 octets
        • Surface.exe.intermediate.manifestTélécharger ce fichier [Réservé aux membres club]387 octets
        • Surface.objTélécharger ce fichier [Réservé aux membres club]42 032 octets
        • Surface.pchTélécharger ce fichier [Réservé aux membres club]1 048 576 octets
        • vc80.idbTélécharger ce fichier [Réservé aux membres club]76 800 octets
      •   Release
      • glut.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier27 898 octets
      • glut.libTélécharger ce fichier [Réservé aux membres club]79 654 octets
      • glut32.libTélécharger ce fichier [Réservé aux membres club]28 728 octets
      • ReadMe.txtTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 444 octets
      • stdafx.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier326 octets
      • stdafx.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier613 octets
      • Surface.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier12 941 octets
      • Surface.vcprojTélécharger ce fichier [Réservé aux membres club]4 706 octets
      • Surface.vcproj.zaptotribal.Linck.userTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 424 octets
    • Surface.ncbTélécharger ce fichier [Réservé aux membres club]683 008 octets
    • Surface.slnTélécharger ce fichier [Réservé aux membres club]Voir ce fichier886 octets
    • Surface.suoTélécharger ce fichier [Réservé aux membres club]14 848 octets

Télécharger le zip


 Historique

23 août 2008 14:18:25 :
Changement du niveau de la source.
29 août 2008 11:09:05 :
Ajout de l'exécutable dans l'archive (Surface.x) Petite correction d'orthographe dans le titre

 Sources de la même categorie

Source avec Zip Source avec une capture AFFICHER DES COURBES DE BEZIER par shorzy
Source avec Zip Source avec une capture BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR U... par envi33
Source avec Zip Source avec une capture CLASSE AVEC OPENGL - OBJETS 3D ET ANIMATIONS par rasta63
Source avec Zip Source avec une capture LETTRES 3D AVEC OPENGL ET QT par opossum_farceur
Source avec Zip CUBE 3D GLUT32 VC++ ET DEVC++ par bobby03

 Sources en rapport avec celle ci

Source avec Zip CUBE 3D GLUT32 VC++ ET DEVC++ par bobby03
Source avec Zip Source avec une capture ALGORITHME DE CRYPTAGE/DECRYPTAGE par besilent
Source avec Zip Source avec une capture BUVETTE POURSUITE VIRTUELLE par kts_system
FILE DE PRIORITÉ DYNAMIQUE par mehdi7604
Source avec Zip Source avec une capture DEMO OPENGL par JeanCodeS

Commentaires et avis

Commentaire de koda_12 le 25/08/2008 03:29:40

problème épineux, interressant

Commentaire de nisaloncaje le 25/08/2008 11:49:54 8/10

je n'ai pas trop regardé comment c'était écrit, mais ca marche pas trop mal ^^

cependant, j'ai vu que tu utilisais une méthode d'Euler pour modéliser l'eau, n'as tu pas peur de risque d'"explosion" du système en cas de pas trop grand ?
par contre je pense que tu peux mieux faire pour l'affichage de l'eau :)

voila mais aller 8/10 ^^

Commentaire de shenron666 le 25/08/2008 23:35:15

Salut, tu pourrais ajouter l'executable compilé dans ton zip (renommé en .ex par exemple sinon il est supprimé) stp ? merci d'avance

Commentaire de SebLinck le 27/08/2008 09:12:14

Salut,

Dès que je peux ajouter l'executable, je le fais...

Sinon, je n'ai pas utiliser la méthode d'Euler pour modéliser la surface,
ou alors je ne m'en suis pas rendu compte.
Mais le calcul de force en général ( Force du ressort, gravité...)

Commentaire de nisaloncaje le 27/08/2008 09:54:23

#  TabZVitesses[ix][iy] = TabZVitesses[ix][iy] + (const_dt * A);
# // En déduire la position courante du noeud
# nouvTabZNoeud[ix][iy] = TabZNoeuds[ix][iy] + (const_dt * TabZVitesses[ix][iy]);

^^ c'est la méthode d'euler ^^

Commentaire de medACK le 28/08/2008 00:21:26

salut, ton sujet ma trop intéresser malgré que je suis que sur la 2D en ce moment, mais malheureusement je pas pus le compilé, y'a trop de fichier partout, alors j'aimerai que tu donne un exe, et puis dis moi c'est pas en Visual j'espère..  

Commentaire de SebLinck le 28/08/2008 16:43:31

Salut,

NISALONCAJE:
#  TabZVitesses[ix][iy] = TabZVitesses[ix][iy] + (const_dt * A);
# // En déduire la position courante du noeud
# nouvTabZNoeud[ix][iy] = TabZNoeuds[ix][iy] + (const_dt * TabZVitesses[ix][iy]);

^^ c'est la méthode d'euler ^^

peut être que cela s'appel la méthode d'euler !

Sinon, pour l'exe, je le met dès que possible,
disons ce soir si j'y pense...
Et oui, j'ai développé avec Visual, pourquoi espères tu le contraire?

Commentaire de medACK le 28/08/2008 20:16:09

Salut, c'est juste que je travail avec DEV C++, j'aimerai bien que vous m'expliquiez la raison pour laquelle vous utiliser Visual; car j'aimerai bien l'apprendre s'il a un plus.

Commentaire de koda_12 le 29/08/2008 12:55:16

visual studio  existe en version express et cette version est gratuite, il y a moins de fonctionnalités que la version payante.
visual studio n'en reste pas moins le meilleur éditeur gratuit à ce jour, enfin c'est ce que j'en pense personnellement j'en ai essayé pas mal parmis ceux kdevelop vim, eclipse qui est bien aussi.
Couplé avec visual assist x que tu pourras trouver chez wholetomato l'éditeur devient vraiment puissant.
Ce que tu gagnes c'est surtout de la productivité le couple vst+vax te permet de
-documenter ton code en deux clic
-changer des signatures et propager les changements à tous les appels
-renommer des classes de la même manière
-renommer des variables
-coloration syntaxique
-aide et documentation contextuelle
etc etc
tu devrais l'essayer tout simplement

pour la méthode d'euler
http://fr.wikipedia.org/wiki/M%C3%A9thode_d%27Euler

Commentaire de SebLinck le 29/08/2008 17:24:56

Salut,

Selon le lien : http://fr.wikipedia.org/wiki/M%C3%A9thode_d%27Euler

La méthode d'euler est utiliser pour calculer des valeur approchées de primitive,
Dans mon code je calcule l'accéleration qui est éale à la somme des forces (2nd loie de Newton),
puis je dérive pour obtenir la vitesse et je redérive pour obtenir la position (en fonction du temps).

Commentaire de imadxgi le 23/06/2011 04:05:18 10/10

Salut,

Tout d'abord je vous remercier sur cet exemple, je l'ai trouvé vraiment très utile.

J'ai une petit question:

Au niveau du Code tu as ajouter 4 forces

// liaison 1er voisin
dz = TabZNoeuds[ix + 1][iy] - TabZNoeuds[ix][iy] ;
printf("%f = %f - %f \n",dz,TabZNoeuds[ix+1][iy],TabZNoeuds[ix][iy]);
F = (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
// liaison 2eme voisin
dz = TabZNoeuds[ix - 1][iy] - TabZNoeuds[ix][iy] ;
printf("%f = %f - %f \n",dz,TabZNoeuds[ix-1][iy],TabZNoeuds[ix][iy]);
F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
// liaison 3eme voisin
dz = TabZNoeuds[ix][iy + 1] - TabZNoeuds[ix][iy];
printf("%f = %f - %f \n",dz,TabZNoeuds[ix][iy +1],TabZNoeuds[ix][iy]);
F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);
// liaison 4eme voisin
dz = TabZNoeuds[ix][iy - 1] - TabZNoeuds[ix][iy];
printf("%f = %f - %f \n\n",dz,TabZNoeuds[ix][iy - 1],TabZNoeuds[ix][iy]);
F+= (const_raideur * dz) / sqrt(pow(dz,2) + dx2 + dy2);

Je me demande c'est quoi exactement l'utilité de ces forces.

Merci d'avance

Commentaire de SebLinck le 23/06/2011 18:59:04

Salut,

Content que cette source ai pu t'aider. ;-)
Sinon pour ce qui est de l'utilité du calcul de force des ressorts, c'est tout simplement car c'est un modèle dynamique et que si on ne prend pas en compte la force des quatre ressorts (ligne entre les points), les points restent en bas une fois le point excité. J'espère que j'ai répondu à ta question.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

comment faire des calculs et dessiner en meme temps avec GLUT [ par nabil ] SALUT,j'ai le probleme suivant : je veux lire des coordonnées des points qui se trouve dans fichier et de faire un petit calcul et d'afficher des poin Glut et Visual Studio 6 [ par Paul ] C'est moi ou il s'aime vraiment pas ces 2 là ?Est-ce que quelqu'un a réussi à faire marcher "EXEMPLE SIMPLE OPENGL [CODE EN C]" sous VC++6 ?Je me retr Pb avec Glut sous Visual C++ [ par Yoann ] Bonjour !Je viens de me mettre à OpenGL avec Glut, mais j'ai un petit problème. En effet, quand je compile un exemple, j'ai l'erreur suivante :TestGlu Dev C++ -- et GLUT [ par papier ] !!..Salut..!!Mon probleme ,c'est ke quand je compile mon prog (open gl et glut) il me met 0 errors mais il ne veut po me le lancer , et le linker outp Pb avec Glut sous VC++ et Dev [ par mederic ] Je ne sais pas si ça vient de mon include ou autre chose. Mais je n'arrive pas executer un exemple simple sur plusieurs compilateurs.Sur VC++, il écri tutorial ou code GLUT [ par francky ] SALUT,je débute avec dev c, et j'aimerais créer une interface portable aussi bien sous window que sous linux;mon probleme: j'ai bien trouver glui, mai glut - openGL [ par loss ] Quels sont les fichiers necessaires pour utiliser glut(je compile avec VC++)?Ou est ce que je peux les telecharger?Merci d avance. Problème Glut + Dev C++ [ par Joel ] Je suis désolé de vous emmerder encore avec ça : mais j'essaie depuis 2 jours, j'ai lu tous les messages du forum et pourtant...J'ai mis les dll (glut les icones des fenetres glut [ par jack ] Est-ce que quelqu'un sait comment changer l'icone des fenetres glut. Dans une documentation trouver sur internet j'ai bien trouvé quelque chose comme lien vers librairie glut pour win32 [ par francky ] m'étant fait déja passé pour un con ne sachant pas lire,pour tout ceux qui débutent et ne trouve pas la librairie glut pour windows permettant de cree


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,373 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales