Laboratoire 03

Vous pouvez accéder au laboratoire ici: Laboratoire 3 code snippet

Transformations graphiques 2D

Les objets 2D sont définis dans un système cartésien de coordonnées 2D, par exemple, XOY, XOZ ou YOZ. Dans ce laboratoire, nous allons mettre en oeuvre différents types de transformations qui peuvent être appliqués à des objets définis dans le plan XOY: 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 matrices de ces changements sont les suivants:

Translation

$$ \begin{bmatrix} {x}'\\ {y}'\\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} $$

Rotation

Rotation autour de l’origine

$$ \begin{bmatrix} {x}'\\ {y}'\\ 1 \end{bmatrix} = \begin{bmatrix} cos(u) & -sin(u) & 0\\ sin(u) & cos(u) & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} $$

La rotation relative à un certain point

La rotation relative à un certain point est résolu de cette façon:

  1. translater les deux points: le point au qui on applique la rotation et le point autour duquel la rotation est faite de sorte que le dernier est positionné à l'origine du système de coordonnées.
  2. La rotation normale (autour de l'origine)
  3. translater les résultats de sorte que le point autour duquel la rotation a été fait atteindre sa position initiale

Mise à l'échelle

Mise à l'échelle autour de l'origine

$$ \begin{bmatrix} {x}'\\ {y}'\\ 1 \end{bmatrix} = \begin{bmatrix} s_x & 0 & 0\\ 0 & s_y & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} $$

Si $sx = sy$ alors nous avons mise à l'échelle uniforme, sinon l'échelle non-uniforme.

Le mise à l'échelle autour un point arbitraire

Le mise à l'échelle par rapport à un point arbitraire peut être résolu similaire à la rotation par rapport à un certain point.

Utilisation de le framework

Dans le laboratoire, on utilise, pour simplité, des matrices en forme colonne et une bibliothèque pour matrices implémentée avec exactement le même format que OpenGL. La forme colonne diffère de la forme ligne par l'ordre de stockage des éléments de la matrice dans la mémoire. La matrice de translation est représentée de la manière suivante dans la mémoire:

function Translate(tx, ty)
{
	return [
        	 1,  0, 0,     // colonne 1 en mémoire 
		 0,  1, 0,     // colonne 2 en mémoire
		tx, ty, 1];    // colonne 3 en mémoire
 
}

Pour cette raison, il est plus commode que la matrice être écrite manuellement dans cette forme:

function Translate(tx, ty)
{
	return TransposeMat3(
		         [ 1, 0, tx, 
			   0, 1, ty, 
			   0, 0, 1]
	); 
}

Dans le cadre du laboratoire, le fichier lab/lab3.js définit les fonctions de calcul des matrices de translation, de rotation et d’échelle. À ce stade, toutes les fonctions renvoient la matrice d'identité. Dans le laboratoire, vous devrez changer le code pour calculer les matrices.

Transformations composées

Pourquoi sont les matrices nécessaires? Pour représenter par une seule matrice de transformation une séquence de transformations élémentaires, au lieu d’appliquer une séquence de transformations élémentaires sur un objet.

Donc, si nous appliquons une rotation, une mise à l'échelle et une translation sur un objet, nous ne faisons pas la rotation de l'objet, l' échellage d’objet suivi par son translation, mais nous calculons une matrice qui représente la transformation composé (rotation, mise à l'échelle et la translation) et nous appliquons cette transformation composé sur l'objet qui doit être transformé.

Ainsi, si nous appliquons une rotation (la matrice de rotation $R$), suivie par un mise à l'échelle ($S$), suivie d'une translation ($T$) sur un point ($x$, $y$), le pointe tournée (${x}'$,${y}'$) est calculé comme suit:

$$ \begin{bmatrix} {x}'\\ {y}'\\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} sx & 0 & 0\\ 0 & sy & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} cos(u) & -sin(u) & 0\\ sin(u) & cos(u) & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} $$

Ainsi, la matrice de transformation composée $M$ est $M = T * S * R$.

Dans le laboratoire, dans le fichier lab3.js, il existe un certain nombre d'objets (carrés) pour lesquels Update (), avant de dessiner, définit les matrices de transformation. La commande de dessin est donnée par la fonction RenderMesh2D().

   modelMaxtrix = m3.identity();
   modelMaxtrix = m3.multiply(modelMaxtrix,Translate(-1,-1));
   RenderMesh2D(redsquare,modelMaxtrix);

Pour l'exemple précédent, la matrice de translation créée translaté le carré actuel en (-1,-1). Pour les effets d'animation continue, les étapes de translation doivent changer au fil du temps.

Exemple:

tx += deltaTimeSeconds * 1;
ty += deltaTimeSeconds * 1;
modelMaxtrix = m3.multiply(modelMaxtrix,Translate(tx,ty ));

Remarque: Si vous ne tenez pas compte de la durée d'exécution d'une image (deltaTimeSeconds), vous créerez des animations dépendantes de la plateforme.

Exemple: Si sur chaque image vous grandissez sur TX avec un pas constant (ex: TX + = 0.01), l'animation se comportera différemment sur un ordinateur qui va plus vite que celui qui va plus lentement. Sur un ordinateur fonctionnant à 50 FPS, l’objet se déplacera de 0,01 * 50 = 0,5 unité vers la droite dans une seconde. Au lieu de cela, sur un ordinateur plus lent fonctionnant à 10 FPS, l'objet se déplacera de 0,01 * 10 = 0,1 unités vers la droite en une seconde, l'animation sera donc 5 fois plus lente.

Pour cette raison, il est bon de garder à l’esprit la vitesse de chaque ordinateur (date à travers le deltaTimeSeconds, qui représente la durée de la trame précédente) et de modifier les étapes de conversion, les angles de rotation et les facteurs en fonction de cette variable.

Laboratoire 3

Description du laboratoire

OpenGL est une API 3D. Le dessin d'objets 2D et l'application de transformations 2D sont simulés en effectuant l'abstraction des coordonnées z.

La transformation fenêtre-porte est également simulée pour ce cadre, mais vous apprendrez en cours de route qu’elle est en fait incluse dans la OpenGL et qu’elle ne devrait pas être explicitement définie.

Exercices

  1. Accessez le laboratoire, dupliquer (Fork) et exécutez le projet (Preview): Laboratoire 3 code snippet
  2. Complétez la rotation et la mise à l'échelle à partir du /lab/lab3.js
  3. Modifier les étapes de translation, de rotation et de mise à l'échelle des trois carrés pour créer une animation.
  4. Dessinez une voiture qui se déplace (composée de la carrosserie et des roues) de manière synchrone. Le corps peut être un rectangle et les roues sont des cercles ou des carrés. Les roues doivent tourner en continu ou en mouvement. Utilisez le clavier pour déplacer la voiture

egc/laboratoare/fr/2020/03.txt · Last modified: 2020/10/29 09:06 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