Ventanas GLUT
El primer paso para empezar en OpenGL es una “simple” ventana, En realidad es mas que una ventana, obviamente la diferencia esta en lo que queremos hacer (3D). Las ventanas en OpenGL, al igual que otras ventanas cargan componentes, eventos y propiedades, sin embargo para trabajar con objetos en 3D se necesitan mas requerimientos, los cuales brinda la librería GLUT de OpenGL. Antes de comenzar sugerimos ver el tutorial IDE para OpenGL. Empecemos:
Primero se deben incluir las librerías necesarias:
#include
#include #Libreria GLUT
#include #Libreria de entrada y salida de Datos
El main o el método principal:
int main(int argc, char** argv) {
cout << "\nVersión de prueba";
glutInit(&argc, argv);
int ancho = glutGet(GLUT_SCREEN_WIDTH) / 2;
int alto = glutGet(GLUT_SCREEN_HEIGHT) / 2;
glutInitWindowPosition(alto, ancho);
glutInitWindowSize(500, 500);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("GLUT WINDOWS");
glutReshapeFunc(dimensionar); //función secundaria de visualización
glutDisplayFunc(renderizar); //función secundaria de renderizado
glutMainLoop(); //bucle infinito del juego
return 0;
}
Funciones secundarias:
void dimensionar(GLsizei width, GLsizei height) {
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, (GLfloat) width / (GLfloat) height, 0.01, 20);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void dibujarCubo(){
glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.5, 0.5, 0.5);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(-0.5, -0.5, 0.5);
glEnd();
}
void renderizar() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glLoadIdentity();
glTranslatef(0.0, 0.0, -10);
dibujarCubo();
glFlush();
glutSwapBuffers();
}
EXPLICACIÓN
Método main
glutInit(&argc, argv);
Inicialización de OpenGL, recibe como parámetros un puntero desde la función al entero argc del main y de char argv. Sino agregamos esta linea nada funcionaria
int ancho = glutGet(GLUT_SCREEN_WIDTH) / 2;
int alto = glutGet(GLUT_SCREEN_HEIGHT) / 2;
glutInitWindowPosition(alto, ancho);
Extraemos el ancho y el alto del sistema que son recibidos por la función glutInitWindowPosition
glutInitWindowSize(500, 500);
Tamaño de inicial de la ventana
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGB);
Esta función es importante, en ella establecemos el modo de la ventana, en este caso especificamos que percibe profundidad, tiene un buffer simple y permite paleta de colores RGB. Los modos son una combinación de parámetros booleanos, estos valores se encuentran predefinidos en la librería de GLUT. Los parámetros especifican el modo del color, el tipo y numero de buffers. Las constantes predefinidas son:
- GLUT_RGBA o GLUT_RGB – Paleta de colores
- GLUT_INDEX - Selecciona el modo del index de colores
- La Ventana puede tener un buffer simple o doble. Las constantes predefinidas son:
- GLUT_SINGLE - buffer simple
- GLUT_DOUBLE - buffer doble, requerido para suavizar animaciones
Puedes especificar si deseas que una ventana en particular tiene cierta cantidad de buffers. Los parámetros mas comunes son:
- GLUT_ACCUM - Acumulación de buffers
- GLUT_STENCIL - buffer plantilla
- GLUT_DEPTH - profundidad de buffer
glutCreateWindow("GLUT WINDOWS");
Esta función crea (no muestra) la ventana con nuestras anteriores especificaciones, recibe como parámetro el titulo de la ventana.
Método renderizar
glutDisplayFunc(renderizar);
Esta función permite renderizar la escena que deseamos.
void renderizar() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glLoadIdentity();
glTranslatef(0.0, 0.0, -10);
dibujarCubo();
glFlush();
glutSwapBuffers();
}
Explicación
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Limpia los el buffer de color y profundidad, al hacer esto nos aseguramos que no queden rastros indeseados de renderizados anteriores.
glEnable(GL_DEPTH_TEST);
sino agregamos esta funcion OpenGL no detectara cuando un objeto esta detrás de otro y el renderizado se realizara en el orden de dibujado, en tal caso un objeto que esta detrás de otro podría verse adelante.
glLoadIdentity();
Cargamos la matriz de identidad encargada de nuestros objetos en el escenario. Con ella podemos modificar la escena.
glTranslatef(0.0, 0.0, -10);
Nos permite alejarnos o acercarnos a la escena.
dibujarCubo();
Implementa la secuencia de dibujado, osea lo que queremos mostrar escena
Método dibujarCubo
Al dibujar un objeto primero debemos especificar que tipo de objeto es. Luego le damos un color y asignamos la posición de cada vértice en el espacio 3D
void dibujarCubo(){
glBegin(GL_QUADS); //dibujar un cuadro
glColor3f(1.0f, 0.0f, 0.0f);//color RGB (tonalidades), f = float
glVertex3f(-0.5, 0.5, 0.5); //vertice (x,y,z)
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(-0.5, -0.5, 0.5);
glEnd(); //terminamos el cuadro
}
La función recibe como parámetro el ancho y alto de nuestra ventana (si te preguntas por que los parametros de la función nunca son ingresados es porque OpenGL los obtiene automáticamente)}
Método dimensionar
Es necesario especificar el tamaño y la forma de nuestro volumen de
visualización. El volumen de visualización es aquel volumen cuyo contenido es el que
representaremos en pantalla . Sin este evento nuestra figura se deformaría al no tener una base de visualización, intenta cambiar el tamaño de tu ventana sin este evento y te darás cuenta del efecto que provoca.
glutReshapeFunc(dimensionar);
void dimensionar(GLsizei width, GLsizei height) {
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, (GLfloat) width / (GLfloat) height, 0.01, 20);
// Restaurar a la matriz del Modelo (escena)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
Explicación
glViewport(0, 0, width, height);
Esta función define la porción de ventana donde puede dibujar
glMatrixMode(GL_PROJECTION);
Especifica la matriz actual. En OpenGL las operaciones de rotación, translación, escalado,
etc. se realizan a través de matrices de transformación. Dependiendo de lo que estemos
tratando, hay tres tipos de matriz (que son los tres posibles flags que puede llevar de
parámetro la función): matriz de proyección (GL_PROJECTION), matriz de modelo
(GL_MODELVIEW) y matriz de textura (GL_TEXTURE). Con esta función indicamos
a cual de estas tres se deben afectar las operaciones. Concretamente, GL_PROJECTION
afecta a las vistas o perspectivas o proyecciones. Esta proyección define el volumen de visualización y establece los planos de trabajo. A efectos prácticos, esta translación especifica cómo se traslada una escena finalizada a la imagen final de la pantalla. Los dos tipos de proyección más utilizados son la ortográfica y la perspectiva.
gluPerspective(45, (GLfloat) width / (GLfloat) height, 0.01, 20);
Los parámetros de gluPerspective son el ángulo para el campo de visión en sentido vertical, el aspecto es la relación entre la altura y la anchura (centrado) y las distancias de los planos
Comentarios
Publicar un comentario