Ir ao conteúdo
  • Cadastre-se
gianflores

C++ aplicação opengl de simulação física

Recommended Posts

Boa noite, atualmente estou em um projeto pessoal desenvolvendo e estudando uma aplicação que envolve física em OpenGL, porém estou encontrando dificuldades na compreensão de algumas coisas, então gostaria de saber se alguém que entenda de programação OpenGL estaria disposto a me auxiliar em algumas pequenas dúvidas da aplicação que estou estudando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz bastante tempo desde a ultima vez que usei openGL e webGL, tinha guardado este trecho de código, pode te ajudar a iniciar algo. A glut.h é legal para aprender a programar com openGL, mas se for fazer um projeto mais complexo, vai precisar usar outras coisas.

 

OBS: para rodar este código será necessário a DLL glut32.dll e as libs glut.h e GL/gl.h. Este código gera uma animação de um cilindro 3D, esta animação termina quando a tecla "esc" for apertada. 

 

#include <stdlib.h>
#include <glut.h>
#include <GL/gl.h>
#include <stdio.h>
#include <math.h>

#define ESCAPE_KEY 27

float janela;
float t = 0.0f;

void renderCylinder(float x1, float y1, float z1, float x2,float y2, float z2, float radius,int sub_divisao,GLUquadricObj *quadric) {
   float vx = x2-x1;
   float vy = y2-y1;
   float vz = z2-z1;

   if(vz == 0)
       vz = .00000001;

   float v = sqrt( vx*vx + vy*vy + vz*vz );
   float ax = 57.2957795*acos( vz/v );

   if ( vz < 0.0 )
       ax = -ax;

   float rx = -vy*vz;
   float ry = vx*vz;
   glPushMatrix();

   //CORPO CILINDRO
   glTranslatef( x1,y1,z1 );
   glRotatef(ax, rx, ry, 0.0);
   gluQuadricOrientation(quadric,GLU_OUTSIDE);
   gluCylinder(quadric, radius, radius, v, sub_divisao, 1);

   //Primeiro Cap
   gluQuadricOrientation(quadric,GLU_INSIDE);
   gluDisk( quadric, 0.0, radius, sub_divisao, 1);
   glTranslatef( 0,0,v );

   //Segundo Cap
   gluQuadricOrientation(quadric,GLU_OUTSIDE);
   gluDisk(quadric, 0.0, radius, sub_divisao, 1);
   glPopMatrix();
}

void CILINDRO(float x1, float y1, float z1, float x2,float y2, float z2, float radius,int sub_divisao) {
   GLUquadricObj *quadric=gluNewQuadric();
   gluQuadricNormals(quadric, GLU_SMOOTH);
   renderCylinder(x1,y1,z1,x2,y2,z2,radius,sub_divisao,quadric);
   gluDeleteQuadric(quadric);
}


void display() {
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glLoadIdentity();
   glTranslatef(0,0,-7);
   
   //Definindo o cilindro
   float x1 = sin(t);
   float y1 = sin(t/2);
   float z1 = cos(t*1.1);
   float x2 = -sin(t*1.3);
   float y2 = 0;
   float z2 = -cos(t);
   float radius = 0.03+(sin(t)/2+0.5)/3;

   CILINDRO(x1,y1,z1,x2,y2,z2,radius,32);		   
   t+=0.010;
   glutSwapBuffers();
}

void InitGL(int Width, int Height) {
   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
   glClearDepth(1.0);
   glDepthFunc(GL_LESS);
   glEnable(GL_DEPTH_TEST);

   glShadeModel(GL_SMOOTH);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
   glMatrixMode(GL_MODELVIEW);

   glEnable(GL_LIGHTING);
   GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
   GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
   GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f };
   glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
   glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
   glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
   glEnable(GL_LIGHT1);
}

void keyPressed(unsigned char key, int x, int y) {
   if(key == ESCAPE_KEY) {
       glutDestroyWindow(janela);
       exit(1);
   }
}

int main( int argc, char** argv) {
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
   glutInitWindowSize(640, 480);
   janela = glutCreateWindow("");
   glutDisplayFunc(&display);
   glutKeyboardFunc(&keyPressed);
   glutFullScreen();
   glutIdleFunc(&display);
   InitGL(640, 480);
   glutMainLoop();
   return 1;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×