Laboratoire 04

Transformations 3D

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:

Translation

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} $$

Rotation

Consiste à faire pivoter un ensemble de points d'un angle Thêta par rapport à un point.

La rotation autour de l'axe OX

$$ \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} $$

La rotation autour de l'axe OY

$$ \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} $$

La rotation autour de l'axe OZ

$$ \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} $$

Rotation autour un axe parallèle à l'axe OX

La rotation autour un axe parallèle à l'axe OX est résolue de la manière la plus simple:

  1. la translation du point sur lequel la rotation et le point autour duquel la rotation est appliquée, de sorte que ce dernier est situé sur l'axe OX.
  2. rotation (autour de l'axe OX),
  3. translation du résultat de sorte que le point autour duquel la rotation est effectuée atteigne sa position d'origine

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).

Mise à l'échelle

Consiste simplement à agrandir ou à réduire une forme géométrique.

Mise à l'échelle à l'origine

$$ \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.

Mise à l'échelle à un point

La mise à l'échelle relative à n'importe quel point est résolue de la manière la plus simple:

  1. la translation du le point sur lequel la mise à l'échelle est appliquée et le point de mise à l'échelle de sorte que ce dernier soit l'origine du système de coordonnées.
  2. mise à l'échelle à l'origine,
  3. la translation du résultat de sorte que le point auquel la mise à l'échelle a été faite atteigne sa position d'origine

Utilisation de la bibliothèque GLM

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)
	); 
}

Dans le cadre du laboratoire, le fichier 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.

Dans le laboratoire, dans le fichier 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.

Exercices

  1. Terminez la translation, la rotation et la mise à l'échelle à partir du fichier /Laborator4/Transform3D.h
  2. Faire des animations en appuyant sur les touches (dans OnInputUpdate ) pour les 3 cubes, donc:
  • avec les touches W A S D R F pour déplacer le premier cube de la scène
  • avec les touches 1 et 2 pour redimensionner le second cube (agrandir et réduire) à partir de son propre centre
  • avec les touches 3,4,5,6,7,8 faire tourner le troisième cube vers les axes globaux OX, OY, OZ
egc/laboratoare/fr/04.txt · Last modified: 2018/10/23 11:17 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0