[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 transformarilor 2D in trei dimensiuni. Celelalte 3 transformari sunt rotatii in spatiu, cate una 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 capetelor segmentelor. Aceste puncte transformate vor fi apoi conectate intre ele prin segmente de dreapta. Proprietatea care permite aceasta abordare este liniaritatea transformarilor 3D considerate.

Aplicarea transformarilor 3D se va face prin utilizarea matricilor de transformare 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 matriceala:

	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 transformare 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 de referinta. Aplicata asupra unui obiect in spatiu, ea produce marirea sau micsorarea obiectului in directiile x, y, z. Factorii de scalare pe cele 3 axe sunt notati sx , sy , sz . Daca sx = sy = sz  se obtine o schimbare a dimensiunilor obiectului. 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 unui obiect. Scalarea este intotdeauna relativa fata de un punct de referinta. Formulele de mai sus sunt aplicabile atunci cand punctul de referinta este originea. Pentru modificarea dimensiunii unui obiect fata de un punct al sau numit centru, 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 (privind 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 in lungul semiaxei Oz pozitive inspre origine) este descrisa de matricea:

Rotatiile in sensul opus celui indicat se obtin schimband semnul celor doi factori 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 R–x excluse din produsul matricial.

B. Implementare

In cadrul acestei lucrari se vor realiza procedurile si functiile necesare pentru 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
   */
}


/*======================================================================*/
/* End of G3Dtransformari.c                                             */
/*======================================================================*/

Download G3Dtransformari.h, G3Dtransformari.c.

C. Aplicatii

1. Realizati si implementati procedurile si functiile prezentate in textul lucrarii pentru realizarea transformarilor 3D.

2. Definiti in spatiul obiect un cub cu un colt tesit, cu centrul in origine, ca un tablou de muchii si realizati urmatoarele transformari asupra acestuia:

  • marirea cubului cu 10 unitati in toate directiile
  • rotatia cubului cu 45º in jurul axei OX
  • rotatia cubului cu 60º in jurul axei OY
  • reprezentarea cubului
  • readucerea cubului in pozitia initiala
  • rotatia cubului cu 60º in jurul axei OY
  • rotatia cubului cu 45º in jurul axei OX
  • reprezentarea cubului

Observati cele 2 rezultate si formulati concluziile.

3. Rotiti cubul de la punctul 2 cu 45º in jurul diagonalei sale principale (0,0,0)-->(1,1,1).

4. Translatati cubul astfel incat punctul de coordonate (0,0,0) sa devina (10,10,10). Rotiti cubul in jurul unei axe paralele cu OY cu 30º, cu centru de rotatie in centrul cubului.

Observatie:
Efectuati punctele 2, 3, 4 utilizand toate tipurile de proiectii realizate. Se va avea grija la definirea ferestrei din planul de proiectie si la regiunea de clipping.

 

Home ][ Up ][ Previous ][ Next ]

Send mail to sorin@aspc.cs.utt.ro with questions or comments about this web site.
Copyright © 2000 Graphics Laboratory
Last modified: March 29, 2000