1 / 25

Simulação Massa- Mola para Tecidos

Simulação Massa- Mola para Tecidos. Estrutura geral da Implementação. Estruturas de Dados. Visualização. Cálculo Físico. Função Principal. Função principal. i gual a todas as outras : inclui os CallBacks ; incluir o CallBack da Timer: glutTimerFunc (T,massamola,1);

Download Presentation

Simulação Massa- Mola para Tecidos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Simulação Massa-MolaparaTecidos

  2. Estruturageral da Implementação Estruturas de Dados Visualização CálculoFísico Função Principal

  3. Função principal • igual a todas as outras: incluiosCallBacks;incluiro CallBack da Timer: glutTimerFunc(T,massamola,1); Notemaquique a funçãoCallBackchama-se massamola, e nãoesquecerque a glutTimerFunc de ser recursiva.

  4. Visualização • São as funções de sempre: • Inicializa: nãoesquecer de habilitar a iluminaçãodentrodela; // seráfornecida • Teclado: parasair com ESC // seráfornecida • AlteraTamanhoJanela// Essa é importante (Detalhes no próximo slide)

  5. FunçãoAlteraTamanhoJanela • // Função callback chamadaquando o tamanho da janela é alterado • void AlteraTamanhoJanela(GLsizei w, GLsizei h) • { • GLsizeilargura, altura; • // Evita a divisaopor 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); • glLoadIdentity(); • }

  6. Define Iluminação (Importante) • // Funçãoresponsávelpelaespecificação dos parâmetros de iluminação • void DefineIluminacao (void) • { • GLfloatMatDifuseFront[4]={1.0,0.0,0.0,1.0}; • GLfloatMatDifuseBack[4] ={0.0,0.0,1.0,1.0}; • GLfloatluzAmbiente[4]={0.2,0.2,0.2,1.0}; • GLfloatluzDifusa[4]={0.7,0.7,0.7,1.0}; // "cor" • GLfloatluzEspecular[4]={0.5, 0.5, 0.5, 1.0};// "brilho" • GLfloatposicaoLuz[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 • GLfloatespecularidade[4]={1.0,1.0,1.0,1.0}; • GLintespecMaterial = 5; • //GLfloatdifusa[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 luzambiente • glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente); • // Define osparâ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 partesmaisimportantes: • //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 cadacé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 partesmaisimportantes: • 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 • coordquant_movimento; // Energia Cinética • coord P[N][N]; // posição • coord A[N][N]; // Aceleração • coord V[N][N]; // Velocidade • coordFatrito[N][N]; // Força de Atrito • coordFelastica[N][N]; // Força Elástica

  11. Estrutura de Dados • coordcalcDistancia(coord i, coord j) // calcula a distancia entre duas particulas • coordret; • ret.x = j.x-i.x; • ret.y = j.y-i.y; • ret.z = j.z-i.z; • returnret; • } • coordoperator+(constcoord &i, constcoord &j){ // soma duas forças (particulas) • coordret; • ret.x=i.x+j.x; • ret.y=i.y+j.y; • ret.z=i.z+j.z; • returnret; • } • coordoperator-(constcoord &i, constcoord &j){ // subtrai duas forças (particulas) • coordret; • ret.x=i.x-j.x; • ret.y=i.y-j.y; • ret.z=i.z-j.z; • returnret; • }

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

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

  14. CálculoFísico • voidsetMesh(){ // 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 • for (int j=0;j<N;j++){ • P[i][j].x = i; ; • P[i][j].y = j; ; • P[i][j].z = H; • } • } }

  15. CálculoFísico • voidcalcHook(){ // esta funcao calcula a forca elastica entre as particulasvizinhas coorddist; 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álculoFí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)); } } if(j>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); } if(j<N-1){ 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álculoFísico voidcalcFat(){ // 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]; } } if(j>0){ Fatrito[i][j] = Fatrito[i][j]+V[i][j-1]; } if(j<N-1){ Fatrito[i][j] = Fatrito[i][j]+V[i][j+1]; }

  18. CálculoFí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álculoFísico voidcalcPosicoes(){ // 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 energiacineticaprafazer a simulacaoparar for (inti=0;i<N;i++){ for (int j=0;j<N;j++){ 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]; // acumulaenergiacinetica (velocidade) }else{ contato=true; } } } }

  20. Visualização • voidsetaPosicaoObs(){ • 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 • voidmassamola(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, 0.5*(1-forca), 1.0,1.0}; • glMaterialfv(GL_FRONT,GL_DIFFUSE,difusa); • difusa={1.0, 0.5*forca, 0.5*(1-forca),1.0}; • glMaterialfv(GL_BACK,GL_DIFFUSE,difusa); • }

  23. Visualização • voidDesenhaMalha(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); • cor(modulo(Felastica[i][j+1])); • glVertex3f(P[i][j+1].x-deslocamento,P[i][j+1].z, P[i][j+1].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ódigoparaproduziros demos fornecidos

More Related