Transformasi Obek (Lanjutan) Grafika Komputer Semester Ganjil 28 Teknik Informatika ITS Ann Yuniarti - 28
Kompetensi. Mampu memahami konsep transformasi 3D 2. Mampu mengimplementasikan konsep transformasi menggunakan fungsi-fungsi dari OpenGL Teknik Informatika ITS Ann Yuniarti - 28 2
Referensi Computer Graphics using OpenGL, 3rd Edition, b: F.S. Hill, Jr. and Stephen M. Kelle Chapter 5 Computer Graphics ith OpenGL, 3rd Edition, b: Donald Hearn and M.Pauline Baker Chapter 5 http://.cs.virginia.edu Teknik Informatika ITS Ann Yuniarti - 28 3
Pokok Bahasan. Transformasi 3D 2. Fungsi Transformasi Geometrik pada OpenGL Teknik Informatika ITS Ann Yuniarti - 28 4
Transformasi 2D 3D Melibatkan koordinat Posisi 3D dalam koordinat homogen direpresentasikan sebagai vektor kolom 4-elemen. Matriks transformasi 4 4 a e i m b f j n c g k o d h l p Teknik Informatika ITS Ann Yuniarti - 28 5
Teknik Informatika ITS 6 Ann Yuniarti - 28 Basic 3D Transformations t t t s s s Identit Scale Translation Mirror about Y/Z plane
Basic 3D Transformations Rotate around Z ais: cos sin sin cos cos sin Rotate around Y ais: sin cos Rotate around X ais: cos sin sin cos Teknik Informatika ITS Ann Yuniarti - 28 7
OpenGL Transformation Functions Transformasi dispesifikasikan dalam 3 dimensi. Posisi 2D direpresentasikan dengan matriks kolom 4 elemen dengan komponen =. Matriks translasi 4 4 dibentuk dengan fungsi: gltranslate*(t, t, t); Untuk aplikasi 2D, set t=. Matriks rotasi 4 4: glrotate*(theta, v, v, v); Contoh: glrotatef (9.,.,.,.); menghasilkan matriks untuk rotasi 9 pada sumbu. Matriks scaling 4 4 terhadap titik (,, ): glscale*(s, s, s); Contoh: glscalef (2., -3., 2.); menghasilkan matriks untuk penskalaan sebesar 2 pada arah, 3 pada arah dan pencerminan terhadap sumbu. Teknik Informatika ITS Ann Yuniarti - 28 8
OpenGL Matri Operations Untuk membentuk matriks transformasi 4 4, digunakan matriks modelvie: glmatrimode(gl_modelview) Untuk mengeset matriks ang sedang aktif menjadi matriks identitas: glloadidentit(); Apabila diinginkan matriks dengan elemen tertentu: glloadmatri*(elements6); Teknik Informatika ITS Ann Yuniarti - 28 9
OpenGL Matri Operations Contoh glmatrimode(gl_modelview); GLfloat elems[6]; Glint k; for (k=; k<6; k++) elems[k]=float(k); glloadmatrif(elems); akan menghasilkan matri. 4. 8. 2. M. 2. 5. 6. 9.. 3. 4. 3. 7.. 5. Teknik Informatika ITS Ann Yuniarti - 28
OpenGL Matri Operations Untuk membentuk matriks hasil perkalian dari current matri dengan matriks tertentu : glmultmatri*(otherelements6); Sehingga, apabila current matri adalah matriks modelvie, M, maka matriks modelvie ang sudah ter-update adalah M = M M, dimana M adalah matriks lain ang elemenna direpresentasikan dengan otherelements6. Fungsi diatas dapat digunakan untuk mengeset urutan transformasi, contoh: glmatrimode(gl_modelview); glloadidentit(); glmultmatrif(elemsm2); glmultmatrif(elemsm); menghasilkan matriks modelvie M = M 2 M Transformasi pertama ang dieksekusi adalah transformasi terakhir ang dispesifikasikan di program. Teknik Informatika ITS Ann Yuniarti - 28
OpenGL Matri Operations Notes on OpenGL Matri Operations Stack analog The last operation specified is the first one applied Column-major order m jk refers to the element in column j and ro k Teknik Informatika ITS Ann Yuniarti - 28 2
OpenGL Matri Stacks OpenGL me-maintain sebuah matri stack. Aalna, setiap stack berisi sebuah matriks identitas. Setelah dispesifikasikan beberapa transformasi geometrik, bagian paling atas dari stack matriks modelvie berupa matriks 4 4 hasil kombinasi transformasi. Pada beberapa kasus, dibutuhkan beberapa urutan transformasi dan setiap urutan disimpan di matriks composite ang berbeda-beda. Perintah pada OpengL untuk menentukan jumlah posisi ang tersedia pada suatu stack modelvie adalah glgetintegerv (GL_MAX_MODELVIEW_STACK_DEPTH, stacksie); ang mengembalikan sebuah nilai integer ke arra stacksie. Perintah untuk mendapatkan jumlah matriks ang ada saat ini di stack: glgetintegerv (GL_MODELVIEW_STACK_DEPTH, nummats); Teknik Informatika ITS Ann Yuniarti - 28 3
OpenGL Matri Stacks Pada aalna stack modelvie hana berisi sebuah matriks identitas. Ada dua fungsi untuk pemrosesan matriks di stack glpushmatri(); Salin current matri ang ada di bagian paling atas stack ang aktif dan simpan salinanna di posisi kedua dari stack glpopmatri(); Hapus matriks di posisi paling atas stack dan matriks kedua dari stack menjadi current matri. Perintah ini bisa dieksekusi bila minimal ada dua matriks di dalam stack. Teknik Informatika ITS Ann Yuniarti - 28 4
Teknik Informatika ITS Ann Yuniarti - 28 5
#include <indos.h> #include <GL/glut.h> void ais(double length){ //dra a -ais, ith cone at end glpushmatri(); glbegin(gl_lines); glverte3d(,,);glverte3d(,,length); glend(); gltranslated(,,length-.2); glutwirecone(.4,.2,2,9); glpopmatri(); } void displawire(void){ glmatrimode(gl_projection); glloadidentit(); glortho(-2.*64/48.,2.*64/48.,-2.,2.,.,); glmatrimode(gl_modelview); glloadidentit(); glulookat(2.3,.3,2.,.,.25,.,.,.,.); glclear(gl_color_buffer_bit); //clear the screen glcolor3d(,,); //dra black lines ais(.5); //-ais glpushmatri(); glrotated(9,,.,); ais(.5); //-ais glrotated(-9.,,,); ais(.5); //-ais glpopmatri(); glpushmatri(); gltranslated(.5,.5,.5); //big cube at (.5,.5,.5) glutwirecube(.); glpopmatri(); glpushmatri(); gltranslated(.,.,); //sphere at (,,) glutwiresphere(.25,,8); glpopmatri(); glpushmatri(); gltranslated(.,,.); //cone at (.,,.) glutwirecone(.2,.5,,8); glpopmatri(); } glpushmatri(); gltranslated(,,); //teapot at (,,) glutwireteapot(.2); glpopmatri(); glpushmatri(); gltranslated(,,); //torus at (,,) glrotated(9.,,,); glutwiretorus(.,.3,,); glpopmatri(); glpushmatri(); gltranslated(.,,); glscaled(.5,.5,.5); glutwiredodecahedron(); glpopmatri(); glpushmatri(); gltranslated(,.,.); glutwirecube(.25); glpopmatri(); glpushmatri(); gltranslated(,,.); //clinder at (,,) GLUquadricObj *qobj; qobj = glunequadric(); gluquadricdrastle(qobj,glu_line); gluclinder(qobj,.2,.2,.4,8,8); glpopmatri(); glflush(); void main(int argc, char **argv){ glutinit(&argc,argv); glutinitdisplamode(glut_single GLUT_RGB); glutinitwindoposition(,); glutinitwindosie(64,48); glutcreatewindo("transformation Test - ireframes"); glutdisplafunc(displawire); glclearcolor(.f,.f,.f,.f); glvieport(,,64,48); glutmainloop(); }