Clase 4 — Texto en OpenGL 2D y Transformaciones 3D
Resumen Ejecutivo
En esta sesión se presentó la actividad individual del curso (diagrama de iconos con surtidores de gasolinera proporcionales a datos reales) y se explicó cómo escribir texto bitmap en OpenGL, incluyendo sus limitaciones frente a transformaciones. Además, se introdujeron las transformaciones geométricas en 3D (traslación, escalado y rotación), extendiendo los conceptos ya vistos en 2D al incorporar el eje Z y las coordenadas homogéneas de cuatro componentes.
Conceptos Clave
- Texto bitmap en OpenGL: Método sencillo para dibujar texto usando mapas de bits; no es escalable ni rotable. ⚠️ EXAMEN
- Coordenadas homogéneas en 3D: Se añade una cuarta coordenada (\(w\)) al vector \((x, y, z, w)\) para que todas las transformaciones sean multiplicaciones de matrices. ⚠️ EXAMEN
- Sistema de coordenadas de mano derecha: OpenGL usa este sistema, donde el eje Z positivo sale hacia el observador. ⚠️ EXAMEN
- Traslación colateral por escalado: Si un objeto no pasa por el origen, el escalado produce un desplazamiento no deseado; se resuelve trasladando al origen, escalando y deshaciendo la traslación. ⚠️ EXAMEN
Desarrollo del Temario
1. Escritura de texto en OpenGL (bitmap)
OpenGL no fue diseñado para renderizar texto. El método más sencillo utiliza fuentes bitmap mediante la función glutBitmapCharacter.
La función drawText(text, x, y, font) recibe:
1. text — cadena a dibujar.
2. x, y — posición de inicio en coordenadas del mundo.
3. font — fuente bitmap (e.g. GLUT_BITMAP_HELVETICA_18).
Internamente:
- glRasterPos2f(x, y) posiciona el cursor de rasterización.
- Un bucle recorre cada carácter y llama a glutBitmapCharacter(font, char).
Las transformaciones (traslación, escalado, rotación) solo afectan al punto de inicio del texto, NO al texto en sí. ⚠️ EXAMEN
Ejemplo (traslación): Si se aplica
glTranslatef(15, 0, 0)antes dedrawText, el texto comienza 15 unidades a la derecha, pero su tamaño de letra permanece idéntico.Ejemplo (escalado): Si se aplica
glScalef(2, 2, 1)y la posición X del texto es 0, la coordenada X no cambia (\(0 \times 2 = 0\)), pero las posiciones Y se duplican, separando más las líneas. El tamaño de la fuente no cambia.Ejemplo (rotación): Si se aplica
glRotatef(30, 0, 0, 1), cada punto de inicio de texto rota 30° alrededor del origen. El texto en \((0,0)\) no se mueve; el texto en \((0, 20)\) se desplaza según la rotación del punto, pero las letras siguen horizontales.
2. Coordenadas homogéneas en 3D
En 2D, la coordenada homogénea era la tercera componente: \((x, y, w)\). En 3D, se extiende a cuatro componentes:
El propósito es el mismo: convertir todas las transformaciones (incluida la traslación) en productos de matrices, eliminando las sumas y logrando homogeneidad operacional para mayor eficiencia del pipeline gráfico. ⚠️ EXAMEN
3. Sistemas de coordenadas: mano derecha vs. mano izquierda
| Característica | Mano derecha | Mano izquierda |
|---|---|---|
| Eje Z positivo | Sale de la pantalla (hacia el observador) | Entra en la pantalla |
| Usado por | OpenGL | DirectX (Microsoft) |
| Regla mnemotécnica | Pulgar = +X, índice = +Y, corazón apunta hacia ti | Pulgar = +X, índice = +Y, corazón apunta lejos de ti |
4. Traslación en 3D
Matriz de traslación 3D (coordenadas homogéneas):
La inversa se obtiene negando los factores: \(T^{-1} = T(-t_x, -t_y, -t_z)\).
Función OpenGL: glTranslatef(tx, ty, tz) (o glTranslated para double).
5. Escalado en 3D
Matriz de escalado 3D:
La inversa: \(S^{-1} = S(1/s_x, 1/s_y, 1/s_z)\).
Escalado de objetos que no pasan por el origen — secuencia para evitar traslación colateral: ⚠️ EXAMEN 1. Trasladar el objeto al origen. 2. Aplicar el escalado. 3. Deshacer la traslación (devolver a posición original).
6. Rotación en 3D
En 2D, la rotación era siempre alrededor de un punto (equivalente a rotar alrededor del eje Z con vector director \((0,0,1)\)).
En 3D, existen infinitos ejes de rotación (cualquier recta en el espacio). Se define mediante: - Ángulo \(\theta\) de rotación. - Vector director \((v_x, v_y, v_z)\) del eje de rotación.
Función OpenGL: glRotatef(angle, vx, vy, vz).
Ejemplo:
glRotatef(30, 0, 0, 1)rota 30° alrededor del eje Z. Es lo que usábamos en 2D con el vector \((0,0,1)\).
Preguntas de Autoevaluación
-
¿Por qué el texto dibujado con
glutBitmapCharacterno cambia de tamaño al aplicarglScalef? ¿Qué sí se ve afectado por las transformaciones? -
¿Qué problema introduce la coordenada homogénea y por qué es necesaria? ¿Cuántas componentes tiene un punto en coordenadas homogéneas 3D?
-
¿Cuál es la diferencia entre un sistema de coordenadas de mano derecha y uno de mano izquierda? ¿Cuál usa OpenGL?
-
Si tienes un objeto centrado en \((5, 3, 2)\) y quieres escalarlo al doble sin que se desplace, ¿qué secuencia de transformaciones debes aplicar?
-
¿Por qué en 3D la rotación es más compleja que en 2D? ¿Qué parámetros necesita
glRotatef? -
Dado
glRotatef(45, 1, 0, 0), ¿alrededor de qué eje se produce la rotación?
Guía generada automáticamente a partir de transcripción con faster-whisper + Claude Opus.