Proyección ortogonal
De las proyecciones que hemos manejado mayormente han sido
ortogonales. Antes que nada una proyección ortogonal es aquella que nos define
un volumen a la vista de un paralepipédo. Las características de esta proyección
es que es indispensable el tamaño de los objetos y es independiente de la
distancia a la que este el observador de la imagen.
ejemplo
Proyeccion perspectiva
Esta proyeccion
da la sensacion de profundidad porque el tamaño de los objetos no depende de la
distancia del observador, porque para conseguir este efecto se debe definir una
proyeccion perspectiva. Debido a que esta proyeccion define el volumende la
vista.
Como hemos visto en clase OpenGL proporciona funciones para controlar
la traslación, rotación y escalado. Estas tranformaciones se pueden representar
como matrices 4x4 ordenadas como vectores columna.
Las funciones que implementan las transformaciones es:
void glTranslate{fd}(TIPO x, TIPO y, TIPO z);
void glTranslatef(float x, float y, float z);
void glTranslated(double x, dluble y, double z);
void glRotate{fd}(TIPO angulo_en_grados, TIPO x, TIPO y, TIPO z);
void glScale{fd}(TIPO sx, TIPO sy, TIPO sz);
Las funciones que implementan las transformaciones es:
void glTranslate{fd}(TIPO x, TIPO y, TIPO z);
void glTranslatef(float x, float y, float z);
void glTranslated(double x, dluble y, double z);
void glRotate{fd}(TIPO angulo_en_grados, TIPO x, TIPO y, TIPO z);
void glScale{fd}(TIPO sx, TIPO sy, TIPO sz);
Ejemplo de matriz Ejemplo
de matriz de rotación
De traslación
|
|
4. pila de matrices en opengl lea y resuma el siguiente enlace
las
funciones de traslación aplicados en las imágenes provocan la multiplicación de
la matriz actual de la imagen por una matriz de traslación creada con los argumentos
que se le pasan, por lo que las continuas llamadas a la función display() provocan la creación de constantes multiplicaciones de la matriz
actual con el efecto que se observa de incrementar la traslación.
Por ello
para solucionar el problema OpenGL llega a dispoder de las pilas de matrices
las cuales permiten el almacenamiento y la recuperación de las matrices
anteriormente usadas o manejadas. Antes que nada una pila es un almacén con
funcionamiento FIFO, el último en entrar es el primero en salir, por lo que
suele comparar a una pila de platos en la que sólo se puede dejar uno encima de
la pila o coger el superior que es el último depositado.
La pila de
matrices tiene el mismo funcionamiento sustituyendo los platos por matrices. La
matriz superior de la pila es sobre la que se aplican las distintas
transformaciones, multiplicándola por la matriz que generan las disntintas
funciones.
En el código que a continuación se muestra, se encuentra
declarando dos funciones de matrices las cuales se tratan de glPushMatrix()
y glPopMatrix().
La función
glPushMatrix() lo que hace es una copia de la matriz superior y la pone
encima de la pila, de tal forma que las dos matrices superiores son iguales. Al
llamar a la función glPushMatrix() se duplica la matriz superior. Las
siguientes transformaciones que se realizan se aplican sólo a la matriz
superior de la pila, quedando la anterior con los valores que tenía en el
momento de llamar a la función glPushMatrix().
La función
glPopMatrix() provoca la eliminación de la matriz superior, dejando asi
en la parte superior de la pila la matriz que estaba en el momento de llamar a
la función GlPushMatrix().
void display(void) {
...
// glPushMatrix();
...
glTranslatef(0.0, 0.0, .5);
...
//
glPopMatrix();
glutSwapBuffers();
}
Al
ejecutar de nuevo la aplicación, primeramente tiene el mismo aspecto que sin comentar
las llamadas, pero si obligamos a que se llame varias veces a la función display().
La razón de este movimiento es que en la función display está incluida una
llamada a glTranslatef() que se utiliza para posicionar uno de los
objetos.
No hay comentarios:
Publicar un comentario