Čas 2 Pogled u 3Dognjen/Racunarska grafika/OpenGL/Prezentacije/OpenGL-Cas2.pdfRačunarska grafika -...

41
Računarska grafika - OpenGL 22.11.2007. Pogled u 3D OpenGL Čas 2 Pogled u 3D

Transcript of Čas 2 Pogled u 3Dognjen/Racunarska grafika/OpenGL/Prezentacije/OpenGL-Cas2.pdfRačunarska grafika -...

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

OpenGL

Čas 2

Pogled u 3D

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

2

Crtanje i bojenje primitiva -shapes.exe

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

3

Koordinatni sistemi

x

y

z

x

y

z

Levi Desni

(1,1,1)(1,1,-1)

DirectX OpenGL

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

4

Analogija• modeliranje

• pogled (stajna tačka)

• projekcija

• preslikavanje na ekran

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

5

3D PipelineSCENA/OBJEKTI

3D MODELIRANJE

3D ODSECANJE

PROJEKCIJA

RASTERIZACIJA

2D PRIKAZ

Koordinate modeliranja:- Svetski koordinatni sistem (world), - Koordinatni sistem objekta (object)

Koordinate kamere

Prozorske koordinate (pogled)

Koordinate uređаја (device)

POGLED

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

6

Modeliranje

3D Modeliranje

Parametarsko

Poligonalno

Čestice

Implicitno

2222 rzyx =++

θθ2

4cossin

==

yx

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

7

Clipping

Vidljivi prostor

Objekat vanvidljivog prostora

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

8

Pogled i projekcija

viewport

3D modeliPostavljanje kamere

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

9

Rasterizacija

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

10

Vertex Geometry Pipeline

MODELVIEWmatrix

PROJECTIONmatrix

perspectivedivision

viewporttransformation

wzyx

eye

eye

eye

eye

wzyx

1dev

dev

yx

proj

proj

proj

wyx

win

win

yx

originalnoteme

zadatohomogenim

koordinatamateme u

eye koordinatama

2D projekcijatemena na

ravan gledanja

normalizovane devicekoordinate

(skraćivanje udaljenih predmeta)

finalne prozorskekoordinate

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

11

Osnovne matrične operacije• void glMatrixMode(GLenum mode);

– definiše koju od matrica treba modifikovati, može biti: GL_MODELVIEW, GL_PROJECTION ili GL_TEXTURE

• void glLoadIdentity(void);– učitava jediničnu matricu u tekuću matricu C , tj C = I

• void glLoadMatrix{fd}(const TYPE *m);– smešta matricu M u tekuću C , tj C = M

• void glMultMatrix{fd}(const TYPE *m);– množi tekuću matricu C matricom M i to smešta u tekuću C = CM

• void glLoadTransposeMatrix{fd}(const TYPE *m);• void glMultyTransposeMatrix{fd}(const TYPE *m);

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

12

Zadavanje matrice u “uobičajenom” obliku

double matrix[4][4] = { {1.0, 0.0, 0.0, 0.0},{0.0, 1.0, 0.0, 0.0},{0.0, 0.0, 1.0, -3.0},{0.0, 0.0, 0.0, 1.0}};

Transpose(matrix);glMultMatrixd((double*)matrix);

⇔ glTranslatef(0.0,0.0,-3.0);

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

13

Viewing & Modelingtransformacija

Osnovne transformacije:

• translacija void glTranslate{fd}(TYPEx, TYPE y, TYPE z);

• rotacija void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);

• skaliranje void glScale{fd}(TYPEx, TYPE y, TYPE z);

Ne postoji razlika između transformacija modeliranja i pogleda. Zato se i tretiraju zajedno. Npr. pomeranje kamere za 9 jedinica unazad (pozitivan smer Z-ose), isto je što i pomeranje scene za 9 jedinica unapred (negativan smer Z-ose). Zato ćemo poslednje transformacije, kojima se pomeraju svi objekti na sceni smatrati transformacijama pogleda.

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

14

Translacija

czzbyyaxx

+=′+=′+=′

=

+++

=

′′′

11000100010001

11zyx

cba

czbyax

zyx

Translacija duž Y oseglTranslate*(a, b, c)

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

15

Rotacija

Rotacija od 45o oko Z ose

Rotacija nakon translacija

=

100000000001

θθθθ

cossinsincos

xR

=

100001000000

θθθθ

cossinsincos

zR

−=

100000001000

θθ

θθ

cossin

sincos

yR

( )( ) ( ) ( ) ( )θθθ

θθθθ TRRR =−=⇒

−=−=− −1

sinsincoscos

Ako je M -1 = MT tada je M ortogonalna.Sve ortogonalne matrice su rotacije okokoordinatnog početka.

glRotate*(θ, x, y, z)

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

16

Rotacija - izvođenje

cos ( ) cos cos sin sin θ φ θ φ θ φ+ = −( ) ( ) ( ) ( )sin ( ) sin cos cos sin θ φ θ φ θ φ+ = +( ) ( ) ( ) ( )

P

Q

R PX

PYφ

θ

[1][2]

[3][4]

[1] )( )( )( )( φθφθ sinsincoscos RRxQ −=

Zamenom iz [3] i [4]…

)( )( θθ sincos yPxPxQ −=

Slično iz [2]…

)( )( θθ sincos xPyPyQ +=

)Rcos( QX φθ += )Rsin( Qy φθ +=

)(cosR PX φ= )(sinR Py φ=

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

17

Skaliranje

Original Skaliranje po svim osama Skaliranje po Y osi

Translacija Skaliranje nakon translacije

=

=

′′′′

wzyx

ss

s

wzsysxs

wzyx

z

y

x

z

y

x

1000000000000

glScale*(sx, sy, sz)

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

18

Demonstracija efekata transformacija

transformation.exe

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

19

Kombinovanje transformacija

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(N); /* apply transformation N */glMultMatrixf(M); /* apply transformation M */glMultMatrixf(L); /* apply transformation L */ glBegin(GL_POINTS);

glVertex3f(v); /* draw transformed vertex v */ glEnd();

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(T); /* translation */ glMultMatrixf(R); /* rotation */ draw_the_object();

I → N → NM → NML → NMLv → N(M(Lv))

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

20

Dva pogleda na transformacije• Svetski (globalni) koordinatni sistem

– operacije se navode u obrnutom redosledu i definišu položaj objekta u odnosu na globalni koordinatni sistem

• Lokalni koordinatni sistem– operacije se navode u redosledu kojom se

primenjuju, ali one transformišu lokalni koordinatni sistem, a sve operacije se obavljaju u lokalnom koordinatnom sistemu.

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

21

Korišćenje gluLookAt() funkcije za definisanje view transformacije

void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,

GLdouble centerx, GLdouble centery, GLdouble centerz,

GLdouble upx, GLdouble upy, GLdouble upz );

eyex, eyey, eyez – pozicija posmatrača

centerx, centery, centerz – pozicija tačke posmatranja

upx, upy, upz – vektor vertikale

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

22

Projekcije

Planarne geometrijske projekcije

Paralelne

Perspektivne

Ortografske

Oblique

Sa jednom tačkomSa dve tačkeSa tri tačke

GornjaPrednjaBočnaAksonometrijske

CabinetCavalierOstale

IzometrijskeOstale

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

23

Perspektivna projekcijaglFrustum(l, r, b, t, n, f )

void glFrustum( GLdouble left,GLdouble right, GLdoublebottom, GLdouble top, GLdoubleznear, GLdouble zfar );

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

24

void gluPerspective(fovy, aspect, zNear, zFar);

2tan2

2tan2 θθ nearh

nearh

=⇒=

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

25

Primer računanja ugla posmatranja

#define PI 3.1415926535double calculateAngle(double size, double distance) {

double radtheta, degtheta;radtheta = 2.0 * atan2 (size/2.0, distance);

degtheta = (180.0 * radtheta) / PI;return (degtheta);

}

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

26

Standardna sočiva• 48.24 mm – ekvivalent ljudskog vida• širokougaona sočiva (obuhvataju veću scenu – umanjuju prikaz) <50mm

– 35 mm i 28 mm – standardna širokougaona sočiva– 10-15 mm – “riblje oko” (sverno sočivo), velika distorzija

• telefoto sočiva (uvećavaja prikaz, približavaju udaljene objekte) >50mm

Sočivo FOV

15 mm 100.389

20 mm 83.974

24 mm 73.74

28 mm 65.47

35 mm 54.432

50 mm 39.598

85 mm 23.913

135 mm 15.189

200 mm 10.286

Koristiti FOV u opsegu:

30-60o,za realne scene, da ne bi došlo do distorzije.

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

27

Primer korišćenja različitih sočiva

10mm Lens (fov = 122°) 20mm Lens (fov = 84°)

35mm Lens (fov = 54°) 200mm Lens (fov = 10°)

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

28

Demonstracija efekata perspektive

projection.exe

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

29

Ortografska projekcija

==⇒

1000000000100001

where

10

1

MMPPyx

zyx

Najjednostavnija od svih projekcija. Paralelno projektuje objekte na projekcionu ravan (obično z = 0).

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

30

Ortografska projekcijaglOrtho(l, r, b, t, n, f )

void glOrtho( GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far );

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

31

Viewporttransformacija

(l,b,-n)

(r,t,-n)

(w,h,-n)

(-w,-h,-n)ahw

fnh

⋅=

⋅=2

tan

glFrustrum(l,r,b,t,n,f)⇒

gluPerspective(f,a,n,far)⇒

Projekciona matrica vrši preslikavanje 3D svetskih koordinata u 2D koordinate pogleda, i to:

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

32

Viewporttransformacija

normalizovane devicekoordinate

prozorske koordinate

12

12

minmax

min

minmax

min

−−

=

−−

=

yyyy

y

xxxx

x

pn

pn

( ) ( ) yheight

xwidth

+

+=+

+=

21

21 nwnw yyxx

Normalizacija na opseg [-1, +1]

Preslikavanje na prozor [ (0,0) .. (width,height) ]

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

33

Viewporttransformacija

void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);

(x, y) definiše donji levi ugao pogleda, a width i height veličinu pravougaonika

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

34

Aspekt

aspect ratio = 1.25 aspect ratio = 0.5

Aspekt definiše odnos širine i visine slike. Viewport aspekt mora biti jednak gluPerspective aspektu, inače dolazi do distorzije.

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

35

Upravljanje stekom matricaglGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH )

glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH )

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

36

glPushMatrix & glPopMatrix

draw_wheel_and_bolts() {

long i;draw_wheel();for(i=0;i<5;i++){

glPushMatrix();glRotatef(72.0*i,0.0,0.0,1.0);glTranslatef(3.0,0.0,0.0);draw_bolt();

glPopMatrix();}

}

draw_body_and_wheel_and_bolts() {draw_car_body();glPushMatrix();

/*move to first wheel position*/glTranslatef(40,0,30);draw_wheel_and_bolts();

glPopMatrix();glPushMatrix();

/*move to 2nd wheel position*/glTranslatef(40,0,-30);draw_wheel_and_bolts();

glPopMatrix();/*draw last two wheels similarly*/...

}

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

37

Dodatne Clipping ravni

void glClipPlane(GLenum plane, const GLdouble *equation);plane – GL_CLIP_PLANE i , equarion = {A, B, C, D}

Jednačina ravni: Ax+By+Cz+D = 0, odsečci na osama (x, y, z, respektivno): a = -D/A, b = -D/B, c = -D/C

Sve tačke se eye koordinatama (xe, ye, ze, we) koje zadovoljavaju nejednakost:

(A B C D) M- 1 (xe ye ze we)T >= 0 leže u vidljivom poluprostoru, gde je M tekuća modelview matrica u trenutku kada je pozvana funkcija glClipPlane().

glEnable(GL_CLIP_PLANE i ); glDisable(GL_CLIP_PLANE i );

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

38

Primer clip-ravniGLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0}; /* y < 0 */ GLdouble eqn2[4] = {1.0, 0.0, 0.0, 0.0}; /* x < 0 */

glClear(GL_COLOR_BUFFER_BIT);

glColor3f (1.0, 1.0, 1.0); glPushMatrix(); glTranslatef (0.0, 0.0, -5.0);

glClipPlane (GL_CLIP_PLANE0, eqn); glEnable (GL_CLIP_PLANE0); glClipPlane (GL_CLIP_PLANE1, eqn2); glEnable (GL_CLIP_PLANE1);

glRotatef (90.0, 1.0, 0.0, 0.0); auxWireSphere(1.0); glPopMatrix(); glFlush();

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

39

Kombinovanje transformacijaPrimeri

• Planet.c (exe)• Robot.c (exe)• Glos.h

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

40

GLUT pre-built models sub-API

• GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);• GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);• GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);• GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);• GLUTAPI void APIENTRY glutWireCube(GLdouble size);• GLUTAPI void APIENTRY glutSolidCube(GLdouble size);• GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides,

GLint rings);• GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides,

GLint rings);• GLUTAPI void APIENTRY glutWireDodecahedron(void);• GLUTAPI void APIENTRY glutSolidDodecahedron(void);• GLUTAPI void APIENTRY glutWireTeapot(GLdouble size);• GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size);• GLUTAPI void APIENTRY glutWireOctahedron(void);• GLUTAPI void APIENTRY glutSolidOctahedron(void);• GLUTAPI void APIENTRY glutWireTetrahedron(void);• GLUTAPI void APIENTRY glutSolidTetrahedron(void);• GLUTAPI void APIENTRY glutWireIcosahedron(void);• GLUTAPI void APIENTRY glutSolidIcosahedron(void);

Računarska grafika - OpenGL

22.11.2007.

Pogled u 3D

41

Domaći

1. Formirati funkciju DrawWall(), koja iscrtava kvadratstranice dužine a, u koordinatnom početku korišćenjemGL_QUADS. Implementirati i funkciju DrawWalls(),koja iscrtava bar dva zida i pod korišćenjem prethodnefunkcije.

2. Formirati funkciju DrawLamp(), koja iscrtava postoljelampe (dva kraka koji se oslanjaju jedan na drugi).

3. Proširiti funkciju DrawLamp(), dodavanjem iscrtavanje«glave» lampe (predlog je da se ona iscrtava u posebnojfunkciji DrawLampTop() ).

4. Omogućiti rotaciju pojedinih delova lampe.

Dopuniti prvu lab. vežbu iz OpenGL-a sledećim funkcijama.