Mi carro en Perspectiva
Mi carro en Perspectiva
Dibujado de un carro en OpenGL y su proyección en Perspectiva
PDF File
Jose Angel Espinoza Portillo
Tarea 5 • Graficacion • 31 Octubre 2007
PDF File
Jose Angel Espinoza Portillo
Tarea 5 • Graficacion • 31 Octubre 2007
Trabajo realizado
Se utilizaron unos códigos implementados en una tarea anterior donde ya esa declarada la estructura de datos para los nodos que dan la forma del carro y de las caras del mismo, ademas de un conjunto de funciones ya implementadas donde podemos modificar el código para utilizarlo para nuestros fines en este reporte.Archivos los archivos importantes para este reporte son
painter.cpp: Donde se encuentra la interfaz de la ventana de visualización.
quad.cpp: Es en este archivo donde se visualiza el modelo y también donde se dibujan y modifican las matrices de transformación implementadas.
Trabajo a realizar
Para que un objeto pueda tener una proyección en perspectiva hay que generar el efecto de que una cámara lo esta rodeando. Esta es una transformación que se puede efectuar en la matriz del objeto o en la matriz de proyección. Pero se elige hacer la modificación directamente en el modelo, ya que es preferible modificar el modelo que la proyección ya que tiene mas espacio en su pila de matrices y hay menos posibilidades de errores.
Para eso se utilizara un método de entrada no utilizado antes en este curso. Que es el teclado para dar comandos, se designan algunas teclas para que se mueva hacia arriba, abajo y ambos lados al igual que un zoom para determinar el acercamiento o alejamiento del objeto desde el punto de vista.
El código
Modificaciones que se tienen que hacer a el código anterior.
Para poder implementar una vista en perspectiva, se tienen que eliminar a toda relación con la visualización ortográfica empezando por las funciones glOrtho que están ubicadas por todo el archivo quad.cpp.Se declaran algunas variables las cuales definen la altura del punto de visión y el ángulo de rotación del mismo, ademas de una variable step la cual define la cantidad de moviendo que hay entre un estado y otro.
Se modifica la función keyPressEvent, la cual es la que responde a las entradas de comandos quedando como se muestra a continuación:
void Quad::keyPressEvent ( QKeyEvent * e )
{
float step = 10;
switch ( tolower(e->key()) ) {
case '+':
signo = 1;
break;
case '-':
signo = -1;
break;
case 'a':
azi -= step;
break;
case 's':
ele -= step;
break;
case 'd':
azi += step;
break;
case 'w':
ele += step;
break;
case 'z':
zoom += 1;
break;
case 'x':
zoom -= 1;
break;
}
repaint();
}
paintGL
En esta función se debe de hacer la transformación de el ángulo de visión y dibujar el objeto al final para que la transformación de perspectiva surja efecto. Para esto primero hay que hacer:
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(30,1,0.01,100);
que carga la matriz defaul a GL_PROJECTION la carga y la asigna una perspectiva.
Luego se hacen los cálculos de el punto donde estará el ojo de visión y aplicarle la transformación a el GL_MODEL con el gluLookAt de la siguiente manera.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity (); /* clear the matrix */
eye[0] = zoom *sin(azi*PI/180) * cos(ele*PI/180);
eye[1] = zoom *sin(ele*PI/180) ;
eye[2] = zoom *cos(azi*PI/180) * cos(ele*PI/180);
printf("%f %f %f\n",eye[0],eye[1],eye[2]);
gluLookAt(eye[0],eye[1],eye[2],0,0,0,0,1,0);
recordando que zoom, azi y ele están controlados por las teclas presionadas.
Esto debe de estar antes de dibujar el objeto ya que esto definirá la posición en que se dibujara el objeto en el espacio y en la pantalla.
Labels: Graficación, Tarea
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home