Proyección
Ortogonal.
El tipo de proyección que hemos utilizado hasta
ahora es una proyección ortogonal. Una proyección ortogonal define un volumen
de la vista de tipo paralelepipédico tal y como se muestra en la siguiente
figura. La principal característica de esta proyección es que el tamaño de los
objetos es independiente de la distancia a la que estén del observador, por
ejemplo, dos cilindros del mismo tamaño, uno a cinco unidades y el otro a diez
unidades de distancia del observador se proyectarán con el mismo tamaño.
Para definir una proyección ortogonal en OpenGL hay
que dar los siguientes pasos:
glMatrix(GL_PROJECTION); /* Voy a manejar la matriz de
proyección */
glLoadIdentity(); /* Cargo inicialmente la identidad */
/* Y ahora defino la proyección ortogonal */
void glOrtho(izquierda, derecha, abajo, arriba, cerca,
lejos);
Si lo que deseamos es trabajar con una proyección
ortogonal 2D:
void gluOrtho2D(izquierda, derecha, abajo, arriba);
que no es más que una proyección ortogonal donde el
plan delantero está en -1 y el trasero en 1.
Proyección
Perspectiva.
La proyección ortogonal no da sensación de
profundidad porque el tamaño de los objetos no depende de su distancia al
observador. Para conseguir este efecto necesitamos definir una proyección
perspectiva. Esta proyección define un volumen de la vista que es un prisma truncado
de base rectangular, como el de la siguiente figura:
la función OpenGL que establece este tipo de
perspectiva es:
void glFrustum(izquierda, derecha, abajo, arriba, cerca,
lejos);
Este modo de definir la proyección perspectiva no es
demasiado intuitivo, es más sencillo establecerla con un esquema como el que se
muestra en la siguiente figura:
y la función OpenGL que la establece es:
void gluPerspective(fovy, aspecto, cerca, lejos);
donde fovy es el ángulo de apertura del objetivo de
la cámara, en grados, y aspecto es la relación ancho/alto de la base de la
pirámide.
Aplicandole
Transformaciones
En el
ejemplo vamos a aplicar transformaciones de rotacion y traslación. La de escalado
no la vamos a utilizar principalmente para evitar "malos hábitos"
debido a que este comando es MUY lento y el uso continuo del mismo hace
descender nuestro queridos FPS.
Para las transformaciones geométricas, OpenGL
utiliza, al igual que D3D, matrices de 4x4. Aunque al contrario que D3D, OGL no
se apoya directamente en la notación matemática y en su lugar, utiliza la
traspuesta de la matemática.
Los
comandos de traslación, rotación y escalado vienen explicados en Apendice 1:
Visualización así que aquí me limitaré a nombrarlos.
Traslación
void glTranslate{fd}(TYPE x, TYPE y, TYPE z);
Multiplica la matriz actual por una matriz de
traslación que mueve el objeto.s
Rotación
void
glRotate{fd}(TYPE angle,TYPE x, TYPE y, TYPE z);
Multiplica la matriz actual por una matriz de
rotación que rota el objeto en la dirección de las agujas del reloj sobre el
radio de origen en el punto x,y,z.
Escalado
void glScale{fd}(TYPE
x, TYPE y, TYPE z);
Multiplica la matriz
actual por una matriz que cambia el tamaño del objeto a lo largo de los ejes.
Las coordenadas
x,
y, z de cada objeto es multiplicada por los parámetros x, y, z.
C Como
dijimos anteriormente en nuestro ejemplo solamente aplicaremos las transformaciones
de rotación y traslación. Para poder mover y rotar el cuadrado, vamos a
declarar unas variables globales:
float
fRotx,fRoty;
float
fDesz=-3.0f;
Las dos primeras son los ángulos que vamos a rotar
con respecto al eje x e y respectivamente. La tercera variable corresponde con
el desplazamiento a travez del eje z (perpendicular a la pantalla).
Gráficamente sería:
Pila
de Matrices
En la función display() se encuentran las llamadas a
dos funciones de matrices
glPushMatrix() y glPopMatrix().
glTranslatef() que se utiliza para posicionar uno de
los objetos.
La función glPushMatrix() realiza una copia de la
matriz superior y la pone encima de la pila, de tal forma que las dos matrices
superiores son iguales.
La función glPopMatrix() elimina la matriz superior,
quedando en la parte superior de la pila la matriz que estaba en el momento de
llamar a la función glPushMatrix().
glGetDoublev() Con esta función se obtiene la matriz actual
de una de las pilas, a la que se indica que matriz se quiere obtener.
Viewport
Es poco probable que necesites usar el control Viewport (Vista)
directamente. Es mucho más probable que uses el control ScrolledWindow, el cual usa un Viewport.
Un control de vista permite colocar un control más
grande dentro de él de tal forma que se pueda ver una parte de él de una vez.
Usa Adjustments para
definir el área que se ve.
Un Viewport se crea con la función:
viewport = gtk.Viewport(hadjustment=None,
vadjustment=None)
|
Como se puede ver se pueden especificar los Adjustments horizontal
y vertical que el control usa cuando se crea. Creará sus propios ajustes si se
le pasa None como valor de los argumentos o simplemente no se le
pasan argumentos.
Se pueden consultar y fijar los ajustes después de
que el control se haya creado usando los siguientes cuatro métodos:
viewport.get_hadjustment()
viewport.get_vadjustment()
viewport.set_hadjustment(adjustment)
viewport.set_vadjustment(adjustment)
|
El otro método que se usa para modificar la
apariencia es:
viewport.set_shadow_type(type)
|
Los valores posibles para el parámetro type son:
SHADOW_NONE # sin sombra
SHADOW_IN # sombra hacia adentro
SHADOW_OUT # sombra hacia afuera
SHADOW_ETCHED_IN # sombra marcada hacia adentro
SHADOW_ETCHED_OUT # sombra marcada hacia fuera
|
No hay comentarios:
Publicar un comentario