Differences

This shows you the differences between two versions of the page.

Link to this comparison view

egc:laboratoare:fr:03 [2018/10/23 10:29]
alexandru.gradinaru
egc:laboratoare:fr:03 [2019/10/14 07:52] (current)
alexandru.gradinaru
Line 1: Line 1:
 ====== Laboratoire 03 ====== ====== Laboratoire 03 ======
  
-===== Transformations 2D =====+===== 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. Les objets 2D sont définis dans un système cartésien de coordonnées 2D, par exemple, XOY, XOZ ou YOZ.
Line 110: Line 110:
  
 <​note>​ <​note>​
-In cadrul framework-ului de laboratorin fisierul ​''​Transform2D.h'' ​sunt definite functiile pentru calculul matricilor ​de translatierotatie si scalareIn momentul acesta toate functiile intorc matricea identitateIn cadrul laboratorului va trebui sa modificati codul pentru a calcula matricile respective+Dans le cadre du laboratoirele fichier ​''​Transform2D.h'' ​définit les fonctions ​de calcul des matrices de translationde 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.
 </​note>​ </​note>​
  
-==== Transformari compuse ​====+==== 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. 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.
Line 154: Line 154:
  
 <​note>​ <​note>​
-In cadrul laboratoruluiin fisierul ​''​Laborator3.cpp'', ​exista o serie de obiecte ​(patratepentru care, in functia ​''​Update()'', ​inainte ​de desenarese definesc matricile ​de transformariComanda ​de desenare se da prin functia ​''​RenderMesh2D()''​.+ 
 +Dans le laboratoiredans le fichier ​''​Laborator3.cpp'', ​il existe un certain nombre d'​objets ​(carréspour lesquels ​''​Update ()'', ​avant de dessinerdéfinit les matrices ​de transformationLa commande ​de dessin est donnée par la fonction ​''​RenderMesh2D()''​.
  
 <code cpp> <code cpp>
Line 162: Line 163:
 </​code>​ </​code>​
  
-Pentru exemplul anteriormatricea ​de translatie creata va avea ca efect translatarea patratului curent cu (150250). Pentru efecte de animatie continuapasii de translatie ar trebui sa se modifice in timp.+Pour l'​exemple précédentla matrice ​de translation créée translaté le carré actuel en (150 250). Pour les effets d'​animation continueles étapes ​de translation doivent changer au fil du temps.
  
-Exemplu:+Exemple:
 <code cpp> <code cpp>
 tx += deltaTimeSeconds * 100; tx += deltaTimeSeconds * 100;
Line 173: Line 174:
  
 <note tip> <note tip>
-**Retineti:** daca la animatie nu tineti cont de timpul de rulare al unui frame (''​deltaTimeSeconds''​), ​veti crea animatii dependente ​de platforma+** 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.
  
-**Exemplu:​** daca la fiecare frame cresteti pe tx cu un pas constant ​(ex: ''​tx += 0.01''​)atunci animatia se va comporta diferit pe un calculator care merge mai repede fata de unul care merge mai incet. Pe un calculator care ruleaza ​la 50 FPS, obiectul se va deplasa 0.01 * 50 = 0.5 unitati in dreapta intr-o secunda. In schimbpe un calculator mai incet, care ruleaza la 10 FPS, obiectul se va deplasa 0.01 * 10 = 0.1 unitati in dreapta intr-o secunda, deci animatia va fi de 5 ori mai lenta+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 conversionles angles de rotation et les facteurs en fonction ​de cette variable.
  
-Din acest motiv este bine sa tineti cont de viteza de rulare a fiecarui calculator (data prin ''​deltaTimeSeconds'',​ care reprezinta timpul de rulare al frame-ului anterior) si sa modificati pasii de translatie, unghiurile de rotatie si factorii de scalare in functie de aceasta variabila. 
 </​note>​ </​note>​
  
Line 185: Line 187:
  
 <​note>​ <​note>​
-In exercitiile anterioare din acest laborator, coordonatele obiectelor au fost raportate la dimensiunea ferestrei definita prin ''​glViewport()''​. ​ 
  
-Exemplu: Daca viewport-ul meu are coltul din stanga jos (0, 0) si are latimea 1280 si inaltimea 720, atunci toate obiectele ar trebui desenate in acest interval, daca vreau sa fie vizibile. Acest lucru ma conditioneaza sa imi gandesc toata scena in (0, 0) - (1280, 720). Daca vreau sa scap de aceasta limitarepot sa imi gandesc scena intr-un spatiu logic (de exemplu imi creez toate obiectele in spatiul ​(-1, -1- (1, 1), si apoi sa le desenez in poarta de afisare, dar aplicand ceea ce se numeste **transformarea fereastra poarta**.+Dans les exercices précédents ​de ce laboratoireles coordonnées ​de l'​objet étaient rapportées à la taille de la fenêtre définie par ''​glViewport()''​.
  
-In cele ce urmeaza vedem ce presupune aceasta transformare si cum pot sa imi gandesc scena fara sa fiu limitat ​de dimensiunea viewport-ului.+Exemple: Si ma fenêtre d'​affichage a le coin inférieur gauche (0, 0), une largeur ​de 1280 et une hauteur de 720, tous les objets doivent être dessinés dans cette plage s'ils veulent être visibles. Cela me fait penser à toute la scène dans (0, 0) (1280, 720). Si je souhaite supprimer cette limitation, je peux penser à la scène dans un espace logique (par exemple, je crée tous les objets dans l'​espace (-1, -1) - (1, 1), puis je les dessine dans la grille d'​affichage. , mais en appliquant ce que l’on appelle **la porte tournante**.
  
 +Dans ce qui suit, nous voyons ce que cette transformation implique et comment je peux penser à la scène sans être limité par la taille de la fenêtre.
 </​note>​ </​note>​
  
 {{ :​egc:​laboratoare:​transf_fer_poarta1.png?​600 |}} {{ :​egc:​laboratoare:​transf_fer_poarta1.png?​600 |}}
  
-==== Definitia matematica: ​====+==== Définition mathématique ​====
  
 {{ :​egc:​laboratoare:​transf_fer_poarta2.png?​550 |}} {{ :​egc:​laboratoare:​transf_fer_poarta2.png?​550 |}}
Line 203: Line 205:
  
  
-Transformarea este definita prin 2 dreptunghiuriin cele doua sisteme ​de coordonatenumite fereastra sau spatiul logic si poarta, sau spatiul de afisare. De aici numele de transformarea fereastra-poarta sau transformarea ​de vizualizare 2D.+La transformation est définie par deux rectanglesdans les deux systèmes ​de coordonnéesappelée fenêtre (de visualisation) et porte (d’affichage).
  
-F: un punct din fereastra+F: un point dans la fenêtre
  
-P: punctul in care se transforma ​prin transformarea ​de vizualizare+P: le point qui devient par appliquer le transformation ​de visualisation
  
-Pozitia relativa a lui in poarta ​de afisare trebuie sa fie aceeasi cu pozitia relativa a lui in fereastra.+La position relative de dans l’affichage de droite doit être la même position relative ​de F dans la fenêtre.
  
 $$ sx = \frac{xpmax - xpmin}{xfmax - xfmin} $$ $$ sx = \frac{xpmax - xpmin}{xfmax - xfmin} $$
Line 215: Line 217:
 $$ sy = \frac{ypmax - ypmin}{yfmax - yfmin} $$ $$ sy = \frac{ypmax - ypmin}{yfmax - yfmin} $$
  
-  * sx, sy depind ​de dimensiunile celor doua ferestre +  * sx, sy dépend ​de la taille des deux fenêtres 
-  * tx, ty depind ​de pozitiile celor doua ferestre fata de originea sistemului de coordonate in care sunt definite.+  * tx, ty dépendent des positions des deux fenêtres ​de l'​original système ​de coordonnées sont définies.
  
 $$ tx = xpmin - sx * xfmin $$ $$ tx = xpmin - sx * xfmin $$
 $$ ty = ypmin - sy * yfmin $$ $$ ty = ypmin - sy * yfmin $$
  
-In finaltransformarea fereastra poarta are urmatoarele ecuatii:+Enfinla transformation fenêtre-porte a les équations suivantes:
  
 $$ xp = xf * sx + tx $$ $$ xp = xf * sx + tx $$
 $$ yp = yf * sy + ty $$ $$ yp = yf * sy + ty $$
  
-Consideram o aceeasi orientare a axelor celor doua sisteme ​de coordonateDaca acestea au orientari diferite ​(ca in prima imagine), trebuie aplicata o transformare suplimentara ​de corectie a coordonatei ​y.+Nous considérons un même orientation des axes de les deux systèmes de coordonnéesSi elles ont des orientations différentes ​(comme dans la première image), une correction supplémentaire de la correction ​de la coordonnée ​doit être appliquée.
  
-==== Efectele transformarii ​====+==== Les effets de la transformation ​====
  
-  * marire/micsorare, in functie ​de dimensiunile ferestrei si ale portii +  * Augmentation ​diminution en fonction ​de la taille de la fenêtre et la porte 
-  * deformare daca fereastra ​si poarta nu sunt dreptunghiuri asemenea +  * Déformation: ​si la fenêtre et la porte ne sont pas des rectangles semblables 
-  * pentru scalare uniforma, $s=min(sx,​sy)$, ​afisarea centrata in poarta presupune o translatie suplimentara pe axa Ox sau pe axa Oy:+  * Mise à l'​échelle uniforme, $s=min(sx,​sy)$, ​l'​affichage centrée dans la porte: translation additionnel sur l'​axe ​Ox ou Oy:
  
 $$Tsx = (xpmax - xpmin - s*(xfmax - xfmin)) / 2$$ $$Tsx = (xpmax - xpmin - s*(xfmax - xfmin)) / 2$$
 $$Tsy = (ypmax - ypmin - s*(yfmax - yfmin)) / 2$$ $$Tsy = (ypmax - ypmin - s*(yfmax - yfmin)) / 2$$
  
-  * decuparea primitivelor aflate in afara ferestrei vizuale +  * Couper les primitives positionées à l'​extérieur de la fenetre de visualization
-==== Matricea transformarii fereastra-poarta ====+
  
-De retinut este ca transformarea fereastra poarta presupune o scalare si o translatieEa are urmatoarea expresiecu formulele ​de calcul ​pentru ​sx, sy, tx, ty prezentate anterior:+==== Matrice de transformation fenêtre-porte ==== 
 + 
 +Notez que la transformation de la fenêtre de porte implique la mise à l'​échelle et la translationIl a l'​expression suivanteavec les formules ​de calcul ​pour sx, sy, tx, celles présentées précédemment:
  
 $$ $$
Line 261: Line 264:
  
 <​note>​ <​note>​
-Transformarea ​de vizualizare este deja implementata in clasa ''​Laborator3_Vis2D'':​+La transformation ​de vue est déjà implémentée dans la classe ​''​Laborator3_Vis2D'':​
  
 <code cpp> <code cpp>
Line 282: Line 285:
  
 <​note>​ <​note>​
-In cadrul laboratoruluiin clasa ''​Laborator3_Vis2D'', ​este creat un patrat, in spatiul logic (0,0) - (4,​4). ​De retinut este faptul ca acum nu mai trebuie sa raportam coordonatele patratului la spatiul de vizualizare ​(cum se intampla in exercitiile anterioare), ci la spatiul logic pe care l-am definit noi.+Dans le laboratoiredans la classe ​''​Laborator3_Vis2D'',​ un carré est créé dans l'​espace logique ​(0,0) - (4,​4). ​Notez que nous ne devons plus rapporter les coordonnées du carré à l'​espace d'​observation ​(comme dans les exercices précédents), mais à l'​espace logique que nous avons défini.
  
 <code cpp> <code cpp>
Line 297: Line 300:
 </​code>​ </​code>​
  
- +Dans la fonction ​''​Update ()'', ​vous tracez cinq fois le même carré précédemment crééquatre carrés aux quatre coins et un carré au milieu de l'​espace logiqueDéfinit ​fenêtres contenant les mêmes objetsLa première fenêtre est définie dans la moitié gauche ​de la fenêtre d’affichage et la seconde dans la moitié droite. Par défautla fenêtre Passerelle par défaut de la deuxième fenêtrela fenêtre uniformeest utilisée par défautNotez que dans la deuxième fenêtreles carrés restent toujours des carrés, alors que dans la première fenêtre, ils sont vus comme des rectangles ​(c'​est-à-dire qu'ils sont déformés) si l'​espace logique et l'​espace d'​affichage ne sont pas représentés par de tels rectangles.
-In functia ​''​Update()'' ​se deseneaza acelasi patrat creat anteriorde 5 oripatru patrate in cele patru colturi si un patrat in mijlocul spatiului logicSe definesc ​viewport-uri,​ ambele continand aceleasi obiectePrimul viewport este definit in jumatatea din stanga a ferestrei ​de afisareiar al doileain jumatatea din dreapta. Pentru primul viewport se defineste transformarea fereastra poarta default si pentru al doilea viewportcea uniformaObservati ca in al doilea viewport patratele raman intotdeauna patratepe cand in primul viewport se vad ca dreptunghiuri ​(adica sunt deformate), daca spatiul logic si spatiul ​de vizualizare nu sunt reprezentate prin dreptunghiuri asemenea.+
  
 </​note>​ </​note>​
  
  
-==== Utilizare ​====+==== Utilisation ​====
  
 +Où pouvez-vous utiliser cette fenêtre-porte de transformation?​ Par exemple, dans un jeu de course en 2D, il est souhaitable,​ en bas à droite de l'​écran,​ de visualiser votre propre voiture sur une mini-carte. Ceci est fait en dessinant la scène deux fois.
  
-Unde se poate folosi aceasta transformare fereastra poarta? De exempluintr-un joc 2D cu masini de curse, se doreste in dreapta-jos a ecranului vizualizarea masinii proprii, intr-un minimap. Acest lucru se face prin desenarea scenei de doua ori.  +Par exemplesi la scène entière ​(le chemin et toutes les voituresest pensée dans l’espace logique ​(-10, -10) - (10,10) (qui a la taille de 20x20) ​et que l’espace d’affichage est (0,0) - (1280, 720 ), la première scène est la scène entière avec les paramètres de la fonction fenêtre-porte mentionnés ci-dessus:
- +
-Daca de exemplu toata scena (traseul si toate masinileeste gandita in spatiul logic (-10,-10) - (10,10) (care are dimensiunea ​20x20) ​si spatiul de afisare este (0,0) - (1280, 720), prima data se deseneaza toata scena cu parametrii functiei fereastra-poarta anterior mentionati:+
  
 <code cpp> <code cpp>
Line 316: Line 317:
 </​code> ​ </​code> ​
  
-Daca la un moment ​dat masina proprie este in spatiul ​(2,2) - (5,​5), ​adica de dimensiune ​3x3 si vreau sa creez un minimap in coltul din dreapta jos al ecranului ​de rezolutie ​280x220, ​pot desena din nou aceeasi scenadar cu urmatoarea transformare fereastra-poarta:+Si, à un moment ​donné, votre voiture est dans l’espace ​(2,2) - (5,​5), ​c’est-à-dire ​3x3 et que je souhaite créer une mini-carte dans le coin inférieur droit de l’écran ​de résolution ​280x220, ​je peux à nouveau dessiner la même scènemais avec la transformation fenêtre-porte suivante:
  
 <code cpp> <code cpp>
Line 324: Line 325:
 </​code> ​ </​code> ​
  
-===== Laboratorul ​3 ===== +===== Laboratoire ​3 ===== 
-==== Descriere laborator ​====+==== Description du laboratoire ​====
  
 <note tip> <note tip>
-In cadrul acestui laborator aveti de programat in doua clase:  +Dans ce laboratoire,​ vous devez être programmé dans deux classes:  
-  * ''​Laborator3.cpp'', ​pentru familiarizarea cu transformarile 2D de translatierotatie si scalare +  * ''​Laborator3.cpp'', ​pour  familiariser avec les transformations ​de traductionde rotation et de redimensionnement 2D 
-  * ''​Laborator3_Vis2D.cpp'', ​pentru familiarizarea cu transformarea fereastra-poarta +  * ''​Laborator3_Vis2D.cpp'', ​pour familiariser avec la transformation de la fenêtre de la porte 
-Din clasa ''​Main'' ​puteti sa alegeti ce laborator rulati:+ 
 +Dans la classe ​''​Main''​, vous pouvez choisir le laboratoire que vous utilisez:
  
 <code cpp> <code cpp>
Line 337: Line 339:
 </​code>​ </​code>​
  
-sau +ou
  
 <code cpp> <code cpp>
Line 345: Line 347:
  
 <​note>​ <​note>​
-OpenGL ​este un API 3D. Desenarea obiectelor ​2D si aplicarea transformarilor 2D sunt simulate prin faptul ca facem abstractie ​de coordonata ​z.+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.
  
-Transformarea fereastra-poarta este si ea simulata pentru acest frameworkdar veti invata pe parcurs ca ea este de fapt inclusa in lantul ​de  +La transformation fenêtre-porte est également simulée pour ce cadremais vous apprendrez en cours de route qu’elle est en fait incluse dans la 
-transformari ​OpenGL ​si ca nu trebuie definita explicit+OpenGL ​et qu’elle ne devrait pas être explicitement définie.
 </​note>​ </​note>​
  
-==== Cerinte laborator ​====+==== Exercices  ​====
  
-  - Descarcati ​[[https://​github.com/​UPB-Graphics/​Framework-EGC/​archive/​master.zip|framework-ul de laborator]] +  - Télécharger ​[[https://​github.com/​UPB-Graphics/​Framework-EGC/​archive/​master.zip|le framework de laboratoire]] 
-  - Completati functiile de translatie, rotatiescalare din ''/​Laborator3/​Transform2D.h''​ +  - Complétez le translationla rotation et la mise à l'​échelle à partir du ''/​Laborator3/​Transform2D.h''​ 
-  - Sa modifice pasii de translatie si rotatie si scalare pentru cele trei patrate ca sa creeze animatie+  - Modifier les étapes ​de translation,​ de rotation et de mise à l'​échelle des trois carrés pour créer une animation
-  - Cu tastele ​W, A, S, D sa se translateze fereastra logica ​''​Laborator3_Vis2D''​. ​Cu tastele ​si sa se faca zoom in si zoom out pe fereastra logica.+  - Utilisez les touches ​W, A, S, D pour traduire la fenêtre logique ​''​Laborator3_Vis2D''​. ​Utilisez les touches ​et pour effectuer un zoom avant ou arrière sur la fenêtre logique.
 <​hidden>​ <​hidden>​
 ---- ----
egc/laboratoare/fr/03.1540279788.txt.gz · Last modified: 2018/10/23 10:29 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