Sunteți pe pagina 1din 65

Transformarea de vizualizare 3D

Specificarea sistemului de coordonate de


vizualizare
Transformarea in sistemul de coordonate de
vizualizare
Specificarea volumului de vizualizare
Transformarea in volum de vizualizare canonic

Definirea sistemului de coordonate de vizualizare


v

->
N - normala la planul de vizualizare
--->
VUP - vectorul sus la planul de vizualizare

-->
VV
--->
UP

PRV - punct de referinta de vizualizare


PRV

->
N

-->
---> ->
VU = UP x N
-->
VU

--> -> -->


VV = N x VU
u

plan de vizualizare

Transformarea in sistemul de coordonate de


vizualizare
Sistem de
coordonate real

Translatie

Sistem de
coordonate de
vizualizare

Alinierea axelor

VU x VU y

VVx VVy
Nx Ny

0
0

VU z 0

VVz 0
T(-PRVx , - PRVy , - PRVz )
Nz 0

0 1
3

Definirea volumului de vizualizare

v
fereastra

PRV (umax, vmax)


(umin, vmin)
n

plan de vizualizare

Definirea volumului de vizualizare


Proiectia perspectiva
PRP punct de referinta de proiectie

fereastra

Volum de
vizualizare

(umax, vmax)

PRP
(umin, vmin)

Definirea volumului de vizualizare


Proiectia paralela
PRP punct de referinta de proiectie

fereastra

Volum de
vizualizare

CF (umax, vmax)
(umin, vmin)
PRP

CF - centrul ferestrei
PRP-CF - directia de proiectie

Definirea volumului de vizualizare


Proiectia perspectiva

plan de vizualizare
plan spate
plan fata

PRP
n

Definirea volumului de vizualizare


Proiectia paralela
planul spate
plan de vizualizare

planul fata

n
F

Definirea volumului de vizualizare canonic


Proiectia perspectiva
x sau y

Planele delimitatoare:
plan spate
zmin

-1

-z

x=z, x=-z
y=z, y=-z
z=zmin, z=-1, zmin < 0

plan fata

Definirea volumului de vizualizare canonic


Proiectia paralela
x sau y

Planele delimitatoare:

plan spate
0
plan fata

-1

-z

x=1, x=-1
y=1, y=-1
z=0, z=-1

-1

10

Transformarea in volumul de vizualizare


canonic
PROIECTIE PARALELA
planul spate
plan de vizualizare

x sau y
1

plan spate

planul fata

-1

-z

plan fata
-1

n
F

11

Alinierea axei de simetrie cu axa n


PROIECTIE PARALELA
Plan
spate

Plan de
vizualizare
Plan fata

Directia de
proiectie

Plan
spate

Directia de
proiectie
Plan de
vizualizare
Plan fata

12

Transformarea in volumul de vizualizare


canonic

Proiectia paralela

Forfecare, astfel incat directia de proiectie


sa devina paralela cu axa n
Translatie si scalare in volumul de
vizualizare canonic

13

Transformarea in volumul de vizualizare


canonic
PROIECTIE PERSPECTIVA
plan de vizualizare
plan spate
plan fata
x sau y

PRP
plan spate

zmin

-1

-z

plan fata

14

Alinierea axei de simetrie cu axa n


PROIECTIE PERSPECTIVA
Plan
spate
Plan de
vizualizare
Plan
fata

PRP

Plan
spate
N

Plan de
vizualizare
N

Plan
fata

PRP

15

Lantul transformarilor in volumul de vizualizare


canonic

Proiectia pespectiva

Forfecare, astfel incat axa de simetrie a


piramidei sa devina axa n
Scalare in volumul de vizualizare canonic

16

Transformarea in viewport 3D

Volumul de vizualizare canonic se transforma


in viewport 3D cub cu latura l, 0<l<=1, cu
fetele paralele cu planele sistemului de
coordonate, centrat in origine:

0<=x<=1
0<=y<=1
0<=z<=1

(xvmin<=x<=xvmax
yvmin<=y<=yvmax
zvmin<=z<=zvmax)

Fata z = zvmin sau zvmax reprezinta planul


de proiectie, care se mapeaza in poarta de
afisare

17

Transformarea volumului vizual canonic in


viewport 3D

Proiectia paralela
x sau y
1

plan spate
0

-1

-z

plan fata
-1

Translatia (-1,-1,-1) -> origine


Scalare((xvmax-xvmin)/2, (yvmax-yvmin)/2,
(zvmax-zvmin))
Translatia (0,0,0) -> (xvmin, yvmin, zvmin)
18

Transformarea volumului vizual canonic in


viewport 3D

Proiectia perspectiva
x sau y
plan spate

zmin

-1

-z

plan fata

Transformarea in volumul de vizualizare canonic


pentru proiectia paralela transformarea
perspectiva
Lantul de transformari de la transformarea in
viewport 3D de la proiectia paralela
19

Transformarea perspectiva
x sau y

x sau y
plan spate

plan spate
0
zmin

-1

-z

-1

-z

plan fata
-1

plan fata

Proiectie perspectiva cu centrul de proiectie in (0,0,0) si plan


de proiectie z=-1
1

0
P
=
perspectiva 0
0

0 0 0
1 0 0
0 1 0

1
0
0
d

(-zmin, -zmin, zmin) se


proiecteaza in (1,1, -1)
(zmin, zmin, zmin) se
proiecteaza in (-1,-1, -1)
20

Transformarea perspectiva
Variatia coordonatei z in intervalul [0, 1]
1

0
T
=
perspectiva 0

a=

1
1 + zmin

Tperspectiva

1
0

=
0

b= -

0
1
0
0

0
0
a
-1

zmin
1 + zmin

1
1 + zmin
0
-1
0

0
0
b

zmin

1 + zmin
0

21

OpenGL

Biblioiteca grafica independenta de platforma


hardware

Caracteristici OpenGL
Desenare obiecte
Transformarea de vizualizare
Culori, iluminare
Eliminarea partilor nevizibile
Maparea texturilor
Lucrul cu imagini

22

OpenGL

Biblioteca OpenGL
gl*() - gl.h
Biblioteci suplimentare

OpenGL Utility Library (GLU): glu*() - glu.h


GLUT (OpenGL Utility Toolkit): glut*() - glut.h

23

Formatul functiilor OpenGL

glNume_Functie2f(x, y)

Numar componente/
Dimensiuni
2 (x,y)
3 (x,y,z)
4 (x,y,z,w) sau
(r,g,b,a)

B
ub
s
us
i
ui
f
d

byte
unsigned byte
short
unsigned short
int
unsigned int
float
double

Se adauga v
pentru forma
vectoriala
glVertex2fv(v)

24

glVertex

glVertex3f (x,y,z);
Numele
Functie din
biblioteca

de baza al 3 argumente
functiei

Argumente
numere reale

OpenGL

25

Descrierea Primitivelor

Puncte
Linii
Poligoane

26

Tipuri de primitive

GL_POINTS

GL_LINE
{S | _LOOP | _STRIP }

GL_POLYGON

27

Tipuri de primitive

GL_TRIANGLE
{S | _STRIP | _FAN}

GL_QUAD
{S | _STRIP}

28

Exemplu - Afisarea primitivelor

glBegin(GL_POLYGON)
glVertex2f( 0.0,
glVertex2f( 0.0,
glVertex2f( 3.0,
glVertex2f( 4.0,
glVertex2f( 2.0,
glEnd();

0.0
3.0
3.0
1.5
0.0

);
);
);
);
);

GL_POLYGON

29

Lantul de transformari in OpenGL

Transformarea de modelare
Transformarea de vizualizare
Transformarea de proiectie (inclusiv
decupare)
Impartire perspectiva
Transformarea in poarta de afisare
Transformarile sunt pastrate sub forma
matricilor 4x4, in reprezentarea coloana
30

Lantul de transformari in OpenGL


varf (x, y, z, w)

Coordonate de
vizualizare
Coordonate de
decupare
Coordonate dispozitiv
normalizate

Transformarea de
modelare - vizualizare
Transformarea de
proiectie
Impartirea
perspectiva
Transformarea in
poarta de afisare

Coordonate dispozitiv (x, y)

31

Ttransformarea de modelare
Obiecte definite in
sisteme de
coordonate proprii
(sisteme de
coordonate locale)

Transformarea de
modelare

Obiecte definite fata


de acelasi sistem de
coordonate (sistem
de coordonate global)

Sistem obiect

Sistem real

glTranslate{fd}(tx, ty, tz)


glScale{fd}(sx, sy, sz)
glRotate{fd}(u, x, y, z)

glRotate{fd}(u, 1, 0,0);
glRotate{fd}(u, 0, 1,0);
glRotate{fd}(u, 0, 0,1);

32

Exemplu Transformarea de modelare

glLoadIdentity();
A desen();

A
B

glLoadIdentity();
B glTranslatef(-20.0, 0.0, 0.0);
desen();

33

Stive de matrici

void glPushMatrix( void );


void glPopMatrix( void );

34

Exemplu
A

glPushMatrix();
desen();
glPopMatrix();

glPushMatrix();
glTranslatef(10,0,10);
desen();
glPopMatrix();

glPushMatrix();
glTranslatef(40,0,0);
glRotatef(45.0,0,1,0);
desen();
glPopMatrix();

20
10
0

A
0

10

20

30

40

50

60

35

Transformarea de vizualizare

Pozitionarea observatorului in scena:

gluLookAt(ox,oy,oz,cx,cy,cz,upx,upy,upz)

Obs(ox,oy,oz)-pozitia observatorului
C(cx,cy,cz)-punctul catre care se priveste
upx,upy,upz-componentele vectorului sus
Vector up
(upx, upy, upz)
(ox, oy, oz)
Sistem
real

(cx, cy, cz)

36

Transformarea de vizualizare
v
y

n
Obs

C
Sistem
real

x
z

Sistem de coordonate
de vizualizare

Implicit:

observatorul pozitionat in originea sistemului de coordonate


utilizator
priveste de-a lungul axei z negative
directia vectorului sus este data de directia axei y pozitiva

37

Transformarea de proiectie

Proiectie paralela

glOrtho(l, r, b, t, n, f);

Proiectie perspectiva

glFrustum(l, r, b, t, n, f);

void gluPerspective(fovy, aspect, n, f);

38

Proiectie perspectiva
glFrustum(l, r, b, t, n, f)

y
z
x

b
n

39

Proiectie perspectiva
gluPerspective(fovy, aspect, n, f)

y
z

y
fovy

z
obs

aspect = w / h

w
h
x
n

40

Proiectie paralela
glOrtho(l, r, b, t, n, f)
t

l
y
z
x

b
n

41

Proiectie

Volum de vizualizare

Proiectie paralela
Proiectie perspectiva

Volum de vizualizare canonic: cub centrat in


origine, cu fetele paralele cu planele
sistemului de coordonate:

-w<=x<=w
-w<=y<=w
-w<=z<=w
42

Impartirea perspectiva

Transformarea din coordonate omogene


in coordonate carteziene (w=1)
Volumul de vizualizare canonic devine:
cub cu fetele paralele cu planele
sistemului de coordonate:

-1<=x<=1
-1<=y<=1
-1<=z<=1
43

Transformarea in poarta de afisare

Fata (-1,-1,-1) (1,1,-1) se mapeaza in


poarta de afisare
Poarta de afisare:

glViewport(px,py,w,h)
w
poarta de
afisare

(px,py)

44

Matrici de transformare

glMatrixMode(mod)

GL_MODELVIEW
GL_PROJECTION
GL_TEXTURE

void glLoadIdentity();
void glLoadMatrix{fd}(const TYPE *m);
void glMultMatrix{fd}(const TYPE *m);

45

Atribute de afisare
void glPointSize(GLfloat dim);
void glLineWidth(GLfloat w);
void glLineStipple(GLint factor, GLushort sablon);
glEnable(GL_LINE_STIPPLE)
glDisable(GL_LINE_STIPPLE)

void glPolygonStipple(const GLubyte *masca);


glEnable(GL_POLYGON_STIPPLE)
glDisable(GL_POLYGON_STIPPLE)

46

Afisarea poligoanelor
void glPolygonMode( GLenum fata, GLenum mod );
fata: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
mod: GL_POINT, GL_LINE, or GL_FILL

void glFrontFace( GLenum mod );


mod: GL_CCW, GL_CW

void glCullFace( GLenum mode );


mod: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK

glEnable(GL_CULL_FACE);
glDisable(GL_CULL_FACE);
47

Culori

glColor3f(R, G, B);
glColor4f(R, G, B, A);

(x2,y2,z2)
glBegin(GL_TRIANGLES);
glColor3f(1,0,0);
glVertex3f(x0,y0,z0);
glColor3f(0,0,1);
glVertex3f(x1,y1,z1);
glVertex3f(x2,y2,z2);

glEnd();

(x0,y0,z0)

(x1,y1,z1)

48

Terminarea desenarii

Terminarea desenarii
glFlush()
glFinish()

49

Principalele elemente ale unei aplicatii grafice


(folosind GLUT)

Functii de initializare glut


Functiii de intrare interactive glut
Specificarea unui numar de obiecte ce vor fi afisate (definite prin
varfuri, linii poligoane) opengl
Descrierea proprietatilor acestor obiecte opengl

Culoare (puncte, linii, poligoane)


Dimensiune si latime (puncte, linii)
Sablon de desenare (linii, poligoane)
Modalitatea de afisare al unui poligon
Prin varfuri
Prin laturi
Prin interior: culoare uniforma sau folosind un sablon

Definirea modului de vizualizare a acestor obiecte opengl


Terminarea executiei glut

50

GLUT (OpenGL Utility Toolkit )

Ferestre
evenimente de la mouse, tastatura,
reafisarea ferestrelor
Meniuri

51

Structura unui program GLUT

void main (int argc, char * argv[])


{
Initializare
Creeaza fereastra/ferestre
Creeaza meniu/meniuri
Inregistreaza si asociaza functii callback
glutMainLoop();
}
52

Initializare

void glutInit(int *argc, char **argv);


void glutInitDisplayMode(unsigned int mod);
GLUT_RGB / GLUT_RGBA
GLUT_SINGLE / GLUT_DOUBLE
GLUT_DEPTH

53

Stergerea ferestrei
Stergerea bufferului de culoare
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

Stergerea bufferului de adancime


glClearDepth(0.0 );
glClear(GL_DEPTH_BUFFER_BIT);

sau
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(0.0 );
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);
54

Crearea ferestrei glut

void glutInitWindowSize(int w, int h)


void glutInitWindowPosition(int x, int y)
int glutCreateWindow(char* titlu)

55

Tipuri de evenimente

Modificarea ferestrei
Apasare buton mouse
Deplasare mouse
Apasare/eliberare tasta
Idle

56

Coada de mesaje

Coada de mesaje

Tastatura
.
Mouse

MainLoop()

Fereastra
Mouse_callback()
{
.
{

Keypress_callback()
{
.
{

window_callback()
{
.
{

57

glutMainLoop

repeta
if eveniment tastatura then
apeleaza functia inregistrata pentru tastatura
else if eveniment mouse then
apeleaza functia inregistrata pentru mouse
else if fereastra trebuie redesenata then
apeleaza functia inregistrata pentru afisare
...
else if nu este nimic de tratat then
apeleaza functia idle inregistrata

58

Inregistrarea functiilor Callback - GLUT

Afisare
void glutDisplayFunc(void (*func)(void));

Redimensionare fereastra
void glutReshapeFunc(void (*func)(int w, int h));

Eveimente de la tastatura
void glutKeyboardFunc(void (*func)(unsigned char key,
int x, int y)) ;

59

Inregistrarea functiilor Callback - GLUT

Evenimente de la mouse
apasarea/eliberearea unui buton al mouse-ului
void glutMouseFunc(void (*func)(int buton, int stare,
int x, int y)) ;
deplasarea mouse-ului avand unul sau mai multe
butoane apasate / fara a avea butoanele apasate
void glutMotionFunc(void (*func)(int x, int y)) ;
void glutPassiveMotionFunc(void (*func)(int x, int y)) ;

60

Inregistrarea functiilor Callback - GLUT

idle nu exista evenimente pentru a fi


tratate
void glutIdleFunc(void (*func)(void)) ;

61

Functia callback de afisare


Este executata ori de cate ori este necesara
reafisarea ferestrei, de exemplu:
La prima deschidere a ferestrei
La redimensionarea ferestrei
Cand utilizatorul modifica scena afisata in fereastra

Dupa tratarea anumitor evenimente


(mouse/tastatura) poate fi necesara reafisarea
ferestrei
glutPostRedisplay();
62

Sistemul de coordonate asociat ferestrei GLUT

Punctul fata de care


este specificata pozitia
mouse-ului
(y' = h - y)

Fereastra aplicatiei
h
O

x
w
63

Exemplu
void display(void) {
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f (-0.25, -0.25, 0.0);
glVertex3f (0.25, -0.25, 0.0);
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (-0.25, 0.25, 0.0);
glEnd();
glFlush ();
}
void init (void) {
glClearColor (0.0, 0.0, 0.0, 0.0);
}
64

Exemplu
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Primul Program");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
65