Sunteți pe pagina 1din 7

[Graphics Lab Logo Image] Home Up Feedback Contents Search

Lucrarea nr.12:
Transformari Grafice 3D
[ Prev ] Lucrarea 12 [ Next ]
[Under Construction]
Descriere
Implementare
Aplicatii
A.Descriere
1. Transformari elementare
In cadrul acestei lucrari vom considera 5 tipuri de transformari ale obiectelor
3D. Primele doua, translatia si scalarea sunt simple extensii ale transformarilo
r 2D in trei dimensiuni. Celelalte 3 transformari sunt rotatii in spatiu, cate u
na pentru fiecare axa de coordonate. Apoi aceste 3 transformari vor fi combinate
pentru a obtine o rotatie in jurul unei axe arbitrare in spatiu.
Un obiect care este format din puncte conectate prin segmente de dreapta (avand
o suprafata poligonala) poate fi transformat prin transformarea succesiva a cape
telor segmentelor. Aceste puncte transformate vor fi apoi conectate intre ele pr
in segmente de dreapta. Proprietatea care permite aceasta abordare este liniarit
atea transformarilor 3D considerate.
Aplicarea transformarilor 3D se va face prin utilizarea matricilor de transforma
re care in acest caz vor fi de tipul:
TYPE mat = array[1..4,1..4] of real;
Punctele vor fi reprezentate in coordonate omogene de forma :
TYPE p_omogen = array[1..4] of real;
P[x, y, z, 1]
Coordonatele omogene ale unui punct transformat se vor obtine prin inmultirea ma
triceala:
Pt = Pi * M
Pi[xi, yi, zi,1]; Pi punctul initial
Pt[xt, yt, zt,1]; Pt punctul transformat
M matricea de transformari grafice 3D
Transformarea succesiva a unui punct, in conformitate cu matricile de transforma
re M1, M2, M3,..,Mn:
Pt = Pi * M1*M2*M3*..*Mn
este echivalenta cu transformarea
Pt = Pi * M , unde M=M1*M2*M3*..*Mn
2. Translatia
Translatia transforma punctul P(x,y,z) in punctul P'(x',y',z') dupa modelul
x' = x + tx
y' = y + ty
z' = z + tz
tx , ty , tz deplasarea in directiile x, y si z
Matricea transformarii este:
3. Scalarea
Scalarea unui punct in spatiu are ca efect relocarea sa in relatie cu un punct d
e referinta. Aplicata asupra unui obiect in spatiu, ea produce marirea sau micso
rarea obiectului in directiile x, y, z. Factorii de scalare pe cele 3 axe sunt n
otati sx , sy , sz . Daca sx = sy = sz se obtine o schimbare a dimensiunilor ob
iectului. Factorii 0<s<1 produc micsorarea dimensiunilor obiectului iar factorii
s>1 produc cresterea dimensiunilor obiectului.
Modelul transformarii este :
x' = x*sx
y' = y*sy
z' = z*sz
Matricea care realizeaza transformarea va fi de forma :
Cea mai frecventa utilizare a scalarii este in scopul modificarii dimensiunii un
ui obiect. Scalarea este intotdeauna relativa fata de un punct de referinta. For
mulele de mai sus sunt aplicabile atunci cand punctul de referinta este originea
. Pentru modificarea dimensiunii unui obiect fata de un punct al sau numit centr
u, este necesara compunerea a trei transformari: o translatie care aduce centrul
obiectului in originea sistemului de axe T-v, o scalare S si apoi o translatie
care readuce centrul obiectului in pozitia initiala T-v . Centrul corpului se va
specifica printr-un vector de pozitie V (vx , vy , vz ). Matricea transformarii
este :
M = T-v * S * Tv
4. Rotatia
Rotatia in spatiu prezinta 3 cazuri :
rotatia in jurul axei Ox
rotatia in jurul axei Oy
rotatia in jurul axei Oz
Matricea care permite rotatia in jurul axei x, in sensul acelor de ceasornic cu
un unghi Q (privind in lungul semiaxei Ox pozitive inspre origine) este:
Rotatia in jurul axei Oy, in sensul opus acelor de ceasornic cu un unghi Q (priv
ind in lungul semiaxei Oy pozitive inspre origine) este descrisa de matricea:
Rotatia in jurul axei Oz, in sensul acelor de ceasornic cu un unghi Q (privind i
n lungul semiaxei Oz pozitive inspre origine) este descrisa de matricea:
Rotatiile in sensul opus celui indicat se obtin schimband semnul celor doi facto
ri sin(Q) care apar in matricile de rotatie.
5. Rotatia in jurul unei drepte arbitrare in spatiu cu un unghi Q
De multe ori este necesara rotatia obiectelor 3D in jurul unei axe arbitrare in
spatiu, sau in jurul unei axe proprii de rotatie.
Directia axei de rotatie se specifica cu ajutorul a doi vectori :
V1 (x1, y1, z1)
V2 (x2, y2, z2)
Etapele parcurse pentru realizarea rotatiei vor fi :
1. translatia obiectului astfel incat punctul P1 sa devina centrul sistemului de
axe:
2. determinarea valorilor :
a = x2 - x1;
b = y2 - y1;
c = z2 - z1;
l = sqrt (a2 + b2 + c2 )
p = sqrt ( b2 + c2 ) proiectia segmentului P1P2 pe planul yOz
3. rotatia in jurul axei Ox pentru a aduce P1P2 in planul zOx cu unghiul Q. Din
figura se observa ca
cos (Q) = c / p;
sin (Q) = b / p;
desigur, daca p e nenul; daca p = 0 atunci P1P2 apartine planului xOz deci acest
pas nu mai este necesar. Se obtine matricea:
4. rotatia in jurul axei Oy cu unghiul R pentru a aduce segmentul P1P2 peste axa
Oz, avand
cos (R) = p / l;
sin (R) = a / l;
5. rotatie in jurul axei Oz cu unghiul Q
6. readucerea axei P1P2 in pozitia initiala prin reparcurgerea in ordine inversa
a etapelor anterioare.
Deci transformarea generala va fi :
M = T-P1 * Rx * Ry * Rz * R-y * R-x * TP1 (4)
Daca p=0 matricile Rx si Rx excluse din produsul matricial.
B. Implementare
In cadrul acestei lucrari se vor realiza procedurile si functiile necesare pentr
u realizarea operatiilor:
crearea matricilor de transformare
transformarea coordonatelor carteziene in coordonate omogene si reciproc
transformarea unui punct 3D
acestea vor face obiectul unitatii G3D_TRANSFORMARI.
/*======================================================================*/
/* G3Dtransformari.h */
/*======================================================================*/
/*
* Creaza matricea de translatie cu param. tx, ty, tz
*/
extern void tran_mat (double tx, double ty, double tz, MAT3D trans);
/*
* Creaza matricea de rotatie in jurul unei axe arbitrare a carei directie
* este precizata prin vectorii de pozitie v1, v2 cu unghiul q
*/
extern void rot_axa_mat (vector v1, vector v2, double q, MAT3D trans);
/*
* Creaza matricea de scalare cu parametrii sx, sy, sz relativ la punctul
* precizat de vectorul de pozitie v
*/
extern void scal_mat (vector v, double sx, double sy, double sz, MAT3D trans);
/*
* Transforma punctul initial Pin in puncul final Pout conform cu matricea
* de transformare m
*/
extern void transforma_punct (punct_3D pin, MAT3D m, punct_3D *pout);
/*======================================================================*/
/* End of G3Dtransformari.h */
/*======================================================================*/
/*======================================================================*/
/* G3Dtransformari.c */
/*======================================================================*/
#include <stdio.h>
#include <math.h>
#include "G2Dnucleu.h"
#include "G2Dprimitive.h"
#include "G3Dvizual.h"
#include "G3Dvector.h"
#include "G3Dmatrice.h"
/* Structuri private --------------------------------------------------- */
typedef double p_omogen[4];
/* Functii private --------------------------------------------------- */
/*
* Transforma puncul p din coordonate carteziene in coordonate omogene
*/
void real_omogen (punct_3D p, p_omogen q)
{
}
/*
* Transforma puncul q din coordonate omogene in coordonate carteziene
*/
void omogen_real (p_omogen q, punct_3D *p)
{
}
/* Functii publice --------------------------------------------------- */
/*
* Creaza matricea de translatie cu param. tx, ty, tz
*/
void tran_mat (double tx, double ty, double tz, MAT3D trans)
{
id_mat(trans);
trans[3][0] = tx;
trans[3][1] = ty;
trans[3][2] = tz;
}
/*
* Creaza matricea de rotatie in jurul unei axe Ox
*/
void rxmat (double c, double b, double p, MAT3D trans)
{
id_mat(trans);
trans[1][1] = c/p;
trans[1][2] = b/p;
trans[2][1] = -b/p;
trans[2][2] = c/p;
}
/*
* Creaza matricea de rotatie in jurul unei axe Oy
*/
void rymat (double p, double a, double l, MAT3D trans)
{
id_mat(trans);
trans[0][0] = p/l;
trans[0][2] = a/l;
trans[2][0] = -a/l;
trans[2][2] = p/l;
}
/*
* Creaza matricea de rotatie in jurul unei axe Oz
*/
void rzmat (double f, MAT3D trans)
{
id_mat(trans);
trans[0][0] = cos(f);
trans[0][1] = sin(f);
trans[1][0] = -sin(f);
trans[1][1] = cos(f);
}
/*
* Creaza matricea de rotatie in jurul unei axe arbitrare a carei directie
* este precizata prin vectorii de pozitie v1, v2 cu unghiul q
*/
void rot_axa_mat (vector v1, vector v2, double q, MAT3D trans)
{
double a,b,c,p,l;
MAT3D aux;
id_mat (trans);
a = v2.x - v1.x;
b = v2.y - v1.y;
c = v2.z - v1.z;
l = sqrt(a*a+b*b+c*c);
p = sqrt(b*b+c*c);
tran_mat (-v1.x, -v1.y, -v1.z, aux);
mult_mat (trans, aux);
if (p > 0.0001)
{
rxmat (c, b, p, aux);
mult_mat (trans, aux);
}
rymat (p, a, l, aux);
mult_mat (trans, aux);
rzmat (q*M_PI/180, aux);
mult_mat (trans, aux);
rymat (p, -a, l, aux);
mult_mat (trans, aux);
if (p > 0.0001)
{
rxmat (c, -b, p, aux);
mult_mat (trans, aux);
}
tran_mat (v1.x, v1.y, v1.z, aux);
mult_mat (trans, aux);
}
/*
* Creaza matricea de scalare cu parametrii sx, sy, sz relativ la punctul
* precizat de vectorul de pozitie v
*/
void scal_mat (vector v, double sx, double sy, double sz, MAT3D trans)
{
MAT3D mt;
id_mat (trans);
tran_mat (-v.x, -v.y, -v.z, mt);
mult_mat (trans, mt);
id_mat (mt);
mt[0][0] = sx;
mt[1][1] = sy;
mt[2][2] = sz;
mult_mat (trans, mt);
tran_mat (v.x, v.y, v.z, mt);
mult_mat (trans, mt);
}
/*
* Transforma punctul initial Pin in puncul final Pout conform cu matricea
* de transformare m
*/
void transforma_punct (punct_3D pin, MAT3D m, punct_3D *pout)
{
/* Transforma Pin in coordonate omogene
* Inmulteste la stanga cu matricea de transformare m
* Transforma punctul obtinut in coordonate carteziene ->Pout
*/
}

S-ar putea să vă placă și