3 d transformaci i

15
Графика и визуелизација Координатни системи и 3D трансформации Факултет за информатика – Универзитет „Гоце Делчев“

Upload: daniel-paskov

Post on 28-Apr-2015

30 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: 3 d Transformaci i

Графика и визуелизација

Координатни системи и 3D трансформации

Факултет за информатика – Универзитет „Гоце Делчев“

Page 2: 3 d Transformaci i

3D Трансформации

Иста идеја како и 2D трансформациите:

Хомогени координати: (x,y,z,w)

4x4 матрици на трансформација

Page 3: 3 d Transformaci i

Лев и десен 3D координатен системOpenGL користи координатен систем

дефиниран со десна рака

Z- оската е насочена од мониторот кон

набљудувачот (излегува од мониторот)

Дефиниции на позитивни насоки на 3Д ротации околу оските

Page 4: 3 d Transformaci i

Основни 3D трансформации

Единечна матрица Издолжување

Транслација Огледално пресликување во

однос на Y/Z рамнината

Page 5: 3 d Transformaci i

Основни 3D трансформации

Ротација околу Z оската

Ротација околу Y оската

Ротација околу X оската

Page 6: 3 d Transformaci i

OpenGL - 3D трансформацииglTranslate{fd}(TYPE x, TYPE y, TYPE z);

▫ Го придвижува објектот за соодветни вредности по x-, y-, z- оските.

Page 7: 3 d Transformaci i

OpenGL - 3D трансформации

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

▫ Врши ротација на еден објект во насока спротивна на насоката на

движење на стрелките на часовникот околу векторот (x,y,z).

▫ Пр. glRotatef(45.0, 0.0, 0.0, 1.0);

Page 8: 3 d Transformaci i

OpenGL - 3D трансформации

glScale{fd}(TYPE, x, TYPE y, TYPE z);

▫ Врши множење на секоја од x-, y-, z- координатите на секоја точка од

еден објект со соодветниот аргумент на функцијата x, y, или z.

▫ Пр. glScalef(2.0, -0.5, 1.0);

Негативен знак –

огледално пресликување

Page 9: 3 d Transformaci i

OpenGL - 3D трансформации

glScale{fd}(TYPE, x, TYPE y, TYPE z);

▫ Врши множење на секоја од x-, y-, z- координатите на секоја точка од

еден објект со соодветниот аргумент на функцијата x, y, или z.

▫ Пр. glScalef(2.0, -0.5, 1.0);

Page 10: 3 d Transformaci i

OpenGL - 3D трансформации

Трансформационите матрици во OpenGL се 4x4

P’ = M * P

Концепт на тековна матрица на транформација (ТМТ)

ТМТ иницијално се поставува на 4x4 единечна матрица

glScalef()

TMТ <- TMТ * S

glTranslatef()

TMТ <- TMТ * T

TMT се множи од десно

Трансформациите се аплицираат во „обратен редослед“

Употреблива е на хиерархиски модели

Page 11: 3 d Transformaci i

OpenGL - 3D трансформации

За да се повикаат претходните трансформации

се користи т.н. Магацин (stack) од матрици.

Page 12: 3 d Transformaci i

OpenGL - 3D трансформации

glPushMatrix()

<=> glPopMatrix()

Page 13: 3 d Transformaci i

OpenGL - 3D трансформации

glPushMatrix(void) – Ја

„поттурнува“ тековната матрица

едно ниво подолу во

магацинот.

glPopMatrix(void) – Ја

„извлекува“ најгорната матрица

од магацинот, при што истата

се губи!

(Тековниот магацин на кој се

однесуваат операциите се

подесува со glMatrixMode).

GL_MODELVIEW

GL_PROJECTION

GL_TEXTURE

GL_COLOR

M5

M4

M3

M2

M1

M5

M4

M3

M2

M1

Pop

Push

M4

M3

M2

M1

M4

M4

M3

M2

M1

Тековна матрица

на трансформација

Тековна матрица

на трансформација

Page 14: 3 d Transformaci i

OpenGL - 3D трансформации

45 степени ротација околу z-оската, и 10 единици транслација по +x

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glMultMatrixf(R); // rot

glMultMatrixf(T); // trans

draw_the_object();

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glMultMatrixf(T); // trans

glMultMatrixf(R); // rot

draw_the_object();

Ја множи од десно ТМТ со 4 х 4 матрицата дадена како параметар на функцијата

Page 15: 3 d Transformaci i

OpenGL - 3D трансформацииglLoadIdentity();

glTranslatef (20.0, 20.0, 0.0);

glColor3f(0.0, 0.8, 0.1);

glRectf(0.,0.,20.,20.);

glTranslatef (20.0, 20.0, 0.0);

glColor3f(0.0, 0.0, 0.0);

glRectf(0.,0.,20.,20.);

glLoadIdentity();

glTranslatef (20.0, 20.0, 0.0);

glColor3f(0.0, 0.8, 0.1);

glRectf(0.,0.,20.,20.);

glLoadIdentity();

glTranslatef (20.0, 20.0, 0.0);

glColor3f(0.0, 0.0, 0.0);

glRectf(0.,0.,20.,20.);