Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Opera ubuntu
Por izaias
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Scripts

Linux user

Publicado por Roberto Júnior em 11/04/2006    [ 5753 hits ]

Login: dibetao, 65181 pontos

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


Descrição

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.

[ Download: planet3.c ]   [ Enviar nova versão ]

[ 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
   Script Linux recomendado Converçor de Decimal para Binario
   Script Linux recomendado Função para ler nome.
   Script Linux recomendado Comando strstr
   Script Linux recomendado Makro
   Script Linux recomendado calculadora em C

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


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.