OpenGL - Planeta em Órbita

Publicado por Roberto Júnior 11/04/2006

[ Hits: 12.503 ]

Homepage: http://sites.google.com/site/dibetao

Download planet3.c




Este programa exibe uma simulacao em OpenGL de um planeta em órbita de outro corpo (terra e lua por exemplo). A orbita é eliptica como diz a primeira leis de Kepler.

  



Esconder código-fonte

#include <GL/glut.h>
#include <math.h>

#define pi 4*atan(1)

GLfloat angle, fAspect,x,z,c=1;
GLint rox=30,roy=0,roz=0,ang;
static int year = 0, day = 0, wire = 1;
float teta=0;

void Desenha(void)
{
   // Limpa a janela e o depth buffer
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glColor3f(0.0f, 0.0f, 0.0f);
//--------------------------------------------------------------------------------------------------
  glPushMatrix(); //SOL
   glRotatef ((GLfloat) day/10, 0.0, 1.0, 0.0);
   glColor3f (0.89, 0.79, 0.09);
   if (wire == 0) glutSolidSphere(1.0, 25, 25);
   else glutWireSphere(1.0, 25, 25);
  glPopMatrix();
//--------------------------------------------------------------------------------------------------
  glPushMatrix(); //P1
   //glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);//Veloc de Translacao
   //glTranslatef (0.0, 0.0, 2.0);//raio do Planeta
   //glRotatef ((GLfloat) day, 0.0, 1.0, 0.0);//Veloc de Rotacao
   glTranslatef (x, 0, z);
   glColor3f (1.0, 0.5, 0.0);
   if (wire == 0) glutSolidSphere(0.3, 25, 25);
   else glutWireSphere(0.3, 25, 25);
  glPopMatrix();
//--------------------------------------------------------------------------------------------------
/*
glPushMatrix();
glBegin(GL_LINE_STRIP);
   glColor3f( 1.0, 1.0 , 1.0);
   z=-3; c=1;
   while (z<=3)
   {
   z=z+c/10;
   x= sqrt(9-z*z);
   glVertex3f(x, z,0);
   //glVertex3f(-x, z,0);
   }
glEnd();
glPopMatrix();*/
//--------------------------------------------------------------------------------------------------

glutSwapBuffers();
}

void Inicializa (void)
{
   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]={1.0, 1.0, 1.0, 1.0};// "brilho"
   GLfloat posicaoLuz[4]={0.0, 50.0, 50.0, 1.0};

   // Capacidade de brilho do material
   GLfloat especularidade[4]={1.0,1.0,1.0,1.0};
   GLint especMaterial = 60;

    // Especifica que a cor de fundo da janela sera' preta
   glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

   glShadeModel(GL_SMOOTH);// Habilita o modelo de colorizacao de Gouraud
   glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);// Define a refletancia do material
   glMateriali(GL_FRONT,GL_SHININESS,especMaterial);// Define a concentracao do brilho
   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);// Ativa o uso da luz ambiente

   // Define os parametros da luz de numero 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 );

   glEnable(GL_COLOR_MATERIAL);// Habilita a definicao da cor do material a partir da cor corrente
   glEnable(GL_LIGHTING);//Habilita o uso de iluminacao
   glEnable(GL_LIGHT0);// Habilita a luz de numero 0
   glEnable(GL_DEPTH_TEST);// Habilita o depth-buffering

   angle=25;
}

// Funcao usada para especificar o volume de visualizacao
void EspecificaParametrosVisualizacao(void)
{
   glMatrixMode(GL_PROJECTION);// Especifica sistema de coordenadas de projecao
   glLoadIdentity();// Inicializa sistema de coordenadas de projecao
   gluPerspective(angle,fAspect,0.4,500);// Especifica a projecao perspectiva
   glMatrixMode(GL_MODELVIEW);// Especifica sistema de coordenadas do modelo
   glLoadIdentity();// Inicializa sistema de coordenadas do modelo
   if (rox>0) gluLookAt(0,rox,1, 0,0,0, 0,1,0);
   else gluLookAt(0,0,rox, 0,0,0, 0,1,0);
   //gluLookAt(rox,roy,roz, 0,0,0, 0,1,0);
}

void AlteraTamanhoJanela(GLsizei w, GLsizei h)
{
   if ( h == 0 ) h = 1;
   glViewport(0, 0, w, h);
   fAspect = (GLfloat)w/(GLfloat)h;
   EspecificaParametrosVisualizacao();
}

void spinDisplay(void)
{
  year = (year + 1);
  day  = (day + 2 );
  glutPostRedisplay();
}

void GerenciaMouse(int button, int state, int x, int y)
{
   if (button == GLUT_LEFT_BUTTON)
      if (state == GLUT_DOWN) {  // Zoom-in
         if (angle >= 10) angle -= 5;
         //glutIdleFunc(spinDisplay);
      }
   if (button == GLUT_RIGHT_BUTTON)
      if (state == GLUT_DOWN) {  // Zoom-out
         if (angle <= 130) angle += 5;
      }
   EspecificaParametrosVisualizacao();
   glutPostRedisplay();
}

void GerenciaTEspeciais(int key, int x, int y)
{

if(key == GLUT_KEY_UP)
   {
   rox+=10; roy=0; roz=0;
   ang+=10;
   }
if(key == GLUT_KEY_DOWN)
   {
   rox-=10; roy=0; roz=0;
   ang-=10;
   }
if(key == GLUT_KEY_LEFT)
   {
   rox=0; roy+=1; roz=0;
   ang+=10; wire=0;
   }
if(key == GLUT_KEY_RIGHT)
   {
   rox=0; roy-=1; roz=0;
   ang-=10; wire=1;
   }

Desenha;
glutPostRedisplay();
}

void Keyboard_Function(unsigned char key, int x, int y)
{
 switch (key)
 {
  case 65:   // A
  {
  ++rox;
   break;
  }
  case 97:   // a
  {
  --rox;
   break;
  }
  case 83 :    // S
  {
  ++roy;
   break;
  }
  case 115:    // s
  {
  --roy;
   break;
  }

  case 68 :    //D
  {
  ++roz;
   break;
  }

  case 100:    //d
  {
  --roz;
   break;
  }
 }

glutPostRedisplay();
}


void Timer(int value)
{

//if (z>=3 || z<=-3) c=c*(-1);
//z=z+c/10;
//x= (9-z*z)*c;

x=5*cos(teta);
z=3*sin(teta);
//teta = teta*180/pi + 1;
teta=teta+0.01;
//if (teta==2*pi) teta=0;

spinDisplay();

EspecificaParametrosVisualizacao();
Desenha;
glutPostRedisplay();
glutTimerFunc(10,Timer, 5);
}

int main(void)
{
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize(400,350);
   glutCreateWindow("Visualizacao 3D");
   glutDisplayFunc(Desenha);
   glutReshapeFunc(AlteraTamanhoJanela);
   glutMouseFunc(GerenciaMouse);
   glutSpecialFunc(GerenciaTEspeciais);
   glutKeyboardFunc(Keyboard_Function);
   glutTimerFunc(500, Timer, 1);
   Inicializa();
   glutMainLoop();
}


Scripts recomendados

Busca Binária - Não recursivo

Gerando uma "number list" de 6 digitos

Checkcred - Checagem de créditos.

Programa para cálculo de números complexos

Agenda eletronica com banco de dados em arquivo texto


  

Comentários
[1] Comentário enviado por m3ocs-d4rksun em 13/04/2006 - 00:41h

como compilo isso?
gcc -o planet3 planet3.c
assim?
[]'s darksun

[2] Comentário enviado por dibetao em 13/04/2006 - 09:55h

Enviei a forma de compilar para a seção "DICAS" do VOL, mas ainda não foi disponibilizada pela equipe. Então vou te explicar:
Primeiro voce tem que ter o "freeglut" e o "libglut" instalado para que na hora da compilação utiliza as bibliotecas OpenGL. (no Debian os pacotes para o apt-get são: freeglut3, freeglut3-dev, libglut). E na hora de compilar é:
"gcc -I/usr/X11R6/include -L../lib -lglut -lGLU -lGL -lm planet3.c -o planet3"

[3] Comentário enviado por in54no em 14/04/2006 - 09:50h

Olha kra, muito dahora o programa...
teh mais, fique com Deus!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts