#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
float x,y,z;
int theta=0;
void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
   x=0;y=0;z=5.0;
}

void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();             /* clear the matrix */
           /* viewing transformation  */
   float newx = sin ((float)theta/180.0f*3.14);
   float newy = cos ((float)theta/180.0f*3.14);
   gluLookAt (x, y, z, x, 0.0, 0.0, newx, newy, 0.0);
   glScalef (1.0, 2.0, 1.0);      /* modeling transformation */ 
   glutWireCube (1.0);
   glFlush ();
}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
//  gluPerspective(60.0, 1.0, near, far);
//glViewport (x, y, 400, 200);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   //gluPerspective(60.0, 1.0, 1.5, 20.0);
   glFrustum (-0.5, 0.5, -1.0, 1.0, 1.5, 5.0);
   glMatrixMode (GL_MODELVIEW);
}
void keyboard(unsigned char key, int r, int t)
{
   
switch (key) {

case 'w':
z+=0.1;      glutPostRedisplay();
break;
case 's':
z-=1.1; glutPostRedisplay();
break;
case 'a':
x+=0.4;      glutPostRedisplay();
break;
case 'd':
x-=0.4; glutPostRedisplay();
break;

case 'x':
theta-=1; glutPostRedisplay();
break;

case 'z':
theta+=1; glutPostRedisplay();
break;
case 27:

break;
default:
break;
}
}
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
    
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}

