This shows you the differences between two versions of the page.
egc:laboratoare:fr:05 [2019/11/06 21:32] alexandru.gradinaru created |
egc:laboratoare:fr:05 [2019/11/06 21:52] (current) alexandru.gradinaru |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laboratorul 05 ====== | + | ====== Laboratoire 05 ====== |
- | ===== Spațiul Obiect ===== | + | ===== Espace/Repère objet ===== |
- | Spațiul obiect mai este denumit și **SPAȚIUL COORDONATELOR LOCALE**. | + | L'espace objet est également appelé **ESPACE DES COORDONNÉES LOCALES**. |
- | Pentru a putea lucra mai eficient și a reutiliza obiectele 3D definite, în general fiecare obiect este definit într-un sistem de coordonate propriu. Obiectele simple sau procedurale pot fi definite direct din cod însă majoritatea obiectelor utilizate în aplicațiile 3D sunt specificate în cadrul unui program de modelare precum **3D Studio Max**, **Maya**, **Blender** etc. Definind independent fiecare obiect 3D, putem să îi aplicăm o serie de transformări de rotație, scalare și translație pentru a reda obiectul în scena 3D. Un obiect încărcat poate fi afișat de mai multe ori prin utilizarea unor **//matrici de modelare//**, câte una pentru fiecare instanță a obiectului inițial, ce mențin transformările 3D aplicate acestor instanțe. | + | Afin de pouvoir travailler plus efficacement et de réutiliser les objets 3D définis, chaque objet est généralement défini dans son propre système de coordonnées. Les objets simples ou procéduraux peuvent être définis directement à partir du code, mais la plupart des objets utilisés dans les applications 3D sont spécifiés dans un programme de modélisation tel que 3D Studio Max , Maya , Blender , etc. En définissant indépendamment chaque objet 3D, nous pouvons appliquer une série de transformations rotationnelles, scalaires et de translation pour rendre l'objet dans la scène 3D. Un objet chargé peut être affiché plusieurs fois à l'aide de matrices de modélisation , une pour chaque instance de l'objet initial, qui conservent les transformations 3D appliquées à ces instances. |
- | În general, fiecare obiect 3D este definit cu centrul (sau centrul bazei ca în poza de mai jos) în originea propriului său sistem de coordonate, deoarece în acest fel pot fi aplicate mai ușor transformările de modelare. Astfel, rotația și scalarea față de centrul propriu sunt efectuate întotdeauna față de origine. | + | En général, chaque objet 3D est défini avec le centre (ou le centre de la base, comme dans l’illustration ci-dessous) à l’origine de son propre système de coordonnées, ce qui permet d’appliquer plus facilement les transformations de modélisation. Ainsi, la rotation et la mise à l'échelle au centre lui-même sont toujours effectuées par rapport à l'origine. |
- | ===== Spațiul Lume ===== | + | ===== Espace/Repère du monde ===== |
- | Spațiul lume sau **SPAȚIUL COORDONATELOR GLOBALE** este reprezentat prin intermediul **//matricei de modelare//**, aceeași despre care s-a vorbit mai sus. Matricea se obține printr-o serie de **rotații**, **scalări** și **translații**. Prin înmulțirea fiecărui vertex al unui obiect (mesh 3D) cu această matrice, obiectul va fi mutat din spațiul local în spațiul lume, adică se face trecerea de la coordonate locale la coordonate globale. | + | L'espace mondial ou l'espace GLOBAL COORDINATES est représenté par la matrice de modélisation , la même que celle mentionnée ci-dessus. La matrice est obtenue par une série de rotations , d' échelles et de translations . En multipliant chaque sommet d'un objet (maillage 3D) avec cette matrice, l'objet sera déplacé de l'espace local vers l'espace mondial, c'est-à-dire le passage des coordonnées locales aux coordonnées globales. |
- | Folosind matrici de modelare diferite putem amplasa un obiect în scenă de mai multe ori, în locații diferite, cu rotație și scalare diferită dacă este necesar. Un exemplu este prezentat în scena de mai jos. | + | En utilisant différentes matrices de modélisation, nous pouvons placer un objet sur la scène à plusieurs reprises, à différents endroits, avec une rotation et une mise à l'échelle différentes si nécessaire. Un exemple est présenté dans la scène ci-dessous. |
{{ :egc:laboratoare:lab05:use_model_matrix.png?500 | World Space }} | {{ :egc:laboratoare:lab05:use_model_matrix.png?500 | World Space }} | ||
- | ===== Spațiul de Vizualizare ===== | + | ===== Espace/Repère du visualisation ===== |
- | Spațiul de vizualizare sau **SPAȚIUL CAMEREI** este reprezentat de **matricea de vizualizare**. | + | L'espace du visualisation ou l'espace de caméra est représenté par la matrice de vue . |
- | Matricea de modelare poziționează obiectele în scenă, în spațiul lume. Dar o scenă poate fi vizualizată din mai multe puncte de vedere. Pentru aceasta există transformarea de vizualizare. | + | La matrice de modélisation positionne les objets dans la scène, dans l'espace mondial. Mais une scène peut être vue de plusieurs points de vue. Pour cela, il y a la transformation de visualisation. Si nous avons plusieurs objets dans une scène, chaque objet a une matrice de modélisation différente (qui le déplace de l'espace objet vers l'espace monde), mais tous les objets ont la même matrice de visualisation. La transformation de visualisation est définie pour toute la scène. |
- | Dacă într-o scenă avem mai multe obiecte, fiecare obiect are o matrice de modelare diferită (care l-a mutat din spațiul obiect în spațiul lume), însă toate obiectele au aceeași matrice de vizualizare. Transformarea de vizualizare este definită pentru întreaga scenă. | + | |
{{ :egc:laboratoare:lab05:word_view_space.png | World Space and View Space}} | {{ :egc:laboratoare:lab05:word_view_space.png | World Space and View Space}} | ||
- | În spațiul lume camera poate să fie considerată ca un obiect având cele 3 axe locale OX, OY, OZ (vezi poza). Matricea de vizualizare se poate calcula folosind funcția ''glm::lookAt''. | + | Dans l'espace mondial, la caméra peut être considérée comme un objet ayant les 3 axes locaux OX, OY, OZ (voir la photo). La matrice de visualisation peut être calculée à l'aide de la fonction glm::lookAt. |
<code cpp> | <code cpp> | ||
Line 37: | Line 36: | ||
\\ | \\ | ||
- | Ox,Oy,Oz sunt axele sistemului de coordonate ale lumii (spațiul scenei 3D). Punctul O nu este marcat în imagine. | + | Ox, Oy, Oz sont les axes du système de coordonnées du monde (espace de scène 3D). Le point O n'est pas marqué dans l'image. O'x ', O'y', O'z 'sont les axes du système de coordonnées de l'observateur (l'espace d'observation). Le point O 'n'est pas marqué dans l'image (il se trouve à l'intérieur de la machine). |
- | O’x’,O’y’,O’z’ sunt axele sistemului de coordonate al observatorului (spațiul de vizualizare). Punctul O’ nu este marcat în imagine (este înăuntrul aparatului). | + | |
- | Vectorul **forward** este direcția în care observatorul privește, și este de asemenea normala la planul de vizualizare (planul fiind baza volumului de vizualizare, ce seamănă cu o piramidă și este marcat cu contur portocaliu). Vectorul **right** este direcția dreapta din punctul de vedere al observatorului. Vectorul **up** este direcția sus din punctul de vedere al observatorului. | + | Le vecteur **forward** est la direction dans laquelle l'observateur regarde et est également normal pour le plan de visualisation (le plan étant la base du volume de visualisation, qui ressemble à une pyramide et est marqué d'un contour orange). Le vecteur **right** est la bonne direction du point de vue de l'observateur. Le vecteur **up** est la direction ascendante du point de vue de l'observateur. |
- | În imagine, observatorul este un pic înclinat, în mod intenționat, în jos, față de propriul sistem de axe. Când observatorul este perfect aliniat cu axele, right coincide cu +x’, up coincide cu +y’, iar forward coincide cu -z’. În imagine, se poate vedea că up nu coincide cu +y’, iar forward nu coincide cu -z’. | + | Dans l'image, l'observateur est légèrement incliné, intentionnellement vers le bas, vers son propre système d'axes. Lorsque l'observateur est parfaitement aligné sur les axes, la droite coïncide avec + x ', la haut coïncide avec + y' et l'avant coïncide avec -z '. Dans l'image, on peut voir que up ne coïncide pas avec + y ', et que forward ne coïncide pas avec -z'. |
</note> | </note> | ||
- | Vectorul "up" se proiectează în planul de vizualizare, cu direcția de proiecție paralelă cu normala la planul de vizualizare. Proiecția acestuia dă direcția axei verticale a planului de vizualizare. | + | Le vecteur "up" est projeté dans le plan de visualisation, la direction de projection étant parallèle à la normalisation par rapport au plan de visualisation. Sa projection donne la direction de l'axe vertical du plan de visualisation. |
- | În spațiul lume camera poate fi considerată un simplu obiect 3D asupra căruia aplicăm transformările de rotație și translație. Dacă în spațiul lume, camera poate fi poziționată oriunde și poate avea orice orientare, în spațiul de vizualizare (spațiul observator) camera este întotdeauna poziționată în (0,0,0) și privește în direcția OZ negativă. | + | Dans l'espace du monde, la caméra peut être considérée comme un simple objet 3D sur lequel nous appliquons les transformations de rotation et de translation. Si dans l’espace mondial, la caméra peut être positionnée n’importe où et dans n’importe quelle orientation. Dans l’espace de visualisation (la zone d’observation), la caméra est toujours positionnée dans (0,0,0) et regarde dans la direction OZ négative. |
- | Matricea de vizualizare conține transformări de rotație și translație, la fel ca și matricea de modelare. De aceea, dacă ținem scena pe loc și mutăm camera, sau dacă ținem camera pe loc și rotim/translatăm scena, obținem același efect: | + | La matrice de visualisation contient les transformations de rotation et de translation, de même que la matrice de modélisation. Par conséquent, si nous maintenons la scène en place et déplaçons la caméra, ou si nous tenons la caméra en place et faisons pivoter / traduire la scène, nous obtenons le même effet: |
<note> | <note> | ||
Line 56: | Line 54: | ||
</note> | </note> | ||
- | Totuși, cele două matrici au scopuri diferite. Una este folosită pentru poziționarea obiectelor în scenă, iar cealaltă pentru vizualizarea întregii scene din punctul de vedere al camerei. | + | Cependant, les deux matrices ont des objectifs différents. L'un sert à positionner des objets dans la scène et l'autre à visualiser la scène entière du point de vue de la caméra. |
<note> | <note> | ||
- | **Exemplu:** Dacă vrem să ne uităm pe axa **OX**(lume) din poziția (3, 5, 7) codul corespunzător pentru funcția glm::lookAt este: | + | Exemple: Si nous voulons regarder l’axe OX (monde) en position (3, 5, 7), le code correspondant à la fonction glm :: lookAt est: |
<code cpp> | <code cpp> | ||
Line 66: | Line 64: | ||
</note> | </note> | ||
- | ===== Spațiul de Proiecție ===== | + | ===== Espace de projection ===== |
- | După aplicarea transformării de vizualizare, în spațiul de vizualizare, camera se află în origine și privește înspre **–OZ**. Pentru a putea vizualiza pe ecran această informație este necesar să se facă proiecția spațiului vizualizat de cameră într-un spațiu 2D. Cum spațiul vizibil al camerei poate fi de diferite feluri, cel mai adesea trunchi de piramida (**proiecție perspectivă**) sau paralelipiped (**proiecție ortografică**), în OpenGL este necesară trecerea într-un spațiu final numit spațiu de proiecție ce reprezintă un **//cub//** centrat în origine cu dimensiunea 2, deci coordonatele X, Y, Z între -1 și +1. | + | Après avoir appliqué la transformation de visualisation, dans l’espace de visualisation, la caméra est à l’origine et regarde vers - OZ . Pour pouvoir visualiser ces informations à l'écran, il est nécessaire de projeter l'espace visualisé par la caméra dans un espace 2D. L'espace visible de la pièce pouvant être de différentes sortes, le plus souvent le tronc pyramidal ( projection en perspective ) ou le parallélipipède ( projection orthographique ), il est nécessaire de passer à OpenGL vers un espace final appelé espace de projection qui représente un cube centré à l'origine avec dimension 2, donc les coordonnées X, Y, Z sont comprises entre -1 et +1. |
- | Din spațiul de proiecție este foarte ușor matematic să obținem proiecția finală 2D pe viewport fiind nevoie doar să mapăm informația din cubul [-1,1] scalată corespunzător pe viewport-ul definit de aplicație. | + | À partir de l'espace de projection, il est très facile d'obtenir mathématiquement la projection 2D finale dans la fenêtre, il suffit de mapper les informations du cube [-1,1] à l'échelle correspondante dans la fenêtre définie par l'application. |
- | ==== Matricea de Proiecție ==== | + | ==== Matrice de projection ==== |
- | Trecerea din spațiul de vizualizare în spațiul de proiecție se face tot utilizând o matrice, denumită **matrice de proiecție**, calculată în funcție de tipul de proiecție definit. Biblioteca **GLM** oferă funcții de calcul pentru cele mai utilizate 2 metode de proiecție în aplicațiile 3D, anume: proiecția **perspectivă** și **ortografică** | + | Le passage de l'espace de visualisation à l'espace de projection s'effectue également à l'aide d'une matrice, appelée matrice de projection , calculée selon le type de projection défini. La bibliothèque GLM offre des fonctions de calcul pour les deux méthodes de projection les plus utilisées dans les applications 3D, à savoir: la projection en perspective et la projection orthographique |
- | Datele (vertecșii din spațiul de vizualizare) sunt înmulțite cu **matricea de proiecție** pentru a se obține pozițiile corespunzătoare din spațiul de proiecție. | + | Les données (sommets dans l'espace de visualisation) sont multipliées par la matrice de projection pour obtenir les positions correspondantes dans l'espace de projection. |
- | ==== Proiecția Ortografică ==== | + | ==== Projection orthographique ==== |
- | În proiecția ortografică observatorul este plasat la infinit. Distanța până la geometrie nu influențează proiecția și deci nu se poate determina vizibil din proiecție. Proiecția ortografică păstrează paralelismul liniilor din scenă. | + | Dans la projection orthographique, l'observateur est placé à l'infini. La distance à la géométrie n'influence pas la projection et ne peut donc pas être déterminée de manière visible à partir de la projection. La projection orthographique préserve le parallélisme des lignes de la scène. |
{{ :egc:laboratoare:lab05:ortographic_view.png | Ortographic Projection }} | {{ :egc:laboratoare:lab05:ortographic_view.png | Ortographic Projection }} | ||
- | Proiecția ortografică este definită de lățimea și înălțimea ferestrei de vizualizare cât și a distanței de vizualizare dintre planul **din apropiere** și planul **din depărtare**. În afara acestui volum obiectele nu vor mai fi văzute pe ecran. | + | La projection orthographique est définie par la largeur et la hauteur de la fenêtre de visualisation, ainsi que par la distance de visualisation entre le plan proche et le plan distant . À part ce volume, les objets ne seront plus visibles à l'écran. |
{{ :egc:laboratoare:lab05:ortographic_matrix.png | Ortographic Matrix }} | {{ :egc:laboratoare:lab05:ortographic_matrix.png | Ortographic Matrix }} | ||
- | Matricea de proiecție poate fi calculată utilizând funcția ''glm::ortho'' unde punctele **left, right, bottom, top** sunt relative față de centrul ferestrei (0, 0) și definesc **înălțimea** și **lățimea ferestrei de proiecție** | + | La matrice de projection peut être calculée à l'aide de la fonction glm::ortho où les points gauche, droit, bas et haut sont relatifs au centre de la fenêtre (0, 0) et définissent la hauteur et la largeur de la fenêtre de projection. |
<code cpp> | <code cpp> | ||
Line 95: | Line 93: | ||
</code> | </code> | ||
- | ==== Proiecția Perspectivă ==== | + | ==== Projection perspective ==== |
- | Proiecția perspectivă este reprezentată de un trunchi de piramidă (frustum) definit prin cele 2 planuri, **cel din apropiere** și **cel din depărtare**, cât și de deschiderea unghiurilor de vizualizare pe cele 2 axe, OX și OY. În proiecția perspectivă distanța până la un punct din volumul de vizualizare influențează proiecția. | + | La projection perspective est représentée par un tronc de pyramide (tronc) défini par les 2 plans, le plus proche et le plus éloigné , ainsi que par l'ouverture des angles de vision sur les 2 axes, OX et OY. Dans la projection en perspective, la distance jusqu’à un point du volume de visualisation influence la projection. |
{{ :egc:laboratoare:lab05:perspective_view.png | Perspective View }} | {{ :egc:laboratoare:lab05:perspective_view.png | Perspective View }} | ||
- | Matricea de proiecție în acest caz poate fi calculată cu ajutorul funcției ''glm::perspective'' ce primește ca parametri deschiderea unghiului de vizualizare pe orizontală (**Field of View - FoV**), raportul dintre lățimea și înălțimea ferestrei de vizualizare (**aspect ratio**), cât și distanța până la cele 2 planuri zFar și zNear. | + | Dans ce cas, la matrice de projection peut être calculée à l'aide de la fonction glm::perspectivequi reçoit comme paramètres l'ouverture du champ de vision ( FoV ), le rapport entre la largeur et la hauteur de la fenêtre de visualisation ( rapport d'aspect ), ainsi que la distance jusqu'à 2. Plans zFar et zNear. |
{{ :egc:laboratoare:lab05:perspective_matrix.png | Perspective Matrix }} | {{ :egc:laboratoare:lab05:perspective_matrix.png | Perspective Matrix }} | ||
- | În cazul proiecției perspectivă, după înmuțirea coordonatelor din spațiul view, componenta w a fiecărui vertex este diferită, ceea ce înseamnă că spațiul de proiecție nu e același pentru fiecare vertex. Pentru a aduce toți vectorii în același spațiu se împarte fiecare componentă a vectorului rezultat cu **componenta w**. Această operație este realizată automat de procesorul grafic, în cadrul unei aplicații fiind nevoie doar de înmulțirea cu matricea de proiecție. | + | Dans le cas de la projection en perspective, après avoir adouci les coordonnées dans l'espace de vision, la composante de chaque sommet est différente, ce qui signifie que l'espace de projection n'est pas le même pour chaque sommet. Pour amener tous les vecteurs dans le même espace, divisez chaque composante du vecteur résultant par la composante w . Cette opération est effectuée automatiquement par le processeur graphique, dans une application ne nécessitant que la multiplication par la matrice de projection. |
{{ :egc:laboratoare:lab05:perspective_correction.png | Normalized Device Coordinate Space }} | {{ :egc:laboratoare:lab05:perspective_correction.png | Normalized Device Coordinate Space }} | ||
- | Volum de vizualizare perspectivă (**stânga**) și rezultatul obținut (**dreapta**) în urma aplicării transformării de proiecție asupra geometriei din scenă | + | Volume de la vue en perspective (à gauche ) et résultat obtenu (à droite ) suite à l'application de la transformation de projection à la géométrie de la scène |
- | ===== Spațiul Coordonatelor de Dispozitiv Normalizate (NDC) ===== | + | ===== Espace de coordonnées de périphérique normalisé (NDC) ===== |
- | După aplicarea transformărilor de **Modelare**, **Vizualizare** și **Proiecție** iar apoi **divizarea cu W** a vectorilor, se obține spațiul de coordonate normalizate (**NDC**) reprezentat de un CUB centrat în origine (0, 0, 0) cu latura 2. Informația din acest cub se poate proiecta foarte ușor pe orice suprafață 2D de desenare definită de utilizator. | + | Après application des transformations Modélisation , Visualisation et Projection , puis en divisant les vecteurs par W , nous obtenons l’espace de coordonnées normalisé ( NDC ) représenté par un CUB centré à l’origine (0, 0, 0) avec la face 2. Les informations contenues dans ce cube peuvent être: projetez facilement sur toute surface de dessin 2D définie par l'utilisateur. |
{{ :egc:laboratoare:lab05:NDC.png | Normalized Device Coordinate Space }} | {{ :egc:laboratoare:lab05:NDC.png | Normalized Device Coordinate Space }} | ||
- | Exemplu rezultat al proiecției în coordonate dispozitiv normalizate (**NDC**). Proiecție **ortografică** (stânga), **perspectivă** (dreapta) | + | Exemple de résultat de la projection en coordonnées d'appareil normalisées ( NDC ). Projection orthographique (à gauche), perspective (à droite) |
{{ :egc:laboratoare:lab05:NDC2.png?700 | Normalized Device Coordinate Space }} | {{ :egc:laboratoare:lab05:NDC2.png?700 | Normalized Device Coordinate Space }} | ||
- | Exemplu vizualizare **spațiu NDC** din direcția camerei (**stânga**) și **proiecția** corespunzătoare pentru un anumit viewport (**dreapta**) | + | Exemple de vue de l' espace NDC à partir de la direction de la caméra (à gauche ) et de la projection correspondante pour une fenêtre particulière (à droite ) |
+ | ===== Application des transformations de modélisation, de visualisation et de projection ===== | ||
- | ===== Aplicarea Transformărilor de Modelare, Vizualizare și Proiecție ===== | + | Les transformations de modélisation, de visualisation et de projection s’appliquent en multipliant chaque sommet de la géométrie de la scène par les 3 matrices calculées. |
- | + | ||
- | Aplicarea trasformărilor de **Modelare, Vizualizare și Proiecție** se face prin înmulțirea fiecărui vertex al geometriei din scenă cu cele 3 matrici calculate. | + | |
<code cpp> | <code cpp> | ||
Line 134: | Line 131: | ||
<note> | <note> | ||
- | În cadrul laboratorului trebuie doar să calculăm aceste matrici și să le trimitem ca parametru funcției de randare ''RenderMesh''. Înmulțirile respective sunt executate pe procesorul grafic în cadrul programului vertex shader ce va fi introdus începând cu laboratorul următor. | + | En laboratoire, il suffit de calculer ces matrices et de les envoyer en tant que paramètre à la fonction de rendu RenderMesh. Les multiples respectifs sont exécutés sur le processeur graphique dans le programme vertex shader qui sera introduit à partir du prochain laboratoire. |
</note> | </note> | ||
- | ===== Transformări de Cameră ===== | + | ===== Transformations de la caméra ===== |
- | Implementarea unei camere în cadrul unei aplicații 3D depinde de cerințele aplicației. În practică cele mai utilizate tipuri de implementări de cameră sunt: **First person** și **Third person**. | + | L'implémentation d'une caméra dans une application 3D dépend des exigences de l'application. Dans la pratique, les types d’implantation de salles les plus utilisés sont les suivants: première personne et troisième personne . |
==== First-person Camera ==== | ==== First-person Camera ==== | ||
- | Camera de tipul **First-person** presupune faptul că scena 3D este vizualizată din perspectiva ochilor unui observator, adesea uman. Constrângerile de implementare sunt următoarele: | + | La caméra à la première personne suppose que la scène 3D est vue à partir des yeux d'un observateur souvent humain. Les contraintes d'implémentation sont les suivantes: |
- | === Translația camerei First-person === | + | === Translation de caméra à la première personne === |
- | * translațiile **față/spate** se calculează utilizând vectorul **forward** (direcția de vizualizare sau proiecția acestuia în planul orizontal XOZ) | + | * les translations avant / arrière sont calculées à l'aide du vecteur avant (la direction de visualisation ou sa projection dans le plan horizontal XOZ) |
- | * translațiile sus/jos se calculează utilizând vectorul local Up sau cel mai adesea **direcția OY globală** (''glm::vec3(0, 1, 0)'') | + | * les traductions up / down sont calculées à l'aide du vecteur local Up ou le plus souvent de la direction globale OY ( glm::vec3(0, 1, 0)) |
- | * translațiile dreapta/stânga se calculează folosind vectorul local **right** (ce se poate obține și prin operația de **cross product** între vectorii **forward** și **up**) sau folosind proiecția acestuia pe planul orizontal **XOZ** | + | * traductions du droit / gauche vecteur est calculé à partir du coin droit (qui peut être obtenu par le fonctionnement du produit vectoriel entre les vecteurs de l'avant et vers le haut ) ou avec sa projection sur le plan horizontal xOz |
<code cpp> | <code cpp> | ||
Line 155: | Line 152: | ||
</code> | </code> | ||
- | === Rotația camerei First-person === | + | === Rotation de la caméra à la première personne === |
- | * rotațiile se fac păstrând observatorul pe loc și modificând direcția în care privește acesta | + | * les rotations sont effectuées en maintenant l'observateur en place et en changeant la direction dans laquelle il est concerné |
- | * pentru rotația **stânga/dreapta**, vectorii **forward** respectiv **right** se pot calcula prin aplicarea transformării de rotație în jului axei OY globale. Se poate roti și în jurul axei **OY locale** (**vectorul up**), însă în general nu prea are aplicabilitate practică | + | * pour la rotation gauche / droite , les vecteurs avant et droit peuvent être calculés en appliquant la transformation de rotation à l'axe OY global. Il peut également être pivoté autour de l'axe OY local ( vecteur haut ), mais en général, il est peu applicable dans la pratique. |
- | * **vectorul up** se poate recalcula folosind **cross product** între **right** și **forward** | + | * le vecteur haut peut être recalculé en utilisant le produit croisé entre droite et avant |
<code cpp> | <code cpp> | ||
forward = RotateWorldOY(angle) * forward; | forward = RotateWorldOY(angle) * forward; | ||
Line 166: | Line 163: | ||
</code> | </code> | ||
- | * rotația **sus/jos** se poate face rotind vectorii **forward** respectiv **up** în jurul vectorului **axei OX** adică ** vectorul right** (right rămâne constant) | + | * la rotation haut / bas peut être effectuée en faisant pivoter les vecteurs avant et haut autour du vecteur axe OX, c’est-à - dire le vecteur droit (le droit reste constant) |
<code cpp> | <code cpp> | ||
forward = RotateLocalOX(angle) * forward; | forward = RotateLocalOX(angle) * forward; | ||
Line 173: | Line 170: | ||
<note tip> | <note tip> | ||
- | Matricile de rotație necesare se pot calcula folosind funcția ''glm::rotate'' | + | Les matrices de rotation requises peuvent être calculées à l'aide de la fonction ''glm::rotate'' |
<code cpp> | <code cpp> | ||
Line 179: | Line 176: | ||
</code> | </code> | ||
- | * primul parametru reprezintă o **matrice de modelare** asupra căreia aplicăm transformarea specificată. Atunci când nu avem o transformare precedentă se pornește de la matricea identitate ''glm::mat4(1.0f)'' \\ | + | * le premier paramètre représente une matrice de modélisation sur laquelle nous appliquons la transformation spécifiée. Quand on n'a pas de transformation précédente, on part de la matrice identité glm::mat4(1.0f) \\ |
- | * **rotationAxis** este axa față de care rotim. În cazul nostru pentru rotația față de **OX** este vectorul **right**, pentru rotația față de **OZ** este vectorul **forward**, sau ''glm::vec3(0, 1, 0)'' pentru rotația față de **OY global** \\ | + | * rotationAxis est l'axe vers lequel nous tournons. Dans notre cas, rotation avec OX est le bon vecteur , rotation avec OZ est le vecteur direct ou glm::vec3(0, 1, 0)rotation avec OY global. \\ |
- | * întrucât vectorii utilizați sunt ''glm::vec3'' când facem înmulțirea va trebui să construim un vector de 4 componente ca să putem înmulți cu matricea de 4x4. Puteți construi vectorul astfel: \\ | + | * Étant donné que les vecteurs utilisés correspondent glm::vec3à la multiplication, nous devrons construire un vecteur à 4 composantes pour pouvoir le multiplier par la matrice 4 × 4. Vous pouvez construire le vecteur comme suit: \\ |
<code cpp> | <code cpp> | ||
glm::vec3 forward = ... | glm::vec3 forward = ... | ||
glm::vec4 newVec = glm::vec4(forward, 1.0); | glm::vec4 newVec = glm::vec4(forward, 1.0); | ||
</code> | </code> | ||
- | * Dacă vrem să rotim vectorul "forward" în jurul **axei OY globale** atunci facem astfel: | + | * Si nous voulons faire pivoter le vecteur "en avant" autour de l' axe OY global, nous le faisons: |
<code> | <code> | ||
Line 200: | Line 197: | ||
<note important> | <note important> | ||
- | După ce ați făcut calculele de rotație aveți grijă să păstrați vectorii normalizați | + | Après avoir effectué les calculs de rotation, assurez-vous de garder les vecteurs normalisés. |
<code cpp> | <code cpp> | ||
glm::vec3 vector = ... | glm::vec3 vector = ... | ||
Line 209: | Line 206: | ||
==== Third-person Camera ==== | ==== Third-person Camera ==== | ||
- | În cazul camerei de tip Third-person **observatorul** se mută în jurul unui obiect de interes, ce reprezintă întotdeauna centrul atenției. Deci rotațiile se fac într-un mod diferit | + | Dans le cas d'une caméra de type 3ème personne, l' observateur se déplace autour d'un objet d'intérêt, qui représente toujours le centre de l'attention. Donc, les rotations se font de manière différente |
- | === Rotația Camerei Third-person === | + | === Rotation à la troisième personne === |
- | * se translatează observatorul pe direcția de vizualizare în punctul de interes (target) | + | * l'observateur est traduit dans le sens de la visualisation au point d'intérêt (target) |
- | * se aplică rotația de tip **First-person** specifică | + | * la rotation spécifique à la première personne est appliquée |
- | * se traslatează observatorul înapoi pe noua direcție de vizualizare cu aceeași distanță | + | * ramener l'observateur dans la nouvelle direction d'observation à la même distance |
<note important> | <note important> | ||
- | În laborator aveți variabila distanceToTarget care reține distanța până la punctul față de care rotim | + | Dans le laboratoire, vous avez la variable distanceToTarget qui maintient la distance jusqu'au point où nous faisons pivoter |
</note> | </note> | ||
- | === Translația Camerei Third-person === | + | === La translation du caméra Third-person === |
- | Poziția camerei depinde de poziția punctului de interes. Astfel, mișcarea punctului de interes va determina și translația camerei în mod corespunzător. | + | La position de la caméra dépend de la position du point d'intérêt. Ainsi, le mouvement du point d’intérêt déterminera également la traduction de la caméra en conséquence. |
- | ===== Cerințe laborator ===== | + | ===== Exercices ===== |
- | - Descarcăți [[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]] |
- | - Să se implementeze camera de tip First Person (fișierul __LabCamera.h__) | + | - Implémenter la caméra à la première personne (fichier LabCamera.h ) |
- | - Să se implementeze camera de tip Third Person (fișierul __LabCamera.h__) | + | - Implémenter la caméra à la troisième personne (fichier LabCamera.h ) |
- | - Să se completeze funcțiile de translație ale camerei din ''Laborator5::OnInputUpdate()'' | + | - Compléter les fonctions de translation de la caméra de Laborator5::OnInputUpdate() |
- | - Să se completeze funcțiile de rotație ale camerei din ''Laborator5::OnMouseMove()'' | + | - Compléter les fonctions de rotation de la caméra à partir de Laborator5::OnMouseMove() |
- | - Să se deseneze încă 2 obiecte în scena 3D având rotația/scalarea/translația diferite | + | - Dessinez 2 autres objets dans la scène 3D avec une rotation / mise à l'échelle / translation différente |
- | * aveți grijă să setați matricea de modelare de fiecare dată înainte de desenare | + | * assurez-vous de définir la matrice de modélisation à chaque fois avant de dessiner |
- | * utilizați ''glm::translate()'', ''glm::rotate()'' și ''glm::scale()'' pentru a construi o matrice de modelare pentru fiecare obiect | + | * utiliser ''glm::translate()'', ''glm::rotate()'' et ''glm::scale()'' pour construire une matrice pour chaque modélisation de l'objet |
- | - Schimbare proiecție perspectivă/ortografică | + | - Changer de perspective / projection orthographique |
- | * **tasta O** face trecerea în proiecție ortografică | + | * la touche O permet de passer à la projection orthographique |
- | * **tasta P** face trecerea în proiecție perspectivă | + | * la touche P permet de passer à la projection en perspective |
- | - Să se modifice FoV-ul camerei în cazul proiecției persepective | + | - Changer le FoV de la caméra dans le cas de la perspective de projection |
- | * folosiți 2 taste pentru a modifica pozitiv și negativ FoV-ul | + | * Utilisez 2 touches pour changer le FoV positif et négatif |
- | * se va folosi ''OnInputUpdate()'' | + | * sera utilisé OnInputUpdate() |
- | - Să se modifice lățimea și/sau înălțimea ferestrei de proiecție în cazul proiecției ortografice | + | - Changer la largeur et / ou la hauteur de la fenêtre de projection dans le cas de la projection orthographique |
- | * se va folosi ''OnInputUpdate()'' | + | * sera utilisé OnInputUpdate() |