250 likes | 338 Views
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);
E N D
Estruturageral da Implementação Estruturas de Dados Visualização CálculoFísico Função Principal
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.
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)
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(); • }
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);
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); • }
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
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; • } • };
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
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; • }
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; • }
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) ; • }
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; • } • } }
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)); } }
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; } } }
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]; }
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; } } }
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; } } } }
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); • }
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 • }
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); • }
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);
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(); • }
Questões • Alterar o códigoparaproduziros demos fornecidos