Sunteți pe pagina 1din 47

Determinarea vizibilitatii

Determinarea vizibilitatii

Algoritmi de eliminare a partilor nevizibile


Obiecte 3D
Modelare

Vizualiare

Transformarea
Decupare

fereastrapoarta

Proiectie

Generare primitive

Imagine

Algoritmul Back Face Culling

Algoritmul Back Face Culling


Eliminarea fetelor spate

Poligon spate

Algoritmi de eliminare a partilor nevizibile


Obiecte 3D
Modelare

Eliminare fete spate


Vizualiare

Transformarea
Decupare

fereastrapoarta

Proiectie

Generare primitive

Imagine

Algoritmul Back Face Culling


Suprafete convexe

Algoritmul Back Face Culling

->
N

(x1,y1,z1)

(x0,y0,z0)

i
j
k
N v1 v2 x1 - x0 y1- y0 z1- z0
x2 - x1 y2- y1 z2 - z1
-

v1

--

--

v2
(x2,y2,z2)

N Nx * i Ny * j Nz * k

Back-face culling

F2
F1

: [0o, 90o) poligon spate


: 90o poligon = latura
: (90o, 180o] poligon fata
9

Algoritmul Back Face Culling

Fete spate

Fete fata

10

Algoritmul Back Face Culling - OpenGL

glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glCullFace(GL_BACK);

11

Algoritmi de eliminare a partilor nevizibile

Algoritmi in spatiul imagine

Algoritmi in spatiul obiect

12

Algoritmi de eliminare a partilor nevizibile

Algoritmi in spatiul imagine

for fiecare pixel P

determina obiectul O cel mai apropiat de


observator de-a lungul proiectorului ce trece
prin P
afiseaza pixelul P in culoarea obiectului O

13

Algoritmi de eliminare a partilor nevizibile

Algoritmi in spatiul obiect

for fiecare obiect O al scenei

Determina partile vizibile ale obiectului O


(parti care nu sunt obturate de alte parti ale
sale sau de alte obiecte)
Afiseaza partile vizibile ale obiectului O

14

Eliminarea partilor nevizibile


Algoritmul z-buffer
Obiecte 3D
Modelare

Vizualiare

Transformarea
Decupare

fereastrapoarta

Proiectie

Generare primitive

Imagine

15

Algoritmul z-buffer
1

3
2

Algoritm in spatiul imagine


Nu exista o ordine prestabilita pentru afisarea
poligoanelor
16

Algoritmul z-buffer

Necesita ca strucura de date un buffer avand un


numar de elemente egal cu rezolutia ecranului
Un element din buffer memoreaza informatia de
adancime (z) asociata pixelului (x, y)
Pentru fiecare pixel este memorata si culoarea
asociata
Poate fi implementat hard si soft

17

Exemplu - Z-buffer

18

Exemplu - Z-buffer

19

Exemplu - Z-buffer

20

Algoritmul z-buffer
//initializare
pentru fiecare pixel ecran (x, y)
ScriePixel(x, y, culoare_fond);
z_buff[x][y] = zmax; //zmax = z planului spate al
//volumului de vizualizare
pentru fiecare poligon P
pentru fiecare fragment (x, y, z) interior
daca z > z_buff[x][y] atunci
z_buff[x][y] = z;
cul = culoare fragment;
ScriePixel(x, y, cul);

21

Algoritmul z-Buffer

Informatia de adancime pierde


rapid precizia
Z-fighting

In OpenGL se poate folosi functia


PoligonOffset

22

Algoritmul z-Buffer - OpenGL

glEnable(GL_DEPTH_TEST);
glDisable(GL_DEPTH_TEST);

glDepthFunc(functie);

functie: GL_LESS, GL_LEQUAL,


GL_EQUAL, GL_NOTEQUAL, GL_GREATER, GL_GEQUAL,

glDepthMask(flag);

flag: GL_FALSE, GL_TRUE


23

Algoritmul de partitionare binara a spatiului

Algoritm in spatiul obiect


Spatiul se partitioneaza prin plane de partitionare
in mai multe zone
Procesul de partitionare continua pana se ajunge
la o zona cu un singur poligon
In raport cu pozitia observatorului, algoritmul
stabileste ordinea de afisare a seturilor de fete,
pornind de la cea mai indepartata pana la cea
mai apropiata
24

Algoritmul de partitionare binara a spatiului


semiplan fata
F1

->
N

P - plan de partitionare

F2
semiplan spate

1.Daca observatorul se afla in semiplanul fata al planului P, atunci


ordinea de afisare a fetelor va fi F2, F1
2.Daca observatorul se afla in semiplanul spate al planului P, atunci
ordinea de afisare a fetelor va fi: F1, F2
25

Algoritmul de partitionare binara a spatiului

C
4

A
F

S
B

C
F

B
1

26

Algoritmul de partitionare binara a spatiului

C
4

A
F

S
B

B
1

Obs
27

Algoritmul de partitionare binara a spatiului


5

6
28

Algoritmul de partitionare binara a spatiului

5
F

3b
2

4b

2, 3b, 4b, 5

3a, 4a, 6

1
4a

3a
6

29

Algoritmul de partitionare binara a spatiului

2, 3b, 4b, 5

5b
S

F
4b, 5a

3a, 4a, 6

3a

2
S
3b,5b

5a

3b

4b

4a, 6

1
4a

3a
6

30

Algoritmul de partitionare binara a spatiului

2, 3b, 4b, 5

5b
S

3a, 4a, 6

3a

3b

3b

4b, 5a

5a

4b

4a, 6

F
5b

1
4a

3a
6

31

Algoritmul de partitionare binara a spatiului

5b

S
3a

5a

5b

4b

4a

3b

3b

4b

5a

4a

3a
6

32

Algoritmul de partitionare binara a spatiului


ConstruiesteArbore(ListaPoligoane LP)
daca LP == vida atunci intoarce NULL;
P = alege un poligon din LP;
Radacina = P;
elimina P din LP
LFata = LSpate = NULL;
pentru fiecare poligon Q din LP
daca Q este in semiplanul fata planului Radacinii atunci
Insereaza(Q, LFata);
altfel
daca Q este in semiplanul spate planului Radacinii atunci
Insereaza(Q, LSpate);
altfel
descompune Q in QF si QS;
Insereaza(QF, LFata);
Insereaza(QS, LSpate);
intoarce Arbore(Radacina, ConstruiesteArbore(LFata),
ConstruiesteArbore(LSpate));
33

Algoritmul de partitionare binara a spatiului


AfisareScena(Arbore A)
daca A == vid atunci stop;
daca observatorul este in fata planului Radacinii atunci
AfisareScena(A->FiuSpate);
Afisare Radacina
AfisareScena(A->FiuFata);
altfel
AfisareScena(A->FiuFata);
Afisare Radacina
AfisareScena(A->FiuSpate);
34

Algoritmul Warnock
Divizeaza recursiv zona de afisare, pana se poate
determina poligonul vizibil in acea zona sau
dimensiunea zonei este 1 pixel.

acoperitor

intersectat

inclus

disjunct

35

Algoritmul Warnock

36

Algoritmul Warnock
0

0 disjunct
1 intersectat
1

M mai multe
fete poligonale

0
37

Algoritmul Warnock

38

Algoritmul Warnock

M M M 1
M M M M
M M M M 1

M M M M M 0

39

Algoritmul Warnock

40

Algoritmul Warnock

acoperitor

intersectat

inclus

disjunct

Poligoane:
acoperitoare

incluse
41

Algoritmul Warnock
Obiecte 3D
Modelare

Vizualiare

Transformarea
Decupare

fereastrapoarta

Proiectie

Generare primitive

Imagine

Divizarea spatiului
42

Algoritmul Warnock

O zona de afisare cu dimensiunea mai mare


de 1 pixel nu va mai fi divizata daca:

toate poligoanele sunt disjuncte fata de zona


considerata
exista doar un poligon ce poate fi inclus sau
acoperitor
exista mai multe poligoane incluse sau
acoperitoare, dar cel mai apropiat de
observator este un poligon acoperitor
43

Algoritmul Warnock
Warnock(Zona Z, ListaPligoane LP)
{ clasifica poligoanele din LP (poligoane incluse,
acoperitoare, disjuncte, intersectate =
incluse+disjunctte)
elimina poligoanele disjuncte din LP
ordoneaza poligoanele din LP in ordine
descrescatoare dupa zmin al fiecarui poligon
elimina din LP poligoanele care se afla in spatele
primului (cel mai apropiat de observator)
poligon acoperitor
44

Algoritmul Warnock
daca LP == vida atunci
afiseaza zona Z in culoarea de fond;
stop;
daca LP contine un singur poligon atunci
daca P este inclus atunci
afiseaza zona Z in culoarea de fond;
afiseaza poligon
daca P este acoperitor atunci
afiseaza zona Z in culoare poligon
stop;

45

Algoritmul Warnock
daca zona Z are dimensiunea de 1 pixel (x, y)
atunci
pentru fiecare poligon P din LP
calculeaza z(x, y);
determina max pentru z(x, y);
afiseaza pixelul (x,y) in culoarea poligonului
cu z(x, y) max
stop;
Warnock(Z1,
Warnock(Z2,
Warnock(Z3,
Warnock(Z4,

LP);
LP);
LP);
LP);

Z1

Z2

Z3

Z4

46

Algoritmul Warnock
Warnock(Zona Z, ListaPligoane LP)
{ clasifica poligoanele din LP (poligoane incluse, acoperitoare, disjuncte, intersectate =
incluse+disjunctte)
elimina poligoanele disjuncte din LP
ordoneaza poligoanele din LP in ordine descrescatoare dupa zmin al fiecarui poligon
elimina din LP poligoanele care se afla in spatele primului (cel mai apropiat de
observator) poligon acoperitor
daca LP == vida atunci
afiseaza zona Z in culoarea de fond;
stop;
daca LP contine un singur poligon atunci
daca P este inclus atunci
afiseaza zona Z in culoarea de fond; afiseaza poligon
daca P este acoperitor atunci
afiseaza zona Z in culoare poligon
stop;
daca zona Z are dimensiunea de 1 pixel (x, y) atunci
pentru fiecare poligon P din LP calculeaza z(x, y);
determina max pentru z(x, y);
afiseaza pixelul (x,y) in culoarea poligonului cu z(x, y) max
Z
stop;
Z1 Z2
Warnock(Z1, LP); Warnock(Z2, LP);
Warnock(Z3, LP); Warnock(Z4, LP);
}

Z3

Z4

47

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