En este tema, aprenderemos sobre las coordenadas y las transformaciones en OpenGL. Estos conceptos son fundamentales para manipular y visualizar objetos en un espacio 3D. Vamos a cubrir los siguientes puntos:

  1. Sistemas de Coordenadas en OpenGL
  2. Transformaciones Básicas: Traslación, Rotación y Escalado
  3. Matrices de Transformación
  4. Aplicación de Transformaciones en OpenGL
  5. Ejercicios Prácticos

  1. Sistemas de Coordenadas en OpenGL

OpenGL utiliza varios sistemas de coordenadas para representar y transformar objetos en el espacio 3D. Los más comunes son:

  • Coordenadas del Objeto (Object Coordinates): Son las coordenadas locales del objeto.
  • Coordenadas del Mundo (World Coordinates): Son las coordenadas globales en el espacio 3D.
  • Coordenadas de Vista (View Coordinates): Son las coordenadas desde la perspectiva de la cámara.
  • Coordenadas de Recorte (Clip Coordinates): Son las coordenadas después de aplicar la proyección.
  • Coordenadas Normalizadas del Dispositivo (Normalized Device Coordinates - NDC): Son las coordenadas después de la división de perspectiva.
  • Coordenadas de Pantalla (Screen Coordinates): Son las coordenadas finales en la pantalla.

Tabla de Sistemas de Coordenadas

Sistema de Coordenadas Descripción
Object Coordinates Coordenadas locales del objeto.
World Coordinates Coordenadas globales en el espacio 3D.
View Coordinates Coordenadas desde la perspectiva de la cámara.
Clip Coordinates Coordenadas después de aplicar la proyección.
NDC Coordenadas después de la división de perspectiva.
Screen Coordinates Coordenadas finales en la pantalla.

  1. Transformaciones Básicas: Traslación, Rotación y Escalado

Las transformaciones son operaciones que nos permiten mover, rotar y escalar objetos en el espacio 3D. Las transformaciones básicas son:

  • Traslación (Translation): Mueve un objeto de un lugar a otro.
  • Rotación (Rotation): Gira un objeto alrededor de un eje.
  • Escalado (Scaling): Cambia el tamaño de un objeto.

Ejemplos de Transformaciones

Traslación

glm::mat4 model = glm::mat4(1.0f); // Matriz de identidad
model = glm::translate(model, glm::vec3(1.0f, 0.0f, 0.0f)); // Trasladar 1 unidad en el eje X

Rotación

glm::mat4 model = glm::mat4(1.0f); // Matriz de identidad
model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f)); // Rotar 90 grados alrededor del eje Z

Escalado

glm::mat4 model = glm::mat4(1.0f); // Matriz de identidad
model = glm::scale(model, glm::vec3(0.5f, 0.5f, 0.5f)); // Escalar a la mitad en todos los ejes

  1. Matrices de Transformación

Las transformaciones en OpenGL se representan mediante matrices 4x4. Las matrices de transformación se combinan para formar una única matriz de modelo (model matrix) que se aplica a los vértices del objeto.

Matriz de Traslación

\[ \begin{bmatrix} 1 & 0 & 0 & x
0 & 1 & 0 & y
0 & 0 & 1 & z
0 & 0 & 0 & 1 \end{bmatrix} \]

Matriz de Rotación (alrededor del eje Z)

\[ \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 & 0
\sin(\theta) & \cos(\theta) & 0 & 0
0 & 0 & 1 & 0
0 & 0 & 0 & 1 \end{bmatrix} \]

Matriz de Escalado

\[ \begin{bmatrix} sx & 0 & 0 & 0
0 & sy & 0 & 0
0 & 0 & sz & 0
0 & 0 & 0 & 1 \end{bmatrix} \]

  1. Aplicación de Transformaciones en OpenGL

Para aplicar transformaciones en OpenGL, utilizamos la biblioteca GLM (OpenGL Mathematics). GLM proporciona funciones para crear y manipular matrices de transformación.

Ejemplo Completo

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

// Crear una matriz de modelo
glm::mat4 model = glm::mat4(1.0f);

// Aplicar traslación
model = glm::translate(model, glm::vec3(1.0f, 0.0f, 0.0f));

// Aplicar rotación
model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));

// Aplicar escalado
model = glm::scale(model, glm::vec3(0.5f, 0.5f, 0.5f));

// Pasar la matriz de modelo al shader
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));

  1. Ejercicios Prácticos

Ejercicio 1: Trasladar un Cubo

Instrucciones:

  1. Crea un cubo en OpenGL.
  2. Traslada el cubo 2 unidades en el eje Y.

Solución:

glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(0.0f, 2.0f, 0.0f));
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));

Ejercicio 2: Rotar un Triángulo

Instrucciones:

  1. Crea un triángulo en OpenGL.
  2. Rota el triángulo 45 grados alrededor del eje X.

Solución:

glm::mat4 model = glm::mat4(1.0f);
model = glm::rotate(model, glm::radians(45.0f), glm::vec3(1.0f, 0.0f, 0.0f));
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));

Ejercicio 3: Escalar un Cuadrado

Instrucciones:

  1. Crea un cuadrado en OpenGL.
  2. Escala el cuadrado al doble de su tamaño original.

Solución:

glm::mat4 model = glm::mat4(1.0f);
model = glm::scale(model, glm::vec3(2.0f, 2.0f, 2.0f));
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));

Conclusión

En esta sección, hemos aprendido sobre los diferentes sistemas de coordenadas en OpenGL y cómo aplicar transformaciones básicas como traslación, rotación y escalado utilizando matrices de transformación. Estos conceptos son esenciales para manipular y visualizar objetos en un espacio 3D. En el próximo tema, exploraremos el coloreado y sombreado en OpenGL para darle vida a nuestros objetos.

© Copyright 2024. Todos los derechos reservados