lunes, 12 de marzo de 2012


Proyeccion 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 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