Transformasi Obyek (Lanjutan) Grafika Komputer Semester Ganjil 2008
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
1
Kompetensi 1.
Mampu memahami konsep transformasi 3D
2.
Mampu mengimplementasikan konsep transformasi menggunakan fungsi-fungsi dari OpenGL
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
2
Referensi
Computer Graphics using OpenGL, 3rd Edition, by: F.S. Hill, Jr. and Stephen M. Kelley – Chapter 5 Computer Graphics with OpenGL, 3rd Edition, by: Donald Hearn and M.Pauline Baker – Chapter 5 http://www.cs.virginia.edu
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
3
Pokok Bahasan 1. 2.
Transformasi 3D Fungsi Transformasi Geometrik pada OpenGL
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
4
Transformasi 2D 3D
Melibatkan koordinat z
Posisi 3D dalam koordinat homogen direpresentasikan sebagai vektor kolom 4-elemen.
Matriks transformasi 4 x 4 x' y' z' w'
Kuliah Grafika Komputer Teknik Informatika ITS
a e i m
b f j n
c g k o
d x h y l z p w
Anny Yuniarti - 2008
5
Basic 3D Transformations x' y' z' w
1 0 0 0
0 1 0 0
0 0 1 0
0 x 0 y 0 z 1 w
x' y'
sx 0
0 sy
0 0
0 x 0 y
z'
0
0
sz
0
w
0
0
0
1 w
z
Identity Scale x' y'
1 0 0 tx 0 1 0 ty
x y
z'
0 0 1 tz
z
w
0 0 0
w
1
x' y' z' w
Translation Kuliah Grafika Komputer Teknik Informatika ITS
1 0 0 0
0 1 0 0
0 0 1 0
0 x 0 y 0 z 1 w
Mirror about Y/Z plane Anny Yuniarti - 2008
6
Basic 3D Transformations Rotate around Z axis:
Rotate around Y axis:
Rotate around X axis: Kuliah Grafika Komputer Teknik Informatika ITS
x' y' z' w
cos sin 0 0
sin cos 0 0
0 0 1 0
0 x 0 y 0 z 1 w
x' y'
cos 0
0 sin 1 0
0 x 0 y
z'
sin
0 cos
0
w
0
0
0
1 w
x' y' z' w
1 0 0 cos 0 sin 0 0
0 sin cos 0
0 x 0 y 0 z 1 w
Anny Yuniarti - 2008
z
7
OpenGL Transformation Functions
Transformasi dispesifikasikan dalam 3 dimensi. Posisi 2D direpresentasikan dengan matriks kolom 4 elemen dengan komponen z = 0.0 Matriks translasi 4 x 4 dibentuk dengan fungsi: glTranslate*(tx, ty, tz); Untuk aplikasi 2D, set tz=0.0
Matriks rotasi 4 x 4: glRotate*(theta, vx, vy, vz); Contoh: glRotatef (90.0, 0.0, 0.0, 1.0); menghasilkan matriks untuk rotasi 90° pada sumbu z.
Matriks scaling 4 x 4 terhadap titik (0, 0, 0): glScale*(sx, sy, sz); Contoh: glScalef (2.0, -3.0, 2.0); menghasilkan matriks untuk penskalaan sebesar 2 pada arah x, 3 pada arah y dan pencerminan terhadap sumbu x.
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
8
OpenGL Matrix Operations
Untuk membentuk matriks transformasi 4 x 4, digunakan matriks modelview:
Untuk mengeset matriks yang sedang aktif menjadi matriks identitas:
glMatrixMode(GL_MODELVIEW)
glLoadIdentity();
Apabila diinginkan matriks dengan elemen tertentu:
glLoadMatrix*(elements16);
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
9
OpenGL Matrix Operations
Contoh glMatrixMode(GL_MODELVIEW); GLfloat elems[16]; Glint k; for (k=0; k<16; k++) elems[k]=float(k); glLoadMatrixf(elems);
akan menghasilkan matrix
M
0.0 4.0 1.0 5.0
8.0 9.0
12.0 13.0
2.0 6.0 10.0 14.0 3.0 7.0 11.0 15.0
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
10
OpenGL Matrix Operations
Untuk membentuk matriks hasil perkalian dari current matrix dengan matriks tertentu : glMultMatrix*(otherElements16);
Sehingga, apabila current matrix adalah matriks modelview, M, maka matriks modelview yang sudah ter-update adalah M = M·M’, dimana M’ adalah matriks lain yang elemennya direpresentasikan dengan otherElements16. Fungsi diatas dapat digunakan untuk mengeset urutan transformasi, contoh: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(elemsM2); glMultMatrixf(elemsM1);
menghasilkan matriks modelview M = M2·M1
Transformasi pertama yang dieksekusi adalah transformasi terakhir yang dispesifikasikan di program.
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
11
OpenGL Matrix Operations
Notes on OpenGL Matrix Operations
Stack analogy
The last operation specified is the first one applied
Column-major order
mjk refers to the element in column j and row k
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
12
OpenGL Matrix Stacks
OpenGL me-maintain sebuah matrix stack. Awalnya, setiap stack berisi sebuah matriks identitas. Setelah dispesifikasikan beberapa transformasi geometrik, bagian paling atas dari stack matriks modelview berupa matriks 4 x 4 hasil kombinasi transformasi.
Pada beberapa kasus, dibutuhkan beberapa urutan transformasi dan setiap urutan disimpan di matriks composite yang berbeda-beda.
Perintah pada OpengL untuk menentukan jumlah posisi yang tersedia pada suatu stack modelview adalah glGetIntegerv (GL_MAX_MODELVIEW_STACK_DEPTH, stackSize); yang mengembalikan sebuah nilai integer ke array stackSize.
Perintah untuk mendapatkan jumlah matriks yang ada saat ini di stack: glGetIntegerv (GL_MODELVIEW_STACK_DEPTH, numMats);
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
13
OpenGL Matrix Stacks
Pada awalnya stack modelview hanya berisi sebuah matriks identitas.
Ada dua fungsi untuk pemrosesan matriks di stack
glPushMatrix();
Salin current matrix yang ada di bagian paling atas stack yang aktif dan simpan salinannya di posisi kedua dari stack
glPopMatrix();
Hapus matriks di posisi paling atas stack dan matriks kedua dari stack menjadi current matrix. Perintah ini bisa dieksekusi bila minimal ada dua matriks di dalam stack.
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
14
Kuliah Grafika Komputer Teknik Informatika ITS
Anny Yuniarti - 2008
15
#include <windows.h> #include
glPushMatrix(); glTranslated(1,1,1); //teapot at (1,1,1) glutWireTeapot(0.2); glPopMatrix();
void axis(double length){ //draw a z-axis, with cone at end glPushMatrix(); glBegin(GL_LINES); glVertex3d(0,0,0);glVertex3d(0,0,length); glEnd(); glTranslated(0,0,length-0.2); glutWireCone(0.04,0.2,12,9); glPopMatrix(); } void displayWire(void){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-2.0*64/48.0,2.0*64/48.0,-2.0,2.0,0.1,100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(2.3,1.3,2.0,0.0,0.25,0.0,0.0,1.0,0.0);
glPushMatrix(); glTranslated(0,1,0); //torus at (0,1,0) glRotated(90.0,1,0,0); glutWireTorus(0.1,0.3,10,10); glPopMatrix(); glPushMatrix(); glTranslated(1.0,0,0); glScaled(0.15,0.15,0.15); glutWireDodecahedron(); glPopMatrix(); glPushMatrix(); glTranslated(0,1.0,1.0); glutWireCube(0.25); glPopMatrix();
glClear(GL_COLOR_BUFFER_BIT); //clear the screen glColor3d(0,0,0); //draw black lines axis(0.5); //x-axis glPushMatrix(); glRotated(90,0,1.0,0); axis(0.5); //y-axis glRotated(-90.0,1,0,0); axis(0.5); //z-axis glPopMatrix();
glPushMatrix(); glTranslated(0,0,1.0); //cylinder at (0,0,1) GLUquadricObj *qobj; qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj,GLU_LINE); gluCylinder(qobj,0.2,0.2,0.4,8,8); glPopMatrix(); glFlush();
glPushMatrix(); glTranslated(0.5,0.5,0.5); //big cube at (0.5,0.5,0.5) glutWireCube(1.0); glPopMatrix(); glPushMatrix(); glTranslated(1.0,1.0,0); //sphere at (1,1,0) glutWireSphere(0.25,10,8); glPopMatrix(); glPushMatrix(); glTranslated(1.0,0,1.0); //cone at (1.0,0,1.0) glutWireCone(0.2,0.5,10,8); glPopMatrix();
} void main(int argc, char **argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(100,100); glutInitWindowSize(640,480); glutCreateWindow("Transformation Test wireframes"); glutDisplayFunc(displayWire); glClearColor(1.0f,1.0f,1.0f,0.0f); glViewport(0,0,640,480); glutMainLoop(); }