Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
a) Translatia cu vectorul V = tx*i+ty*j+tz*k
Punctul P(x,y,z) translatat cu vectorul V va avea coordonatele (x',y',z'), unde:
x' = x + tx , y' = y + ty, z' = z + tz
b) Scalarea fata de origine cu factorii de scalare sx, sy, sz
Punctul P(x,y,z) scalat fata de originea sistemului de coordonate cu factorii de
scalare sx, sy, sz va avea coordonatele (x',y',z'), unde:
x' = x * sx, y' = y * sy, z' = z * sz
c) Rotatia in jurul unei axe a sistemului de coordonate
(c1) Rotatia in jurul axei OX - echivalenta cu rotatia intr-un plan x=constant
Coordonatele punctului P(x,y,z) rotit cu unghiul alfa in jurul axei OX
sunt
x' = x
y' = y * cos(alfa) - z * sin(alfa)
z' = y * sin(alfa) + z * cos(alfa)
(c2) Rotatia in jurul axei OY - echivalenta cu rotatia intr-un plan y=constant
Coordonatele punctului P(x,y,z) rotit cu unghiul alfa in jurul axei OY sunt:
x' = x * cos(alfa) + z * sin(alfa)
y' = y
z' = -x * sin(alfa) + z * cos(alfa)
(c3) Rotatia in jurul axei OZ - echivalenta cu rotatia intr-un plan z=constant
Coordonatele punctului P(x,y,z) rotit cu unghiul alfa in jurul axei OZ sunt:
x' = x * cos(alfa) - y * sin(alfa)
y' = x * sin(alfa) + y * cos(alfa)
z' = z
Orice transformare in spatiul 3D se poate exprima ca o transformare compusa din transformarile elementare mentionate mai sus. Pentru obtinerea transformarii compuse se inmultesc matricile care exprima transformarile elementare in coordonate omogene.
Afisarea unui obiect 3D pe ecran presupune efectuarea urmatoarei secvente de operatii:
Transformarea geometrica a obiectului pentru a-l aduce in pozitia si orientarea in care se doreste a fi vizualizat;
Proiectia sa;
Calculul dreptunghiului de incadrare a punctelor rezultate din proiectie, in planul de proiectie. De exemplu, daca s-a efectuat o proiectie in planul XOY, trebuie sa se calculeze punctul (xmin, ymin) si punctul (xmax, ymax).
Se executa apelul:
fereastra(xmin,ymin,xmax,ymax);
Se apeleaza functia poarta(), pentru stabilirea zonei in care se va afisa obiectul:
poarta(x1,y1,x2,y2);
Se afiseaza proiectia obiectului. Daca se folosesc functiile din Java AWT, atunci asupra fiecarei coordonate trebuie efectuata transformarea fereastra-poarta, apeland functiile xDisp() si yDisp(). Daca se lucreaza cu functiile grafice din Java2D, atunci este suficient sa se seteze matricea transformarii de vizualizare in obiectul Graphics2D folosit la afisare.
Observatie: In cazul in care se doreste obtinerea efectului de animatie aplicand transformari geometrice succesive unui obiect 3D, se va calcula o fereastra 2D care sa incadreze oricare dintre proiectiile obiectului, dupa fiecare transformare geometrica fiind necesara o noua proiectie. Functia fereastra() va fi apelata o singura data, la inceputul programului, transmitandu-i-se limitele ferestrei 2D incadratoare.
Proiectiile sunt aplicatii care transforma puncte dintr-un sistem de coordonate n-dimensional intr-un sistem k-dimensional, unde k<n. Proiectia unui obiect 3D intr-un plan de proiectie 2D este determinata de multimea punctelor de intersectie ale planului cu dreptele care pornesc dintr-un punct, numit centru de proiectie, fiecare trecand printr-un punct ale obiectului. Aceste drepte se numesc proiectori.
In functie de pozitia centrului de proiectie, proiectiile se clasifica in:
proiectii perspectiva - centrul de proiectie este la distanta finita de planul de proiectie;
proiectii paralele - centrul de proiectie este la infinit. Proiectorii sunt linii paralele care trec prin punctele ce definesc obiectul 3D. Directia proiectorilor se numeste directia de proiectie.
Proiectia perspectiva ofera o imagine plana a scenei 3D asemanatoare cu imaginea obtinuta cu ajutorul unui aparat de fotografiat. Se caracterizeaza prin:
efectul de micsorare a obiectului proiectat, proportionala cu distanta de la obiect la centrul de proiectie. Marimea proiectiei unui obiect este invers proportionala cu distanta de la obiect la centrul de proiectie.
nu pastreaza proprietatea de paralelism pentru liniile care nu sunt paralele cu planul de proiectie. Proiectia unui set de linii paralele care nu sunt paralele cu planul de proiectie este un set de linii convergente catre un punct din planul de proiectie, numit punct de convergenta.
Proiectia paralela conserva proprietatea de paralelism. De asemenea, fetele obiectului care sunt paralele cu planul de proiectie isi pastreaza forma si dimensiunea in urma proiectiei. Dupa directia proiectorilor fata de planul de proiectie, proiectiile paralele se clasifica in:
proiectii ortografice - proiectorii sunt perpendiculari pe planul de proiectie;
proiectii oblice - proiectorii nu sunt perpendiculari pe planul de proiectie.
Fie P un punct din spatiu, de coordonate (x,y,z), care se proiecteaza in punctul P'(x',y') din planul de proiectie. Coordonatele punctului P' se determina cu urmatoarele relatii:
(a) Pentru proiectie paralela dupa directia de proiectie D[a b c]
x' = x - ( a / c ) * z
y' = y - ( b / c ) * z
Pentru o proiectie ortografica in planul XOY, directia de proiectie este D[0 0 1].
(b) Pentru proiectie perspectiva din centrul de proiectie CP(a,b,c)
x'= ( a * z - c * x ) / ( z - c )
y'= ( b * z - c * y ) / ( z - c )
Proiectii axonometrice
O proiectie axonometrica este o proiectie ortografica intr-un plan care nu este paralel cu nici unul dintre planele principale. Imaginea obtinuta printr-o proiectie axonometrica este echivalenta cu una obtinuta printr-o proiectie ortografica in planul XOY, efectuata dupa ce obiectului de proiectat i s-a aplicat o transformare geometrica. Transformarea consta din rotatie in jurul axelor OX si OY. Fie
PA = Ry(uy)*Rx(ux)
unde Ry(uy) si Rx(ux) sunt matricile de rotatie in jurul axei y, cu un unghi uy, respectiv in jurul axei x, cu un unghi ux. Alegand corespunzator unghiurile uy si ux, obtinem cele doua cazuri particulare de proiectie axonometrica:
Proiectia izometrica - pentru ux = +/-35.26°
uy = +/-45°
Proiectia dimetrica - pentru ux = +/-20.705°
uy = +/-22.208°
Sa se creeze o clasa Transform3D care sa implementeze toate tipurile de transformari geometrice 3D si proiectii. De exemplu:
import java.awt.geom.*;
import java.awt.*;
public class Transform3D
public static Point3D rotatieOY
(Point3D P, float cosu, float sinu)
public static Point2D.Float proiectieParalela
(Point3D P, float a, float b, float c) throws Exception
Sa se creeze o clasa Obiect3D, pentru a reprezenta orice obiect tri-dimensional intr-o aplicatie. Reprezentarea trebuie sa permita afisarea obiectelor atat prin laturi (wire-frame) cat si prin fetele vizibile. Se va folosi urmatorul model:
import java.applet.*;
import java.awt.geom.*;
import java.awt.*;
public class Obiect3D
public void desenLaturi(Graphics g, Vizual2D v, Color c)
public void proiectie(int tip, float a, float b, float c)
catch (Exception e)
return;
case 1 :
..
return;
}
public void rotatie( char axa, float cosu, float sinu)
public Rectangle2D.Float fereastra()
return new Rectangle2D.Float
(xmin, ymin, xmax - xmin, ymax - ymin);
public class Fata
Una dintre clasele fundamentale de algoritmi in domeniul reprezentarii grafice realiste a scenelor 3D trateaza problema eliminarii fetelor nevizibile ale obiectelor din componenta unei scene.
Metoda Back Face Culling permite determinarea fetelor nevizibile ale unui obiect poliedral convex. Algoritmul presupune 'orientarea' fetelor obiectului astfel incat vectorul normal la fiecare fata sa fie indreptat spre exteriorul obiectului. Pentru aceasta, lista varfurilor fiecarei fete trebuie sa fie astfel incat parcurgand-o sa rezulte o traversare in sens trigonometric a conturului fetei.
Vectorul normal la planul unei fete se poate calcula ca produs vectorial al doi vectori ce corespund la doua laturi adiacente intr-un varf al fetei. Fie A(x0,y0,z0), B(x1,y1,z1), C(x2,y2,z2) trei varfuri consecutive in lista varfurilor unei fete. Normala la fata se determina astfel:
_ _ _
_ __ __ i j k _ _ _
N = AB x BC = x1-x0 y1-y0 z1-z0 = Nx i + Ny j + Nz k
x2-x1 y2-y1 z2-z1
Fie N vectorul normal la fata si D vectorul care pleaca din acelasi punct cu N si este orientat catre observator (paralel cu directia de proiectie in cazul proiectiei paralele). Daca unghiul dintre cei doi vectori este mai mic de 90° atunci fata este vizibila din pozitia observatorului.
Pentru determinarea vizibilitatii se calculeaza produsul scalar al celor doi vectori:
D.N = Dx * Nx + Dy * Ny + Dz * Nz = |D| * |N| * cos(alfa)
N
D
Pentru alfa mai mic de 90°, cos(alfa)>0, deci D.N>0.
Vizibilitatea unei fete se determina pe baza semnului produsului scalar, astfel:
D . N > 0 => fata vizibila
D . N < 0 => fata nevizibila
D . N = 0 => directia de proiectie este paralela cu planul
fetei (fata se reduce la o dreapta)
Timpul de executie al algoritmului variaza liniar in functie de numarul de fete ale obiectului.
Copyright © 2024 - Toate drepturile rezervate