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

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

Simulação Massa-Mola para Tecidos. Estrutura geral da Implementação Estruturas de Dados Visualização Cálculo Físico Função Principal.

Apresentações semelhantes


Apresentação em tema: "Simulação Massa-Mola para Tecidos. Estrutura geral da Implementação Estruturas de Dados Visualização Cálculo Físico Função Principal."— 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); glLoadIdentity(); }

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 #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) coord ret; ret.x=i.x+j.x; ret.y=i.y+j.y; ret.z=i.z+j.z; return ret; } coord operator-(const coord &i, const coord &j){ // subtrai duas forças (particulas) coord ret; ret.x=i.x-j.x; ret.y=i.y-j.y; ret.z=i.z-j.z; return ret; }

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 coord ret; ret.x = i.x*f; ret.y = i.y*f; ret.z = i.z*f; return ret; } coord operator/(const coord &i, double f){ // define operador divisão para uma particula coord ret; ret.x = i.x/f; ret.y = i.y/f; ret.z = i.z/f; return ret; }

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

15 Cálculo Físico void calcHook(){ // esta funcao calcula a forca elastica entre as particulas vizinhas coord dist; for (int i=0;i0){ 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

16 if(i0){ 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(j0){ 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

17 void calcFat(){ // funcao para calcular a força de atrito for (int i=0;i0){ 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(j0){ Fatrito[i][j] = Fatrito[i][j]+V[i][j-1]; } if(j

18 if(i0){ Fatrito[i][j] = Fatrito[i][j]+V[i+1][j-1]; } Fatrito[i][j] = Fatrito[i][j]+V[i+1][j]; if(j

19 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;iR+1 ){ P[i][j] = P[i][j] + V[i][j]*dt; quant_movimento=quant_movimento+V[i][j]; // acumula energia cinetica (velocidade) }else{ contato=true; } Cálculo Físico

20 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); } Visualização

21 // 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 } Visualização

22 // 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

23 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

24 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(); } Visualização

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


Carregar ppt "Simulação Massa-Mola para Tecidos. Estrutura geral da Implementação Estruturas de Dados Visualização Cálculo Físico Função Principal."

Apresentações semelhantes


Anúncios Google