En aquest tema, aprendrem sobre les coordenades i les transformacions en OpenGL. Aquestes són conceptes fonamentals per a la renderització de gràfics 3D. Entendre com funcionen les coordenades i les transformacions ens permetrà manipular objectes en l'espai 3D de manera efectiva.

Índex

Sistema de Coordenades

Coordenades del Món

Les coordenades del món defineixen la posició dels objectes en l'espai 3D global. Aquest sistema de coordenades és absolut i no canvia.

Coordenades de Vista

Les coordenades de vista (o coordenades de càmera) són les coordenades des de la perspectiva de la càmera. Això implica transformar les coordenades del món perquè la càmera es trobi en l'origen.

Coordenades de Clip

Les coordenades de clip són el resultat de transformar les coordenades de vista mitjançant la matriu de projecció. Aquestes coordenades es troben en un espai normalitzat on els valors x, y i z estan entre -1 i 1.

Coordenades de Dispositiu Normalitzades

Després de la divisió per la component w, les coordenades de clip es converteixen en coordenades de dispositiu normalitzades (NDC). Aquestes coordenades es mapegen a l'espai de la finestra.

Coordenades de la Finestra

Finalment, les coordenades de la finestra són les coordenades 2D en píxels que es mostren a la pantalla.

Transformacions Bàsiques

Translació

La translació desplaça un objecte d'una posició a una altra en l'espai 3D.

glm::mat4 translation = glm::translate(glm::mat4(1.0f), glm::vec3(x, y, z));

Rotació

La rotació gira un objecte al voltant d'un eix especificat.

glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), glm::radians(angle), glm::vec3(x, y, z));

Escalat

L'escalat canvia la mida d'un objecte.

glm::mat4 scale = glm::scale(glm::mat4(1.0f), glm::vec3(x, y, z));

Matrius de Transformació

Les transformacions es representen mitjançant matrius 4x4. Aquestes matrius es poden combinar per aplicar múltiples transformacions a un objecte.

Matriu de Translació

glm::mat4 translation = glm::mat4(1.0f);
translation = glm::translate(translation, glm::vec3(x, y, z));

Matriu de Rotació

glm::mat4 rotation = glm::mat4(1.0f);
rotation = glm::rotate(rotation, glm::radians(angle), glm::vec3(x, y, z));

Matriu d'Escalat

glm::mat4 scale = glm::mat4(1.0f);
scale = glm::scale(scale, glm::vec3(x, y, z));

Combinació de Matrius

Les matrius es poden combinar multiplicant-les. L'ordre de multiplicació és important.

glm::mat4 model = translation * rotation * scale;

Aplicació de Transformacions en OpenGL

Configuració de la Matriu de Model

La matriu de model transforma les coordenades locals d'un objecte a coordenades del món.

glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(x, y, z));
model = glm::rotate(model, glm::radians(angle), glm::vec3(x, y, z));
model = glm::scale(model, glm::vec3(x, y, z));

Configuració de la Matriu de Vista

La matriu de vista transforma les coordenades del món a coordenades de vista.

glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);

Configuració de la Matriu de Projecció

La matriu de projecció transforma les coordenades de vista a coordenades de clip.

glm::mat4 projection = glm::perspective(glm::radians(fov), aspectRatio, nearPlane, farPlane);

Enviament de Matrius als Shaders

Les matrius es passen als shaders com a uniformes.

unsigned int modelLoc = glGetUniformLocation(shaderProgram, "model");
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));

unsigned int viewLoc = glGetUniformLocation(shaderProgram, "view");
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));

unsigned int projectionLoc = glGetUniformLocation(shaderProgram, "projection");
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));

Exercicis Pràctics

Exercici 1: Translació

Crea un programa que tradueixi un quadrat al llarg de l'eix X.

Solució:

glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(1.0f, 0.0f, 0.0f));

Exercici 2: Rotació

Crea un programa que giri un triangle al voltant de l'eix Z.

Solució:

glm::mat4 model = glm::mat4(1.0f);
model = glm::rotate(model, glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f));

Exercici 3: Escalat

Crea un programa que escali un cub al doble de la seva mida original.

Solució:

glm::mat4 model = glm::mat4(1.0f);
model = glm::scale(model, glm::vec3(2.0f, 2.0f, 2.0f));

Conclusió

En aquesta secció, hem après sobre els diferents sistemes de coordenades i les transformacions bàsiques en OpenGL. Hem vist com utilitzar matrius per aplicar translacions, rotacions i escalats als objectes. També hem après com enviar aquestes matrius als shaders per a la renderització. Aquests conceptes són fonamentals per a la creació de gràfics 3D i seran la base per a temes més avançats en els següents mòduls.

© Copyright 2024. Tots els drets reservats