Una transformación geométrica, o simplemente una transformación, es una aplicación que hace corresponder a cada punto del plano otro punto del plano. Como consecuencia, las figuras se transforman en otras figuras. Las transformaciones más usuales son las traslaciones, rotaciones, simetrías y las homotecias. Todas ellas mantienen la forma de las figuras, pero pueden disminuir el tamaño y cambiar la figura de posición. OpenGL proporciona funciones para controlar la traslación, rotación y escalado. Estas transformaciones se representan como matrices 4x4 ordenadas como vectores columna.
Las matrices de traslación y escalado se pueden apreciar en el siguiente vínculo: Matrices
2. Escriba los comandos que en OpenGL permiten aplicar transformaciones geométricas, las variantes de dichos comandos y describa sus parámetros.
Las funciones utilizadas para transformar son las siguientes,
glTranslatef(1.0f, 1.0f, 1.0f);
glRotatef(45.0f, 1.0f, 0.0f, 0.0f); los parámetros utilizados son ángulo, coordenada en X, en Y, y en Z.
glScalef(2.0f, 2.0f, 2.0f); Aquí solamente se utilizan las tres coordenadas.
3. Describa en OpenGL qué son las matrices GL_MODELVIEW y GL_PROJECTION. ¿Para qué sirven? ¿Cómo se puede intercambiar entre una y otra? ¿Cuál es la matriz activa por defecto? ¿Para que sirve el comando glLoadIdentity()?
GL_PROJECTION Es la matriz de proyección, afecta a las vistas o las perspectivas. La matriz con las transformaciones que realizan la proyección de la escena de 3 a 2 dimensiones.
4. ¿Para qué son los comandos glPushMatrix() y glPopMatrix()? Describa su uso a través de un ejemplo en código.
glPushMatrix() realiza la operación de Push en esa pila de matrices, duplicando la matriz que se encuentra actualmente en el tope.
Un ejemplo de código con estas instrucciones es el siguiente:
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glGetDoublev (GL_MODELVIEW_MATRIX, mModel);
glPopMatrix();
5. ¿Para qué sirven los comandos glBegin() y glEnd()? Describa su uso, sus parámetros y ejemplifique a través de una pieza de código.
Estas funciones se emplean para delimitar los vértices de un primitivo o de un grupo de primitivos parecidos. Con la instrucción glBegin se debe elegir el tipo de objeto que se va a crear. En este caso vamos a crear cuadrados, así que se ejemplifica con $GL_QUADS.
glBegin $GL_QUADS
glVertex3 0,0,0
glVertex3 1,0,0
glVertex3 1,1,0
glVertex3 0,1,0
;Ahora finalizamos el cuadrado con el comando glEnd.
glEnd
6. ¿Qué es modelado geométrico? Describa los tipos de modelado geométrico que existen.
El modelado geométrico describe la forma de un objeto físico o matemático utilizando conceptos geométricos. Estos modelos pueden ser construidos de objetos de cualquier dimensión en cualquier espacio geométrico.
7. Construya código para dibujar un cubo (revisar en la clase de teoría), y a partir de éste modele jerárquicamente el humanoide de la ilustración y escriba el programa que lo dibuja. Las medidas corren por su cuenta.
A continuación incluyo el código basado en lo visto en teoría con ayuda de unos tutoriales encontrados en internet. Se toma el pregrama base cube.c y se modifica. Se incluye sólo el código de la función que crea al humanoide.
void cubo(void)
{
glBegin(GL_POLYGON);
glVertex3f(0.5,0.5,0.5);//v1
glVertex3f(-0.5,0.5,0.5);//v2
glVertex3f(-0.5,-0.5,0.5);//v3
glVertex3f(0.5,-0.5,0.5);//v4
glEnd();
glBegin(GL_POLYGON);
glVertex3f(-0.5,0.5,-0.5);//v5
glVertex3f( 0.5,0.5,-0.5);//v6
glVertex3f(0.5,-0.5,-0.5);//v7
glVertex3f(-0.5,-0.5,-0.5);//v8
glEnd();
glBegin(GL_POLYGON);
glVertex3f(-0.5,0.5,0.5);//v2
glVertex3f(-0.5,0.5,-0.5);//v5
glVertex3f(-0.5,-0.5,-0.5);//v8
glVertex3f(-0.5,-0.5,0.5);//v3
glEnd();
glBegin(GL_POLYGON);
glVertex3f(0.5,0.5,0.5);//v1
glVertex3f(0.5,-0.5,0.5);//v4
glVertex3f( 0.5,-0.5,-0.5);//v7
glVertex3f(0.5,0.5,-0.5);//v6
glEnd();
glBegin(GL_POLYGON);
glVertex3f(-0.5,0.5,-0.5);//v5
glVertex3f(-0.5,0.5,0.5);//v2
glVertex3f(0.5,0.5,0.5);//v1
glVertex3f( 0.5,0.5,-0.5);//v6
glEnd();
glBegin(GL_POLYGON);
glVertex3f(0.5,-0.5,-0.5);//v7
glVertex3f(-0.5,-0.5,-0.5);//v8
glVertex3f(-0.5,-0.5,0.5);//v3
glVertex3f(0.5,-0.5,0.5);//v4
glEnd();
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (0.0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity (); /* clear the matrix */
gluLookAt ( 0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glPushMatrix();//torzo
glScalef(0.80,2.0,0.5);
cubo();
glPushMatrix(); //head
glTranslatef(0.0,0.5,0.0);
glScalef(0.6,0.6,0.5);
cubo();
glPopMatrix();
glPushMatrix(); //antebrazo derecho
glTranslatef(0.8,0.4,0.0);
glScalef(0.7,0.2,0.5);
cubo();
glPushMatrix(); //brazo derecho
glTranslatef(1.0,0.0,0.0);
glScalef(1.0,1.5 ,0.5);
cubo();
glPushMatrix();
glTranslatef(0.8,0.0,0.0);
glScalef(0.8,0.6,0.5);
cubo();
glPopMatrix();
glPopMatrix();
glPopMatrix();//fin brazo derecho
glPushMatrix();
glTranslatef(-0.8,0.4,0.0);
glScalef(0.7,0.2,0.5);
cubo();
glPushMatrix();//brazo izquierdo
glTranslatef(-1.0,0.0,0.0);
glScalef(1.0,1.5,0.5);
cubo();
glPushMatrix();
glTranslatef(-0.8,0.0,0.0);
glScalef( 0.8,0.6,0.5);
cubo();
glPopMatrix();
glPopMatrix();
glPopMatrix();//fin brazo Izquierdo
glPushMatrix();//pie derecho
glTranslatef(0.35,-0.7,0.0);
glScalef(0.3,0.4,0.5);
cubo();
glPushMatrix();
glTranslatef(0.0,-1.0,0.0);
glScalef(1.5,1.0,0.5);
cubo();
glPushMatrix();
glTranslatef(0.5,-0.6,0.0);
glScalef(2.0,0.4,0.5);
cubo();
glPopMatrix();
glPopMatrix();
glPopMatrix();//fin del pie derecho
glPushMatrix();//pie izquierdo
glTranslatef(-0.35,-0.7,0.0);
glScalef(0.3,0.4,0.5);
cubo();
glPushMatrix();
glTranslatef(0.0,-1.0,0.0);
glScalef(1.5,1.0,0.5);
cubo();
glPushMatrix();
glTranslatef(- 0.5,-0.6,0.0);
glScalef(2.0,0.4,0.5);
cubo();
glPopMatrix();
glPopMatrix();
glPopMatrix();//fin del pie izquierdo
glPopMatrix();
glFlush ();
}
8. ¿Para qué sirven los comandos glClearColor() y glClear()? Descríbalos su funcionamiento, sus parámetros y ejemplifique a través de una pieza de código.
glClearColor() especifica los valores alpha rojo, verde y azul utilizados por glClear() para limpiar el búffer de colores. Los valores especificados por glClearColor() se limitan al rango [0, 1]. Utiliza la siguiente connotación: glClearColor(rojo, verde, azul, alpha)
Sus argumentos son: GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT, GL_STENCIL_BUFFER_BIT.
9. Describa los comandos glutInit(), glutInit(), glutInitDisplayMode (), glutInitWindowSize (), glutInitWindowPosition (), glutCreateWindow (), glutDisplayFunc(), glutReshapeFunc(), glutKeyboardFunc() y glutMainLoop(). Describa su funcionamiento, uso y parámetros.
glutInit() Se utiliza para inicializar la librería de GLUT. Se utiliza de la siguiente manera: void glutInit(int *argcp, char **argv); donde argcp es un apuntador a la variable sin modificar argc desde main. Argv es el valor de la variable sin modificar desde main, esta información será actualizada ya que esta función extrae cualquier opción de comando entendida por la librería de GLUT.
glutInitWindowPosition ()La ventana creada por glutCreateWindow, al utilizar esta función, le será indicado que sea creada en la posición especificada. Los parámetros son: void glutInitWindowPosition(int x, int y); es decir, int x – coordenada en x e int y – coordenada en y.
glutKeyboardFunc() Especifica la rutina de servicio a ejecutar cada vez que se pulsa una de las teclas correspondiente a un código ASCII. Su uso es: void glutKeyboardFunc(void (*function)(unsigned char key, int x, int y)); El argumento function es un puntero a la función que actúa como rutina de servicio. Esta función espera tres parámetros, el carácter de la tecla pulsada y la posición del ratón sobre la ventana en coordenadas del mundo real.
glutMainLoop() entra al evento de procesamiento del GLUT en un loop infinito, este comando debe ser utilizado por lo menos una vez cada vez que se quiera utilizar GLUT, una vez llamada nunca se saldrá del proceso, pero llamara todas las rutinas necesarias para el uso de GLUT, se usa de la siguiente manera: void glutMainLoop(void);
10. ¿Qué es un Function Callback en GLUT?
Es la respuesta que tiene el programa a cualquier estímulo por parte del hardware, se puede hacer la analogía con las interrupciones de un programa ocasionadas por eventos como la acción de una tecla o del mouse. Una Function Callback es una que no se invoca explícitamente por el programador; en vez de ello, la responsabilidad de su invocación se delega a otra función que recibe la dirección del la función Callback.
Fuentes de Consulta
http://graficos.uji.es/grafica/NuevasPracticas/Practica3/Transformaciones.html
http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rotate.html
http://en.wikipedia.org/wiki/Geometric_modeling
http://www.tecnun.es/asignaturas/grafcomp/OpenGL/practica/capitulo3.pdf
y otras que por espacio no se incluyen.

No hay comentarios.:
Publicar un comentario