A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Simulação Massa-Mola para Tecidos

Apresentações semelhantes


Apresentação em tema: "Simulação Massa-Mola para Tecidos"— Transcrição da apresentação:

1 Simulação Massa-Mola para Tecidos

2 Estrutura geral da Implementação
Estruturas de Dados Visualização Cálculo Físico Função Principal

3 Função principal igual a todas as outras: inclui os CallBacks; incluir o CallBack da Timer: glutTimerFunc(T,massamola,1); Notem aqui que a função CallBack chama-se massamola, e não esquecer que a glutTimerFunc de ser recursiva.

4 Visualização São as funções de sempre:
Inicializa: não esquecer de habilitar a iluminação dentro dela; // será fornecida Teclado: para sair com ESC // será fornecida AlteraTamanhoJanela// Essa é importante (Detalhes no próximo slide)

5 Função AlteraTamanhoJanela
// Função callback chamada quando o tamanho da janela é alterado void AlteraTamanhoJanela(GLsizei w, GLsizei h) { GLsizei largura, altura; // Evita a divisao por zero if(h == 0) h = 1; // Atualiza as variáveis largura = w; altura = h; // Especifica as dimensões da Viewport glViewport(0, 0, largura, altura); // Inicializa o sistema de coordenadas glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,w/h,0.5,500); glMatrixMode(GL_MODELVIEW); }

6 Define Iluminação (Importante)
// Função responsável pela especificação dos parâmetros de iluminação void DefineIluminacao (void) { GLfloat MatDifuseFront[4]={1.0,0.0,0.0,1.0}; GLfloat MatDifuseBack[4] ={0.0,0.0,1.0,1.0}; GLfloat luzAmbiente[4]={0.2,0.2,0.2,1.0}; GLfloat luzDifusa[4]={0.7,0.7,0.7,1.0}; // "cor" GLfloat luzEspecular[4]={0.5, 0.5, 0.5, 1.0};// "brilho" GLfloat posicaoLuz[4]={0, 250, 0, 1}; GLfloat posicaoLuz2[4]={0, -250, 0, 1}; glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); // Capacidade de brilho do material GLfloat especularidade[4]={1.0,1.0,1.0,1.0}; GLint especMaterial = 5; //GLfloat difusa[4]={1.0,0,0,1.0}; // Define a refletância do material glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR, especularidade); // Define a concentração do brilho glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,especMaterial);

7 Define Iluminação (Importante, continua …)
glMaterialfv(GL_FRONT,GL_DIFFUSE,MatDifuseFront); glMaterialfv(GL_BACK,GL_DIFFUSE,MatDifuseBack); // Ativa o uso da luz ambiente glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente); // Define os parâmetros da luz de número 0 glLightfv(GL_LIGHT0, GL_AMBIENT, luzAmbiente); glLightfv(GL_LIGHT0, GL_DIFFUSE, luzDifusa ); glLightfv(GL_LIGHT0, GL_SPECULAR, luzEspecular ); glLightfv(GL_LIGHT0, GL_POSITION, posicaoLuz ); glLightfv(GL_LIGHT1, GL_AMBIENT, luzAmbiente); glLightfv(GL_LIGHT1, GL_DIFFUSE, luzDifusa ); glLightfv(GL_LIGHT1, GL_SPECULAR, luzEspecular ); glLightfv(GL_LIGHT1, GL_POSITION, posicaoLuz2 ); //Habilita o uso de iluminação glEnable(GL_LIGHTING); // Habilita a luz de número 0 glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); // Habilita o depth-buffering glEnable(GL_DEPTH_TEST); }

8 Estrutura de Dados Esta é uma das partes mais importantes:
//Bibliotecas e defines #include <GL/glut.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #define N 70 //Numero de particulas #define dt 0.03 // Delta T #define m 0.3 //massa de cada célula #define K 100 //Constante de elasticidade #define Fat 0.05 // Constante de atrito #define g coord(0,0,10) // Aceleracao da gravidade #define H 200 //Altura H #define T 1 #define R 10 //raio da bolinha int especMaterial; // para reflexão double t; // para contagem do numero de iteracoes bool contato; // para marcar quando o tecido toca a esfera

9 Estrutura de Dados //Esta é uma das partes mais importantes:
class coord{ public: double x,y,z; coord(){ x=0; y=0; z=0; } coord(double x,double y, double z){ this->x=x; this->y=y; this->z=z; coord& o perator = (const coord& a) { this->x = a.x; this->y = a.y; this->z = a.z; return *this; };

10 Estrutura de Dados coord quant_movimento; // Energia Cinética
coord P[N][N]; // posição coord A[N][N]; // Aceleração coord V[N][N]; // Velocidade coord Fatrito[N][N]; // Força de Atrito coord Felastica[N][N]; // Força Elástica

11 Estrutura de Dados coord calcDistancia(coord i, coord j) // calcula a distancia entre duas particulas coord ret; ret.x = j.x-i.x; ret.y = j.y-i.y; ret.z = j.z-i.z; return ret; } coord operator+(const coord &i, const coord &j){ // soma duas forças (particulas) ret.x=i.x+j.x; ret.y=i.y+j.y; ret.z=i.z+j.z; coord operator-(const coord &i, const coord &j){ // subtrai duas forças (particulas) ret.x=i.x-j.x; ret.y=i.y-j.y; ret.z=i.z-j.z;

12 Estrutura de Dados coord operator-(const coord &i){ // define operador – (menos) para uma particula (forca) coord ret; ret.x=-i.x; ret.y=-i.y; ret.z=-i.z; return ret; } coord operator*(const coord &i, double f){ // define um operador * (multiplicação) p/ uma particula ret.x = i.x*f; ret.y = i.y*f; ret.z = i.z*f; coord operator/(const coord &i, double f){ // define operador divisão para uma particula ret.x = i.x/f; ret.y = i.y/f; ret.z = i.z/f;

13 Estrutura de Dados double modulo(const coord &i){ // define operador modulo p/ particula return sqrt(i.x*i.x + i.y*i.y+i.z*i.z); } void imprime(const coord &i){ // define operador imprime p/ particula printf("x: %f\ty: %f\tz:%f\n",i.x,i.y,i.z) ;

14 Cálculo Físico void setMesh(){ // essa função inicializa a malha e as suas propriedades fisicas for (int i=0;i<N;i++){ for (int j=0;j<N;j++){ A[i][j].x = 0; A[i][j].y = 0; A[i][j].z = 0; V[i][j].x = 0; V[i][j].y = 0; V[i][j].z = 0; Felastica[i][j].x = 0; Felastica[i][j].y = 0; Felastica[i][j].z = 0; Fatrito[i][j].x = 0; Fatrito[i][j].y = 0; Fatrito[i][j].z = 0; } for (int i=0;i<N;i++){ // este trecho inicializa posição P[i][j].x = i; ; P[i][j].y = j; ; P[i][j].z = H;

15 Cálculo Físico void calcHook(){ // esta funcao calcula a forca elastica entre as particulas vizinhas coord dist; for (int i=0;i<N;i++){ for (int j=0;j<N;j++){ Felastica[i][j] = coord(0,0,0); if(i>0){ Felastica[i][j] = Felastica[i][j] + calcDistancia(P[i][j],P[i-1][j])*(modulo(calcDistancia(P[i][j],P[i-1][j]))-1.0); if(j>0){ Felastica[i][j] = Felastica[i][j]+calcDistancia(P[i][j],P[i-1][j-1])*(modulo(calcDistancia(P[i][j],P[i-1][j-1]))-sqrt(2.0)); } if(j<N-1){ Felastica[i][j] = Felastica[i][j] + calcDistancia(P[i][j],P[i-1][j+1])*(modulo(calcDistancia(P[i][j],P[i-1][j+1]))-sqrt(2.0));

16 Cálculo Físico if(i<N-1){
Felastica[i][j] = Felastica[i][j] + calcDistancia(P[i][j],P[i+1][j])*(modulo(calcDistancia(P[i][j],P[i+1][j]))-1.0); if(j>0){ Felastica[i][j] = Felastica[i][j] + calcDistancia(P[i][j],P[i+1][j-1])*(modulo(calcDistancia(P[i][j],P[i+1][j-1]))-sqrt(2.0)); } if(j<N-1){ Felastica[i][j] = Felastica[i][j] + calcDistancia(P[i][j],P[i+1][j+1])*(modulo(calcDistancia(P[i][j],P[i+1][j+1]))-sqrt(2.0)); Felastica[i][j] = Felastica[i][j] + calcDistancia(P[i][j],P[i][j-1])*(modulo(calcDistancia(P[i][j],P[i][j-1]))-1.0); Felastica[i][j] = Felastica[i][j] + calcDistancia(P[i][j],P[i][j+1])*(modulo(calcDistancia(P[i][j],P[i][j+1]))-1.0); Felastica[i][j] = Felastica[i][j] * K;

17 Cálculo Físico void calcFat(){ // funcao para calcular a força de atrito for (int i=0;i<N;i++){ for (int j=0;j<N;j++){ Fatrito[i][j]=coord(0,0,0); if(i>0){ if(j>0){ Fatrito[i][j] = Fatrito[i][j]+V[i-1][j-1]; } Fatrito[i][j] = Fatrito[i][j]+V[i-1][j]; if(j<N-1){ Fatrito[i][j] = Fatrito[i][j]+V[i-1][j+1]; Fatrito[i][j] = Fatrito[i][j]+V[i][j-1]; Fatrito[i][j] = Fatrito[i][j]+V[i][j+1];

18 Cálculo Físico if(i<N-1){ if(j>0){ Fatrito[i][j] = Fatrito[i][j]+V[i+1][j-1]; } Fatrito[i][j] = Fatrito[i][j]+V[i+1][j]; if(j<N-1){ Fatrito[i][j] = Fatrito[i][j]+V[i+1][j+1]; Fatrito[i][j] = Fatrito[i][j]*Fat;

19 Cálculo Físico void calcPosicoes(){ // funcção para calcular as posicoes das particulas calcHook(); // calcula forca elastica calcFat(); // calcula forca de atrito double M1; for (int i=0;i<N-1;i++){ for (int j=0;j<N;j++){ if(i<N/2){ M1 =m; }else{ M1=m; } // calcula a aceleração A[i][j] = ((-g*M1 + Felastica[i][j] - Fatrito[i][j])/2 / M1); } // calcula a energia cinetica quant_movimento=coord(0,0,0); // controla a energia cinetica pra fazer a simulacao parar for (int i=0;i<N;i++){ V[i][j]= V[i][j]+ A[i][j]*dt; if( modulo(P[i][j]-coord(N/2,N/2,H*0.7))>R+1 ){ P[i][j] = P[i][j] + V[i][j]*dt; quant_movimento=quant_movimento+V[i][j]; // acumula energia cinetica (velocidade) contato=true;

20 Visualização void setaPosicaoObs(){ glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); DefineIluminacao(); // esta funcao controla o ângulo de vizualização gluLookAt(150,250,100,0,H*0.7,0,0,1,0); }

21 Visualização // funcao para fazer toda a simulacao
void massamola(int v) { // calcula as posicoes calcPosicoes(); glutPostRedisplay(); // forca a display executar if (modulo(quant_movimento)>100 || !contato) // para a simulacao glutTimerFunc(T,massamola,1); // executa mai uma iteracao }

22 Visualização // esta funcao serve apenas para colorir a malha
// proporcionalmente às forcas atuantes em casa particula void cor(double forca){ forca/=30; GLfloat difusa[4]={0.5*forca, *(1-forca), ,1.0}; glMaterialfv(GL_FRONT,GL_DIFFUSE,difusa); difusa={1.0, *forca, 0.5*(1-forca),1.0}; glMaterialfv(GL_BACK,GL_DIFFUSE,difusa); }

23 Visualização void DesenhaMalha(void) /// esta funcao desenha a manha, é uma Callback, está no lugar da desenha { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); setaPosicaoObs(); double deslocamento=N/2; glBegin(GL_TRIANGLES); for(int i=0;i<N-1;i++){ for(int j=0;j<N-1;j++) cor(modulo(Felastica[i][j])); glVertex3f(P[i][j].x-deslocamento,P[i][j].z, P[i][j].y-deslocamento); cor(modulo(Felastica[i][j+1])); glVertex3f(P[i][j+1].x-deslocamento,P[i][j+1].z, P[i][j+1].y-deslocamento); cor(modulo(Felastica[i+1][j])); glVertex3f(P[i+1][j].x-deslocamento,P[i+1][j].z, P[i+1][j].y-deslocamento);

24 Visualização cor(modulo(Felastica[i+1][j+1]));
glVertex3f(P[i+1][j+1].x-deslocamento,P[i+1][j+1].z, P[i+1][j+1].y-deslocamento); cor(modulo(Felastica[i+1][j])); glVertex3f(P[i+1][j].x-deslocamento,P[i+1][j].z, P[i+1][j].y-deslocamento); //imprime(P[i][j]); } glEnd(); GLfloat difusa[4]={0,0,1.0,1.0}; glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,difusa); glTranslatef(0,H*0.7,0); glutSolidSphere(R,10,10); // Executa os comandos OpenGL glutSwapBuffers();

25 Questões Alterar o código para produzir os demos fornecidos


Carregar ppt "Simulação Massa-Mola para Tecidos"

Apresentações semelhantes


Anúncios Google