All pastes #775098 Raw Edit

gluLookAt

public text v1 · immutable
·published 2007-11-15 14:09 UTC
rendered paste body
/*******************F********************************
*                                                 
* RODRIGO LUIS DE SOUZA DA SILVA    28/04/2005    
*                                                 
*	  08_projection.cpp                  
*                                                 
* 28/04/2005 - Reshape function added             
* 28/04/2005 - Cameras Settings Changed           
* 28/04/2005 - Keyboard and Special Keys added    
* 28/04/2005 - Light Control Added                
* 03/11/2006 - Fix GluLookAtPosition              
***************************************************/
/*

Programa simples que demonstra diferença entre a
projeção ortogonal e perspectiva no OpenGL.

*/

#ifdef WIN32
#include <windows.h>
#endif
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

float angle = 0, raio = 0.8;
int enableMenu = 0;
int dist = 25;
int proj = 0;
int width = 600;
int height = 600;
float aux = 1;
float luzX = -2, luzY = -2, luzZ = -5;
char texto[30];
GLfloat light0_position[] = {luzX, luzY, luzZ, 0.0f};   
float Ax =0.0, Ay=-8.0, Az=-8.0;
float Bx=0.0, By=0.0, Bz=0.0;
float Cx=0.0, Cy=1.0, Cz=0.0;
float Posicao = Ay * 0.005;
bool idleOn=true;
//gluLookAt (0.0, -8.0, -8.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);


float rotationX = 0.0, rotationY = 0.0;
int   last_x, last_y;


void showMenu()
{
   system("cls");
   printf("\nPROJECTION\n==========\n\n");
   printf("Mouse\n");
   printf("* Clique com o botao esquerdo para mover camera ou objeto.\n");   
   printf("* Clique com o botao direito para alterar modo de projecao.\n");
   printf("Teclado\n");
   printf("* Direcionais + PgUp/PgDown movimentam a luz no plano (start: [0, 0, 5])\n");   
   printf("* ESC - Para sair\n");
}

//Reshape Func
void reshape( int w, int h)
{
	width = w;
	height = h;
	glViewport(0,0,w,h);
}

void keyboard(unsigned char key, int x, int y) 
{       
   switch (tolower(key)) 
   {
      case 27 : 
         exit(0);
      break;
   }
   glutPostRedisplay();
}

void desenhaEixos()
{
   glDisable(GL_LIGHTING);
/*   glColor3f (0.0, 1.0, 0.0);          
   glBegin(GL_LINES);
      glColor3f(1.0, 0.0, 0.0);
      glVertex3f (-dist, 0.0, 0.0);
      glVertex3f ( dist, 0.0, 0.0);
      glColor3f(0.0, 1.0, 0.0);      
      glVertex3f (0.0, -dist, 0.0);
      glVertex3f (0.0,  dist, 0.0);
      glColor3f(0.0, 0.0, 1.0);      
      glVertex3f (0.0, 0.0, -dist);
      glVertex3f (0.0, 0.0,  dist);      
   glEnd(); */  

glBegin(GL_LINE_LOOP);
      glColor3f (1.0, 1.0, 1.0);
      glVertex3f (0.0, 0.0, 0.0);   
      glVertex3f (5.0, 0.0, 0.0);        
      glVertex3f (5.0, 5.0, 0.0);              
      glVertex3f (0.0, 5.0, 0.0); 
   glEnd();

   glBegin(GL_LINES);
	int x;
      glColor3f (1.0, 1.0, 1.0);
      for (x = 1; x < 5; x++)
      {
      	glVertex3f (x, 0.0, 0.0);   
      	glVertex3f (x, 5.0, 0.0);
      }
      for (x = 1; x < 5; x++)
      {
      	glVertex3f (0.0, x, 0.0);   
      	glVertex3f (5.0, x, 0.0);
      }
   glEnd();
   glEnable(GL_LIGHTING);   
}
void idle()
{
   Ay = Ay + 1 * 0.005;   
   glutPostRedisplay();   
}   

// Motion callback
void motion(int x, int y )
{
  rotationY += (float) (y - last_y);
  rotationX += (float) (x - last_x);

  last_x = x;
  last_y = y;
  idleOn = !idleOn;
  if (idleOn) 
     glutIdleFunc( NULL );
  else
      glutIdleFunc( idle );
      
  glutPostRedisplay(); 
}

// Mouse callback
void mouse(int button, int state, int x, int y)
{
  if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ) {
    
    last_x = x;
    last_y = y;
  } 
  if ( button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN ) {
    proj= !proj;
    if(!proj) printf("Projecao Ortogonal.\n");
    else      printf("Projecao Perspectiva.\n");
  }   
}

void special(int key, int x, int y) 
{       
   switch (key) 
   {
      case GLUT_KEY_LEFT: 
         luzX+=1.0;
      break;
      case GLUT_KEY_RIGHT: 
         luzX-=1.0;         
      break;
      case GLUT_KEY_UP:
         luzY+= 1.0;         
      break;
      case GLUT_KEY_DOWN: 
         luzY-= 1.0;         
      break;
      case GLUT_KEY_PAGE_UP: 
         luzZ+=0.5;         
      break;
      case GLUT_KEY_PAGE_DOWN:          
         luzZ-=0.5;         
      break;
   }
   light0_position[0] = luzX;
   light0_position[1] = luzY;   
   light0_position[2] = luzZ;   
   printf("New Light Position [%.1f,%.1f,%.1f]\n", luzX, luzY, luzZ);
   glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
         
   glutPostRedisplay();
}

void display(void)
{ 
   // Limpar todos os pixels
  	glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

   // inicializar sistema de projeção
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   
   glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
//    if(!proj)
// 	glOrtho(0, 5, 0, 5, -200.0, 200.0);
//      //glOrtho(-orho, orho, -orho, orho, -200, 200);
//    else
     gluPerspective(40.0f,(GLfloat)width/(GLfloat)height,0.1f,200.0f);	// Calculate The Aspect Ratio Of The Window

   glMatrixMode(GL_MODELVIEW);      
   glLoadIdentity();
   
   //gluLookAt (0.0, -8.0, -8.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   gluLookAt (Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz);

   // Movimenta a camera em torno do objeto
   // Luz fica fixa na posição (0, 0, 5) inicialmente
   glRotatef(rotationY, 1.0, 0.0, 0.0 );
   glRotatef(rotationX, 0.0, 1.0, 0.0 );   
   glPushMatrix();   
      glColor3f (1.0, 1.0, 1.0);                                  
      glDisable(GL_LIGHTING);                   
//      glutWireCube(10);         
      glEnable(GL_LIGHTING);                       
      glTranslatef(-2.5f,-2.5f,0.0f); 
      desenhaEixos();             
   glPopMatrix();

   glPushMatrix();   
      glColor3f (1.0, 0.0, 0.0);
      glTranslatef(luzX,luzY,-0.5f);   
      //glutSolidCube(1);    
   glPopMatrix();


   glutSwapBuffers (); 
   glutPostRedisplay();      
}


void init (void) 
{
   // selecionar cor de fundo (preto) 
   glClearColor (0.0, 0.0, 0.0, 0.0);
  
   glEnable(GL_LIGHT0);                   // habilita luz 0
	glEnable(GL_COLOR_MATERIAL);           // Utiliza cor do objeto como material
	glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);

   glLightfv(GL_LIGHT0, GL_POSITION, light0_position);

	glEnable(GL_LIGHTING);                 // Habilita luz
	glEnable(GL_DEPTH_TEST);               // Habilita Z-buffer
	glEnable(GL_CULL_FACE);                // Habilita Backface-Culling  
}



int main(int argc, char** argv)
{
   showMenu();
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE|GLUT_DEPTH|GLUT_RGB);
   glutInitWindowSize (width, height);
   glutInitWindowPosition (100, 100);
   glutCreateWindow ("hello");
   init ();   
   glutMouseFunc( mouse );
   glutKeyboardFunc(keyboard);
   glutSpecialFunc(special);      
   glutMotionFunc( motion );  
   glutReshapeFunc( reshape );     
   glutDisplayFunc(display);     
   glutIdleFunc(idle);
   glutMainLoop();    

   return 0;
}