Es la funsión que determina dónde y como está dispuesta la cámara, cuidando la posición de la cámara no tiene nada que ver con el tipo de proyección que se haya definido.
La proyección se define sólo una vez al principio del programa regularmente, en una función inicializadora, mientras que la cámara que se mueve continuamente como al programador le interese y aun mas en 3D.
A esto no se le añade la función GL_PROYECTION sino que se le agrega el GL_MEDELVIEW.
En ese momento OpenGL se encargara de calcular las transformaciones que se aplican al mundo 3D manteniendo la camara en el origen de las coordenadas y enfocada en direccion negativa de Z para así darnos la sensación de verlo desde cierto lugar.
Para ello siempre se debe activar esta matriz antes de llamar a gluLookAt:
glMatrixMode(GL_MEDELVIEW);
La función GLTRASLATE se utiliza para mover de un punto a otro un objeto y la función GLUTAT se usa para visualizar el objeto.
No se comportan de la misma manera puesto que uno mueve el objeto y el otro mueve la cámara para visualizar el objeto.
Código a examinar:
Rotate on x
glRotatef(rotY,0.0,1.0,0.0); // Rotate on y
glRotatef(rotZ,0.0,0.0,1.0); // Rotate on z
glTranslatef(X, Y, Z); // Translates the screen left or right, // up or down or zoom in zoom out
// Draw the positive side of the lines x,y,z
glBegin(GL_LINES);
glColor3f (0.0, 1.0, 0.0); // Green for x axis
glVertex3f(0,0,0);
glVertex3f(10,0,0);
glColor3f(1.0,0.0,0.0); // Red for y axis
glVertex3f(0,0,0);
glVertex3f(0,10,0);
glColor3f(0.0,0.0,1.0); // Blue for z axis
glVertex3f(0,0,0);
glVertex3f(0,0,10);
glEnd();
// Dotted lines for the negative sides of x,y,z
glEnable(GL_LINE_STIPPLE); // Enable line stipple to use a
// dotted pattern for the lines
glLineStipple(1, 0x0101); // Dotted stipple pattern for the lines
glBegin(GL_LINES);
glColor3f (0.0, 1.0, 0.0); // Green for x axis
glVertex3f(-10,0,0);
glVertex3f(0,0,0);
glColor3f(1.0,0.0,0.0); // Red for y axis
glVertex3f(0,0,0);
glVertex3f(0,-10,0);
glColor3f(0.0,0.0,1.0); // Blue for z axis
glVertex3f(0,0,0);
glVertex3f(0,0,-10);
glEnd();
glDisable(GL_LINE_STIPPLE); // Disable the line stipple
glPopMatrix(); // Don't forget to pop the Matrix
glutSwapBuffers();
}
// This function is called whenever the window size is changed
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h); // Set the viewport
glMatrixMode (GL_PROJECTION); // Set the Matrix mode
glLoadIdentity ();
gluPerspective(75, (GLfloat) w /(GLfloat) h , 0.10, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
// This function is used for the navigation keys
void keyboard (unsigned char key, int x, int y)
{
switch (key) { // x,X,y,Y,z,Z uses the glRotatef() function
case 'x': // Rotates screen on x axis
rotX -= 0.5f;
break; case 'X': // Opposite way
rotX += 0.5f;
break; case 'y': // Rotates screen on y axis
rotY -= 0.5f;
break; case 'Y': // Opposite way
rotY += 0.5f;
break;
case 'z': // Rotates screen on z axis
rotZ -= 0.5f;
break; case 'Z': // Opposite way
rotZ += 0.5f;
break;
// j,J,k,K,l,L uses the gluLookAt function for navigation
glRotatef(rotY,0.0,1.0,0.0); // Rotate on y
glRotatef(rotZ,0.0,0.0,1.0); // Rotate on z
glTranslatef(X, Y, Z); // Translates the screen left or right, // up or down or zoom in zoom out
// Draw the positive side of the lines x,y,z
glBegin(GL_LINES);
glColor3f (0.0, 1.0, 0.0); // Green for x axis
glVertex3f(0,0,0);
glVertex3f(10,0,0);
glColor3f(1.0,0.0,0.0); // Red for y axis
glVertex3f(0,0,0);
glVertex3f(0,10,0);
glColor3f(0.0,0.0,1.0); // Blue for z axis
glVertex3f(0,0,0);
glVertex3f(0,0,10);
glEnd();
// Dotted lines for the negative sides of x,y,z
glEnable(GL_LINE_STIPPLE); // Enable line stipple to use a
// dotted pattern for the lines
glLineStipple(1, 0x0101); // Dotted stipple pattern for the lines
glBegin(GL_LINES);
glColor3f (0.0, 1.0, 0.0); // Green for x axis
glVertex3f(-10,0,0);
glVertex3f(0,0,0);
glColor3f(1.0,0.0,0.0); // Red for y axis
glVertex3f(0,0,0);
glVertex3f(0,-10,0);
glColor3f(0.0,0.0,1.0); // Blue for z axis
glVertex3f(0,0,0);
glVertex3f(0,0,-10);
glEnd();
glDisable(GL_LINE_STIPPLE); // Disable the line stipple
glPopMatrix(); // Don't forget to pop the Matrix
glutSwapBuffers();
}
// This function is called whenever the window size is changed
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h); // Set the viewport
glMatrixMode (GL_PROJECTION); // Set the Matrix mode
glLoadIdentity ();
gluPerspective(75, (GLfloat) w /(GLfloat) h , 0.10, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
// This function is used for the navigation keys
void keyboard (unsigned char key, int x, int y)
{
switch (key) { // x,X,y,Y,z,Z uses the glRotatef() function
case 'x': // Rotates screen on x axis
rotX -= 0.5f;
break; case 'X': // Opposite way
rotX += 0.5f;
break; case 'y': // Rotates screen on y axis
rotY -= 0.5f;
break; case 'Y': // Opposite way
rotY += 0.5f;
break;
case 'z': // Rotates screen on z axis
rotZ -= 0.5f;
break; case 'Z': // Opposite way
rotZ += 0.5f;
break;
// j,J,k,K,l,L uses the gluLookAt function for navigation
case 'j':
rotLx -= 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'J':
rotLx += 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break;
case 'k':
rotLy -= 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'K':
rotLy += 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'l': // It has a special case when the rotLZ becomes
// less than -15 the screen is viewed from the opposite side
// therefore this if statement below does not allow rotLz be less than -15
if(rotLz + 14 >= 0)
rotLz -= 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'L':
rotLz += 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'b': // Rotates on x axis by -90 degree
rotX -= 90.0f;
break; case 'B': // Rotates on y axis by 90 degree
rotX += 90.0f;
break; case 'n': // Rotates on y axis by -90 degree
rotY -= 90.0f;
break; case 'N': // Rotates on y axis by 90 degree
rotY += 90.0f;
break; case 'm': // Rotates on z axis by -90 degree
rotZ -= 90.0f;
break;
case 'M': // Rotates on z axis by 90 degree
rotZ += 90.0f;
break; case 'o': // Default, resets the translations vies from starting view
case 'O':
X = Y = 0.0f;
Z = 0.0f;
rotX = 0.0f;
rotY = 0.0f;
rotZ = 0.0f;
rotLx = 0.0f;
rotLy = 0.0f;
rotLz = 0.0f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(rotLx, rotLy, 15.0f + rotLz, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
break;}
glutPostRedisplay(); // Redraw the scene
}
// called on special key pressed
void specialKey(int key, int x, int y) {
// The keys below are using the gluLookAt() function for navigation
// Check which key is pressed
switch(key) {
case GLUT_KEY_LEFT : // Rotate on x axis
X -= 0.1f;
break;
case GLUT_KEY_RIGHT : // Rotate on x axis (opposite)
X += 0.1f;
break;
case GLUT_KEY_UP : // Rotate on y axis
Y += 0.1f;
break;
case GLUT_KEY_DOWN : // Rotate on y axis (opposite)
Y -= 0.1f;
break;
case GLUT_KEY_PAGE_UP: // Rotate on z axis
Z -= 0.1f;
break;
case GLUT_KEY_PAGE_DOWN: // Rotate on z axis (opposite)
Z += 0.1f;
break;
}
glutPostRedisplay(); // Redraw the scene
}
// Main entry point of the program
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // Setup display mode to
// double buffer and RGB color
glutInitWindowSize (600,600); // Set the screen size
glutCreateWindow("OpenGL 3D Navigation Program");
init ();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard); // set window's key callback
glutSpecialFunc(specialKey); // set window's to specialKey callback
glutMainLoop();
return 0;
}
rotLx -= 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'J':
rotLx += 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break;
case 'k':
rotLy -= 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'K':
rotLy += 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'l': // It has a special case when the rotLZ becomes
// less than -15 the screen is viewed from the opposite side
// therefore this if statement below does not allow rotLz be less than -15
if(rotLz + 14 >= 0)
rotLz -= 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'L':
rotLz += 0.2f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
break; case 'b': // Rotates on x axis by -90 degree
rotX -= 90.0f;
break; case 'B': // Rotates on y axis by 90 degree
rotX += 90.0f;
break; case 'n': // Rotates on y axis by -90 degree
rotY -= 90.0f;
break; case 'N': // Rotates on y axis by 90 degree
rotY += 90.0f;
break; case 'm': // Rotates on z axis by -90 degree
rotZ -= 90.0f;
break;
case 'M': // Rotates on z axis by 90 degree
rotZ += 90.0f;
break; case 'o': // Default, resets the translations vies from starting view
case 'O':
X = Y = 0.0f;
Z = 0.0f;
rotX = 0.0f;
rotY = 0.0f;
rotZ = 0.0f;
rotLx = 0.0f;
rotLy = 0.0f;
rotLz = 0.0f;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(rotLx, rotLy, 15.0f + rotLz, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
break;}
glutPostRedisplay(); // Redraw the scene
}
// called on special key pressed
void specialKey(int key, int x, int y) {
// The keys below are using the gluLookAt() function for navigation
// Check which key is pressed
switch(key) {
case GLUT_KEY_LEFT : // Rotate on x axis
X -= 0.1f;
break;
case GLUT_KEY_RIGHT : // Rotate on x axis (opposite)
X += 0.1f;
break;
case GLUT_KEY_UP : // Rotate on y axis
Y += 0.1f;
break;
case GLUT_KEY_DOWN : // Rotate on y axis (opposite)
Y -= 0.1f;
break;
case GLUT_KEY_PAGE_UP: // Rotate on z axis
Z -= 0.1f;
break;
case GLUT_KEY_PAGE_DOWN: // Rotate on z axis (opposite)
Z += 0.1f;
break;
}
glutPostRedisplay(); // Redraw the scene
}
// Main entry point of the program
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // Setup display mode to
// double buffer and RGB color
glutInitWindowSize (600,600); // Set the screen size
glutCreateWindow("OpenGL 3D Navigation Program");
init ();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard); // set window's key callback
glutSpecialFunc(specialKey); // set window's to specialKey callback
glutMainLoop();
return 0;
}
No hay comentarios:
Publicar un comentario