This shows you the differences between two versions of the page.
egc:laboratoare:04 [2024/10/27 18:08] mihnea.mitrache [Transformări 3D] |
egc:laboratoare:04 [2024/10/27 19:21] (current) mihnea.mitrache [Transformări 3D] |
||
---|---|---|---|
Line 107: | Line 107: | ||
La laboratorul anterior am explorat o serie de transformări 2D. Am înțeles că este necesara utilizarea coordonatelor omogene și implicit a matricelor de 3x3 pentru realizarea tuturor transformărilor 2D. | La laboratorul anterior am explorat o serie de transformări 2D. Am înțeles că este necesara utilizarea coordonatelor omogene și implicit a matricelor de 3x3 pentru realizarea tuturor transformărilor 2D. | ||
În acest laborator vom extinde conceptele la spațiul 3D. Vom lucra cu obiecte tridimensionale în sistemul de coordonate din OpenGL. | În acest laborator vom extinde conceptele la spațiul 3D. Vom lucra cu obiecte tridimensionale în sistemul de coordonate din OpenGL. | ||
- | <note tip>Acesta este un sistem de coordonate regulat dreapta. Axa x este orientată spre dreapta, axa y este orientată în sus, iar axa z este orientată spre privitor.</note> | + | <note tip> |
+ | Acesta este un sistem de coordonate regulat dreapta. Axa x este orientată spre dreapta, axa y este orientată în sus, iar axa z este orientată spre privitor. | ||
+ | </note> | ||
+ | {{ :egc:laboratoare:lab4sistemcoordonate0.png?500 |}} | ||
Vom implementa diferite tipuri de transformări ce pot fi aplicate obiectelor: translații, rotații și scalări. Similar cu cazul 2D, vom utiliza coordonate omogene pentru a realiza aceste transformări. Diferența este dată de faptul că putem deplasa obiectele într-o dimensiune suplimentară, adică pe axa z. Astfel, vom adăuga o coloană și o linie în matricele de transformare, astfel încât acestea vor fi de 4x4. | Vom implementa diferite tipuri de transformări ce pot fi aplicate obiectelor: translații, rotații și scalări. Similar cu cazul 2D, vom utiliza coordonate omogene pentru a realiza aceste transformări. Diferența este dată de faptul că putem deplasa obiectele într-o dimensiune suplimentară, adică pe axa z. Astfel, vom adăuga o coloană și o linie în matricele de transformare, astfel încât acestea vor fi de 4x4. | ||
==== Translația ==== | ==== Translația ==== | ||
Line 131: | Line 135: | ||
\end{bmatrix} | \end{bmatrix} | ||
$$ | $$ | ||
+ | ==== Scalarea ==== | ||
+ | |||
+ | === Scalarea față de 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} | ||
+ | $$ | ||
+ | |||
+ | Dacă $sx = sy = sz$ atunci avem scalare uniformă, altfel avem scalare neuniformă. | ||
+ | |||
+ | === Scalarea față de un punct oarecare === | ||
+ | |||
+ | Scalarea relativă la un punct oarecare se rezolvă în cel mai simplu mod prin: | ||
+ | - translatarea atât a punctului asupra căruia se aplică scalarea cât și a punctului față de care se face scalarea a.î. cel din urmă să fie originea sistemului de coordonate | ||
+ | - scalarea normală (față de origine) | ||
+ | - translatarea rezultatului a.î. punctul față de care s-a făcut scalarea să ajungă în poziția sa inițială | ||
+ | |||
==== Rotația ==== | ==== Rotația ==== | ||
+ | Spre deosebire de celelalte două operații de mai sus, rotația este puțin mai interesantă când trecem la 3D. Putem să rotim un obiect în jurul uneia dintre cele trei axe cât și jurul unei axe oarecare. | ||
+ | <note tip> | ||
+ | În 2D am realizat rotații față de origine sau față de un punct oarecare. Înțelegem acum că rotația aceea era în jurul axei Z, perpendiculară pe planul de lucru. | ||
+ | </note> | ||
+ | {{:egc:laboratoare:lab4rotation2d_gif.gif}} | ||
+ | |||
+ | Pentru rotațiile în jurul axelor de coordonate ne putem imagina că realizăm rotația prin "înșurubarea" în jurul acestora. | ||
+ | |||
+ | {{:egc:laboratoare:lab4rotation3d_gif.gif|}} | ||
=== Rotația față de axa OX === | === Rotația față de axa OX === | ||
Line 214: | Line 260: | ||
La curs veți învăța cum puteți realiza rotații față de axe oarecare (care nu sunt paralele cu OX, OY sau OZ). | La curs veți învăța cum puteți realiza rotații față de axe oarecare (care nu sunt paralele cu OX, OY sau OZ). | ||
- | ==== Scalarea ==== | ||
- | |||
- | === Scalarea față de 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} | ||
- | $$ | ||
- | |||
- | Dacă $sx = sy = sz$ atunci avem scalare uniformă, altfel avem scalare neuniformă. | ||
- | |||
- | === Scalarea față de un punct oarecare === | ||
- | |||
- | Scalarea relativă la un punct oarecare se rezolvă în cel mai simplu mod prin: | ||
- | - translatarea atât a punctului asupra căruia se aplică scalarea cât și a punctului față de care se face scalarea a.î. cel din urmă să fie originea sistemului de coordonate | ||
- | - scalarea normală (față de origine) | ||
- | - translatarea rezultatului a.î. punctul față de care s-a făcut scalarea să ajungă în poziția sa inițială | ||
===== Utilizarea bibliotecii GLM ===== | ===== Utilizarea bibliotecii GLM ===== |