Ministerul Educației și Cercetării al Republicii Moldova
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică şi Microelectronică
Departamentul Informatică şi Ingineria Sistemelor
RAPORT
Lucrare de laborator nr.2
la cursul „ Transformări grafice 3D”
Tema:„ Transformări grafice 3D”
A efectuat : st. gr. RM-211 Dascal Sergiu
A verificat: asis. univ. Toma Olga
Chișinău 2021
Cuprins
Introducere............................................................................................................................................
1 Sarcina................................................................................................................................................
Rezultatul Programului.........................................................................................................................
Concluzie...............................................................................................................................................
Bibliografie.........................................................................................................................................
Anexa..................................................................................................................................................
Transformari 3D
Sistem de coordonate
În geometrie, un sistem de coordonate reprezintă o modalitate prin care oricărui punct i se
asociază în mod unic o mulțime ordonată de numere reale, numite coordonatele acelui punct. În spațiul
euclidian sunt necesare trei coordonate (abscisa, ordonata și cota), în plan sunt necesare două (abscisa și
ordonata), iar pentru localizarea punctelor pe o dreaptă este necesară doar o coordonată. În geometria
analitică, utilizarea sistemelor de coordonate permite transformarea problemelor de geometrie în
probleme de algebră.
Vom utiliza coordonate omogene ca și in cazul 2D
În matematică, coordonatele omogene, introduse de August Ferdinand Möbius, permit
transformări afine prin reprezentarea lor sub forma unei matrici. Coordonatele omogene permit, de
asemenea, efectuarea calculelor în spații proiective într-un mod similar cu cel în care coordonatele
carteziene o fac în spaţiul euclidian.
Coordonatele omogene ale unui punct din spatiu proiectiv de dimensiune n sunt de obicei scrise ca (x: y:
z: ...: w), un vector linie de lungime n + 1, altele decât (0: 0: 0: .. .: 0). Două seturi de coordonate, care
sunt proporționale denotă același punct din spatiul proiectiv: pentru orice non-zero c scalar din domeniu
care stă la baza K, (cx : cy : cz : ... : cw) reprezintă același punct. Prin urmare, acest sistem de
coordonate poate fi explicat după cum urmează: în cazul în care spațiul proiectiv este construit dintr-un
spațiu vectorial V de dimensiune n + 1, se introduc coordonatele în V, prin alegerea unei baze, și
utilizarea acestora în P (V), clasele de echivalență proporționale non-zero vectori în V.
Transformările vor fi prezentate prin matrice 4x4
Vom utiliza sistemul de coordonate de dreapta (right-handed )
Fig.1 Sistemul de coordonate orientat stînga. Fig.2 Sistemul de coordonate orientat dreapta.
Punct Un punct P din R3 se poate preciza prin:
• Coordonate carteziene: P(x,y,z)
• Coordonate omogene: P(x,y,z,u)
Fig.3 Sistem de coordonate carteziene.
Transformari 3D de baza
Translaţia
[][][ ]
1 0 0 tx
x tx 0 1 0 ty
T (t x , t y , t z )= y + t y =
0 0 1 ty
z ty
0 0 0 1
Rotaţia in jurul unei axe
[ ]
cos θ −sinθ 0 0
sinθ cos θ 0 0
R z ( θ )=
0 0 1 0
0 0 0 1
[ ]
1 0 0 0
0 cos θ −sin θ 0
Rx (θ)=
0 sin θ cos θ 0
0 0 0 1
[ ]
cos θ 0 sin θ 0
0 1 0 0
R z ( θ )=
−sinθ 0 cos θ 0
0 0 0 1
Scalarea
[ ][ ] [ ]
sx 0 0 0
sx 0 0 x
0 sy 0 0
S (s x , s y , sz )= 0 s y 0 ∗ y =
0 0 sz 0
0 0 sz z
0 0 0 1
Transformari 3D compuse
Compunerea transformărilor
Matricea generalizata
Structura pentru cazul notației prin vector-coloana:
● matricea 3x3 include transformări de scalare locală, forfecare, oglindire şi rotație
● matricea 3x1 reprezintă transformarea de translație
● matricea 1x3 reprezintă transformarea de proiectare perspectivă
● matricea 1x1 reprezintă transformarea de scalare generală
[ ]
⋮ 3
¿ 3 ×3 ¿ ⋮ ×
⋯ ⋯ ⋯ ⋮ 1
3 × 1 ⋯ ⋯
⋮ 1× 1
Matricea corespunzătoare transformării compuse se obține prin înmulțirea matricelor
transformărilor elementare. Deoarece înmulțirea matricelor nu este comutativă, este importantă ordinea în
care se aplică aceste transformări
Matricea de transformare cea mai apropiată vectorului linie (sau a vectorului colana) corespunde
primei transformări care se aplică în timp ce matricea de transformare cea mai depărtată este ultima dintre
cele aplicate
Matematic aceasta se exprimă prin:
[M] [VC] = [Mn] …… [M3] [M2] [M1].... [VC]
pentru vector coloana
sau
[VL] [M] =[VL] [M1]T [M2]T [M3]T ... [Mn]T
pentru vector linie unde [ Mi ] poate îi orice matrice de transformare
Scopul lucrării: Crearea unei scene dinamice 3D.
Sarcina lucrării de laborator constă în conceperea și construirea unei scene dinamice 3D
care ar conține transformările: translație, rotație și scalare. Realizarea scenei cu ajutorul
editorului online [Link] utilizînd modele de obiecte 3D stocate în fișiere .OBJ care pot fi create
individual sau descărcate din internet.
Mersul lucrării:
Pentru exemplificarea mersului lucrării de laborator nr. 4 se propune crearea unei scene
dinamice care ar reprezenta o pompă de apă care își orientează elicea în dependență de direcția
vîntului. Modelul pompei este divizat în trei componente: bază (Base), elice (Fan) și corp (Tail).
Fiecare componentă este amplasată într-un fișier .skp aparte cu amplasarea modelului astfel încît
originea sistemului de coordonate și orientarea axelor acestuia să coincidă cu originea și
orientarea sistemului de coordonate global al scenei. Componentele 3D ale modelului pot fi
create de la zero sau modelul pote fi importat din repozitoriul 3D Warehouse accesibil din
meniul de bază al editorului grafic 3d Google SketchUp Window->3D Warehouse, apoi editat
corespunzător după necesitate.
Sarcina: Elaborați un program pentru efectuarea transformărilor grafice 2D
utilizân rotate(), scale(), translate().
Transformările v-or fi aplicate asupra scenei 2D create la lucrare de
laborator nr.1.
Exemplu de program penreu fiecare transformare le puteți găsi mai sus în
Tabelul 2.1, Tabelul 2.2 și Tabelul 2.3.
Variana Unghiul de Coeficientul Deplasarea
rotire de scalare X și Y
9 95 0.8 20,25
Rezultatul Programului :
Concluzii
În cadrul laboratorului respectiv s-a lucrat cu programul [Link] si s-au obtinut
abilitati de creare a desenelor grafice in programul respectiv. În cadrul
laboratorului sau folosit functiile :
function setup(), createCanvas(500, 500); background("gray"); noStroke();
fill("brown"); triangle(70, 330, 430, 330, 250, 480); circle(200, 350, 180); arc(250,
270, 80, 20, PI, TWO_PI); rect(248, 313, 4, 40); quad(248, 350, 210, 360, 210,
364, 251, 354);
În cadrul laboratorului respectiv s-a lucrat cu extragerea informației
din două resurse paralel, una în română și alta în limba engleză. Cu ajutorul
diferitor scripturi și în special al bibliotecii spaCy, s-au clasificat diferite entități,
precum Persoane, Organizații, Locații, Date. S-au efectuat calcule pe baza la
calitatea extragerii automate a acestor elemente și anume s-a calculat Precision și
Recall. În cele din urmă, concluzionez că Precision are valoarea 0.5/0.5 (valorile
calculelor ambelor resurse), iar Recall-ul – 1/0.33. Sa observat careva erori la
entitatea Person, selectând și elemente abstracte, precum ”proprietarul”, dar acest
element a fost clasificat incorect, deoarece nu semnifică o persoană exactă. De
asemenea, au fost elemente neclasificate, dar care ar fi trebuit.
Spre rezolvarea acestor probleme aș propune ca pentru selectarea
persoanelor spre exemplu, să se ia în considerație litera majusculă de la începutul
cuvântului. La fel, pentru determinarea datelor să se ia în considerare prezența
cifrelor. Cuvintele cheie tot au un rol deosebit în clasificarea entităților, de aceea
ele nu trebuie evitate.
Concluzionez că lucrul în cadrul laboratorului a fost unul eficient și
interesant.
Bibliografie
1. [Link]
2. [Link]
3. [Link]
Anexa
Codul programului in [Link] nr. 1
let x = 0;
let y = 0;
let dim = 100.0;
let s = 0.8;
let angle = 0.0;
let jitter = 0.0;
function setup() {
createCanvas(730, 460, WEBGL);
function draw() {
background('lightblue');
x=x+20;
if (x > width + dim)
x = -dim;
y=y+25;
if (y > height + dim)
{
y = -dim;
translate(x, y, dim/10);
scale(s);
rotate(95);
let locX = mouseX - height / 2;
let locY = mouseY - width / 2;
ambientLight(50);
directionalLight(255, 0, 0, 0.25, 0.25, 0);
pointLight(0, 0, 255, locX, locY, 250);
translate(-240, -90, 0);
push();
/*rotateZ(frameCount * 0.01);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.01);*/
ambientMaterial(250);
sphere(80);
pop();
normalMaterial();
translate(240, 0, 0);
push();
rotateZ(frameCount * 0.01);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.01);
torus(70, 25);
pop();
translate(240, 0, 0);
push();
rotateZ(frameCount * 0.01);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.01);
plane(120);
pop();
translate(-235*2, 200, 0);
push();
rotateZ(frameCount * 0.01);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.01);
cylinder(70, 80);
pop();
translate(230, 0, 0);
push();
rotateZ(frameCount * 0.01);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.01);
cone(80, 80);
pop();
translate(240, 0, 0);
push();
rotateZ(frameCount * 0.01);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.01);
box(90, 90, 90);
pop();
Codul programului in [Link] nr. 2
let x = 0;
let dim = 225;
let fr = 30;
function preload()
{
submarine=loadModel('LAB 4.1 (submarine).obj',true);
tarpede=loadModel('LAB 4.1 (tarpede).obj',true);
flagHalf=loadModel('LAB 4.1 (half a flag).obj',true);
explosion=loadModel('LAB 4.1 (explosion).obj', true);
}
function setup()
{
createCanvas(600, 600, WEBGL);
normalMaterial();
frameRate(fr);
}
function draw(){
orbitControl();
background('lightblue');
rotate(PI);
rotateY((PI*3)/2);
translate(0,0,-100);
fill('black');
model(submarine);
translate(0,-50,300);
fill('blue');
model(flagHalf);
translate(0,54,0);
fill('blue');
model(flagHalf);
translate(0,-20,-63);
rotateY(PI);
fill('orange');
model(explosion);
x=x+20;
if (x > dim)
{
x = 0;
}
rotateY(PI);
translate(10,3,-187);
translate(0, 0, x);
scale(0.3);
fill('red');
model(tarpede);