Čas 2 Pogled u 3Dognjen/Racunarska grafika/OpenGL/Prezentacije/OpenGL-Cas2.pdfRačunarska grafika -...
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
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
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.