Les objets 3D sont définis dans un système de coordonnées 3D, par exemple XYZ. Dans ce laboratoire, nous allons mettre en oeuvre divers types de transformations: translation, rotation et mise à l'échelle. Ceux-ci sont définis dans un format de matrice, en coordonnées homogènes, comme vous l'avez déjà appris dans le cours.
Les tableaux de ces transformations sont les suivants:
Consiste à faire “glisser” un ensemble de points sur un “rail” (un vecteur).
$$ \begin{bmatrix} {x}'\\ {y}'\\ {z}'\\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & t_x\\ 0 & 1 & 0 & t_y\\ 0 & 0 & 1 & t_z\\ 0 & 0 & 0 &1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} $$
Consiste à faire pivoter un ensemble de points d'un angle Thêta par rapport à un point.
$$ \begin{bmatrix} {x}'\\ {y}'\\ {z}'\\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos(u) & -sin(u) & 0 \\ 0 & sin(u) & cos(u) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} $$
$$ \begin{bmatrix} {x}'\\ {y}'\\ {z}'\\ 1 \end{bmatrix} = \begin{bmatrix} cos(u) & 0 & sin(u) & 0\\ 0 & 1 & 0 & 0 \\ -sin(u) & 0 & cos(u) & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} $$
$$ \begin{bmatrix} {x}'\\ {y}'\\ {z}'\\ 1 \end{bmatrix} = \begin{bmatrix} cos(u) & -sin(u) & 0 & 0\\ sin(u) & cos(u) & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} $$
La rotation autour un axe parallèle à l'axe OX est résolue de la manière la plus simple:
De même, les axes parallèles à OY et OZ sont également utilisés.
Au cours, vous apprendrez à effectuer des rotations sur n’importe quel axe (non parallèle à OX, OY ou OZ).
Consiste simplement à agrandir ou à réduire une forme géométrique.
$$ \begin{bmatrix} {x}'\\ {y}'\\ {z}'\\ 1 \end{bmatrix} = \begin{bmatrix} s_x & 0 & 0 &0 \\ 0 & s_y & 0 &0 \\ 0 & 0 & s_z &0 \\ 0 & 0 & 0 &1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} $$
Si $ sx = sy = sz $ alors nous avons une échelle uniforme, sinon nous avons une échelle inégale.
La mise à l'échelle relative à n'importe quel point est résolue de la manière la plus simple:
Le laboratoire utilise la bibliothèque GLM - une bibliothèque mis en oeuvre avec des tableaux en forme de colonne, exactement le même format que OpenGL. La forme de la colonne diffère de la forme de la ligne par l'ordre de stockage des éléments martiaux dans la mémoire, la matrice de traduction apparaît de la manière suivante en mémoire:
glm::mat4 Translate(float tx, float ty, float tz) { return glm::mat4( 1, 0, 0, 0, // colonne 1 en mémoire 0, 1, 0, 0, // colonne 2 en mémoire 0, 0, 1, 0, // colonne 3 en mémoire tx, ty, tz, 1); // colonne 4 en mémoire }
Pour cette raison, il est plus commode que les matrices soient écrits manuellement dans cette forme:
glm::mat3 Translate(float tx, float ty, float tz) { return glm::transpose( glm::mat4( 1, 0, 0, tx, 0, 1, 0, ty, 0, 0, 1, tz, 0, 0, 0, 1) ); }
Transform3D.h
définit les fonctions de calcul des matrices de traduction, de rotation et de mise à l'échelle. À ce stade, toutes les fonctions renvoient la matrice d'identité. Dans le laboratoire, vous devrez changer le code pour calculer les matrices.
Laborator4.cpp
, il existe un certain nombre d'objets (cubes) pour lesquels Update ()
, avant de dessiner, définit les matrices de transformation. La commande de dessin est donnée par la fonction RenderMesh ()
, qui a le paramètre et la matrice de transformation.
modelMatrix = glm::mat4(1); modelMatrix *= Transform2D::Translate(1, 2, 1); RenderMesh(meshes["box"], modelMatrix);
Pour l'exemple précédent, la matrice de translation créée aura pour effet de translation le cube actuel avec (1, 2, 1). Pour les effets d'animation continue, les étapes de translation doivent changer au fil du temps.
/Laborator4/Transform3D.h
OnInputUpdate
) pour les 3 cubes, donc: