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 siguiente
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. |
3. 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 una 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. 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. 4.Transformaciones geométricas en OpenGL. |
OpenGL proporciona funciones para controlar la traslación,
rotación y escalado. Estas tranformaciones se
representan como matrices 4x4 ordenadas como vectores columna.
La familia de 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); |
Escalado
Traslación
|
Rotación
|
Observa que la traslación modifica el último
vector columna,miestras que el escalado y las rotaciones comparten los
elementos de la submatriz 3x3 superior izquierda.
|
Has de tener en cuenta que las tranformaciones no
son conmutativas entre sí, es decir, el resultado no es el mismo si sobre un
objeto efectúas una rotación y luego una traslación, que si efectúas primero
una traslación y luego una rotación. Es más, en general las rotaciones
tampoco son conmutativas entre si. El orden de aplicación de las
transformaciones es muy importante.
|
Otro detalle que has de tener muy en cuenta es el
orden de aplicación de las transformaciones en OpenGL. Observa el siguiente
fragmento de código:
glTranslatef(1.0f, 1.0f, 1.0f); glRotatef(45.0f, 1.0f, 0.0f, 0.0f); glScalef(2.0f, 2.0f, 2.0f); objeto(); En este fragmento, la transformación que primero se aplica al objeto es el escalado, luego la rotación y por último la traslación. En este ejemplo, las matrices se aplican en el siguiente orden T R S (objeto), y la matriz resultante se almacena en la matriz modelo-vista. La regla general es que la transformación que primero se aplica es la más cercana al objeto. |
No hay comentarios:
Publicar un comentario