LAPORAN PRAKTIKUM GRAFIKA KOMPUTER
MODUL V OBJEK 3D
Disusun untuk Memenuhi Matakuliah Praktikum Grafika Komputer Yang Dibimbing oleh Bapak Heru Wahyu Herwanto, S.T., M.Kom.
Oleh : WEAMAS CAPRINSA FATHIR 130533608104 PTI C - 2013
PRODI S1 PENDIDIKAN TEKNIK INFORMATIKA JURUSAN TEKNIK ELEKTRO FAKULTAS TEKNIK UNIVERSITAS NEGERI MALANG APRIL 2015
MODUL 5 OBJEK 3D
TUJUAN Memahami Inisialisasi dunia 3D. Memahami Object 3D (Wired). Memahami dasar menampilkan susunan objek 3D. LATIHAN 1. Buatlah sebuah fungsi yang dapat membuat persegi. tampilkan objek persegi tersebut pada layar dan berikan interaksi menggunakan keyboard untuk memindahkan posisi objek pada KOORDINAT Z (panah bawah untuk mendekat dan panah atas untukmenjauh). Tampilkan 2 screen shot kondisi ketika objek 2D jauh dan dekat. Dan tampilkan programnya (display function). Beri keterangan. Script : #include #include float x=0, y=0, z=-10; int w = 450, h = 450; void drawQuad(int k, int l){ glColor3f(1,0,2); glBegin(GL_QUADS); glVertex2d(k, -l); glVertex2d(-k, -l); glVertex2d(-k, l); glVertex2d(k, l); glEnd(); } void update(int value){ glutPostRedisplay(); glutTimerFunc(100, update, 0); } void render(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0,0,0,0); glLoadIdentity(); glTranslatef(x,y,z); drawQuad(1,1); glutSwapBuffers(); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei)w, (GLsizei)h); glLoadIdentity(); gluPerspective (45, (GLfloat)w / (GLfloat)h, 1.0, 300.0); glMatrixMode (GL_MODELVIEW); } void init() { glClearColor (0.0f, 0.0f, 0.0f, 0.5f); glEnable (GL_DEPTH_TEST);
glMatrixMode (GL_PROJECTION); glDepthFunc (GL_LEQUAL); glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return; } void mySpecialKeyboard(int key, int x, int y){ switch(key){ case GLUT_KEY_UP: z+=5; break; case GLUT_KEY_DOWN: z-=5; break; } } void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowPosition(100,100); glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR"); glutTimerFunc(50, update, 0); glutSpecialFunc(mySpecialKeyboard); init(); glutDisplayFunc(render); glutReshapeFunc (reshape); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutMainLoop(); }
Screenshot :
Penjelasan : Pada fungsi drawQuad terdapat fungsi untuk membuat perseg menggunakan GL_QUADS. Kemudian fungsi drawQuad di panggil pada fungsi render. Sebelum pemanggilan fungsi drawQuad terdapat fungsi Transisi yaitu glTranslatef(x,y,z) dengan parameter x, y, dan z yang telah di deklarasikan sebagai variable global. Terdapat fungsi mySpecialKyeboard untuk menangkap dari interaksi dari keyboard, jika di tekan tobo arah atas maka nilai variable z akan bertambah 5, sedangkan di tekan arah bawah maka nilai z akan berkurang 5.
2. Buatlah sebuah program yang dapat menganimasikan objek persegitersebut menggunakan tombol ("panah kiri" = rotasi berlawanan arah jarum jam pada sumbu
x, "panah kanan" = rotasi searah jarum jam pada sumbu x, "panah atas" = rotasi searah jarum jam pada sumbu y, "panah bawah" = rotasi berlawanan arah jarum jam pada sumbu y). Sajikan screenshot hasil interaksi yang menunjukkan animasi rotasirotasi tersebut dan tulis program pada fungsi display. Beri keterangan. Script : #include #include float x=0, y=0, z=-10; int w = 320, h = 320, i, j, k, l; void drawQuad(int a, int b){ glColor3f(1,0,0); glBegin(GL_QUADS); glVertex2d(a, -b); glVertex2d(-a, -b); glVertex2d(-a, b); glVertex2d(a, b); glEnd(); } void update(int value){ glutPostRedisplay(); glutTimerFunc(100, update, 0); } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1,1,1,1); glLoadIdentity(); glTranslatef(x,y,z); glRotatef(i,j,k,0); drawQuad(2,2); glutSwapBuffers(); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0); glMatrixMode (GL_MODELVIEW); } void init() { glShadeModel (GL_SMOOTH); glClearColor (0.0f, 0.0f, 0.0f, 0.5f); glClearDepth (1.0f); glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL); glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return; } void myKeyboard(unsigned char key, int x, int y) { if(key == 's') { i+=2; j=1; k=0; } else if(key == 'w') {
i-=2; j=1; k=0; } else if(key == 'd') { i+=2; j=0; k=1; } else if(key == 'a') { i-=2; j=0; k=1; } } void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowPosition(100,100); glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR"); glutTimerFunc(50, update, 0); glutKeyboardFunc(myKeyboard); init(); glutDisplayFunc(myDisplay); glutReshapeFunc (reshape); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutMainLoop(); }
Screenshot :
Penjelasan :
Fungsi untuk membuat objek perseginya terdapat pada fungsi drawQuad. Kemudian di panggil pada fungsi render. Tambahkan glRotatef yang menggunakan parameter pada fungsi render. Fungsi myKeyboard untuk menangkap interaksi dari keyboard yang masing-masing keyboard akan merubah nilai parameter dari glRotatef yang nanti akan menimbulkan rotasi pada objek sesuai dengan yang di tentukan. 3. Buatlah sebuah program dengan menggunakan fungsi WireCube dimana tampilan wirecube dapat diputar (sumbu putar x, y, z) menggunakan tombol keyboard 'a' = rotasi berlawanan arah jarum jam pada sumbu x, 'd' = rotasi searah jarum jam pada sumbu x, 'w' = rotasi searah jarum jam pada sumbu y, 's' = rotasi berlawanan arah jarum jam pada sumbu y, 'e' = rotasi searah jarum jam pada sumbu z, 'q' = rotasi berlawanan arah jarum jam pada sumbu z. Tambahkan fungsi CUBE seperti di bawah
Tampilkan screenshotnya dan beri keterangan.
Script : #include #include int w=480, h=480, z=-20; int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0; void kubus (){ glPushMatrix(); glColor3f(0,0,0); glutWireCube(2); glPopMatrix(); } void renderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1,1,1,1); glLoadIdentity(); glTranslatef(0,0,z); glRotatef(sudut,x1,y1,z1); kubus(); glutSwapBuffers(); } void resize(int w1,int h1){ glViewport(0,0,w1,h1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0);
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void myKeyboard(unsigned char key, int x, int y){ if (key =='a'){ x1=1; y1=0; z1=0; sudut-=10;} else if (key == 'd'){ x1=1; y1=0; z1=0; sudut+=10;} else if (key == 'w') { x1=0; y1=1; z1=0; sudut+=10;} else if (key == 's') { x1=0; y1=1; z1=0; sudut-=10;} else if (key == 'e') { y1=0; x1=0; z1=1; sudut-=10;} else if (key == 'q') { y1=0; x1=0; z1=1; sudut+=10;} } void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0); glMatrixMode(GL_MODELVIEW); } void timer(int value){ glutPostRedisplay(); glutTimerFunc(50,timer,0); } void main (int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR"); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutDisplayFunc(renderScene); glutReshapeFunc(resize); glutKeyboardFunc(myKeyboard); glutTimerFunc(1,timer,0);
init(); glutMainLoop(); }
Screenshot :
Penjelasan : Disini untuk membuat bangun 3d berupa kerangka kubus menggunakan glutWireCube(size) yang sudah di sediakan pada glut. Dalam program ini fungs yang di gunakan untuk membuat kubus adalah fungsi kubus. Fungsi tersebut di panggil pada fungsi renderScene(), namun sebelumnya di tambahkan fungsi rotasi yang menggunakan parameter di atas pemangggilan fungsi tadi. Terdapat fungsi mykeyboard yang digunakan untuk menangkap interaksi dari keyboard. Terdapat tombol a, d, w, s, q, dan e yang di fungsikan jika ditekan tombol tersebut maka akan terjadi perubahan nilai dati parameter dari glRotate(sudut,x,y,z) yang terdapat pada fungsi renderScene(), dari masing-masing tombol akan memiliki nilai yang berbeda-beda dan akan menimbulkan rotasi pada 3 sumbu.
4. Buatlah sebuah program dengan menggunakan fungsi WireSphere, dimana wire sphere dapat diputar pada sumbu z (searah dan berlawanan dengan jarum jam) dengan
keyboard(gunakan special key), ukuran wirespehre dapat diperbesar dengan tombol panah atas, dan untuk memperkecil dengan tombol panah bawah, dan radius wiresphere dapat diperbesar dengan tombol panah kanan, dan untuk memperkecil menggunakan panah kiri. Tambahkan fungsi sphere seperti dibawah
Tampilkan screenshotnya dan beri keterangan.
Script : #include #include int w=480, h=480, z=-20; int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0, rad=1; int P=1, T=1, L=1; void Sphere(){ glPushMatrix(); glColor3f(1,0,0); glScalef(P,T,L); glutWireSphere(rad, 30,30); glPopMatrix(); } void renderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1,1,1,1); glLoadIdentity(); glTranslatef(0,0,z); glRotatef(sudut,x1,y1,z1); Sphere(); glutSwapBuffers(); } void resize(int w1,int h1){ glViewport(0,0,w1,h1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void myKeyboard(unsigned char key, int x, int y){ if (key =='a'){ x1=1; y1=0; z1=0; sudut-=10;}
else if (key == x1=1; y1=0; z1=0; sudut+=10;} else if (key == x1=0; y1=1; z1=0; sudut+=10;} else if (key == x1=0; y1=1; z1=0; sudut-=10;} else if (key == y1=0; x1=0; z1=1; sudut-=10;} else if (key == y1=0; x1=0; z1=1; sudut+=10;} }
'd'){
'w') {
's') {
'e') {
'q') {
void mySpecialKeyboard(int key, int x, int y){ switch(key){ case GLUT_KEY_UP: P+=1; T+=1; L+=1; break; case GLUT_KEY_DOWN: P-=1; T-=1; L-=1; break; case GLUT_KEY_RIGHT: rad+=1; break; case GLUT_KEY_LEFT: rad-=1; break; } } void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0); glMatrixMode(GL_MODELVIEW); } void timer(int value){ glutPostRedisplay(); glutTimerFunc(50,timer,0); }
void main (int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR"); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutDisplayFunc(renderScene); glutReshapeFunc(resize); glutKeyboardFunc(myKeyboard); glutSpecialFunc(mySpecialKeyboard); glutTimerFunc(1,timer,0); init(); glutMainLoop(); }
Screenshot :
Penjelasan : Pada fungsi sphere terdapat fungsi glutWireSphere(radius, slice, stack) yang digunakan untuk membuat kerangka Bola, fungsi ini sudah di sediakan oleh glut. Pada fungsi glutWireSphere untuk radius menggunakan parameter karena nanti
akan di gunakan untuk perubahan ukuran. Kemudian panggil fungsi sphere pada fungsi renderScene yang sebelumnya sudah di tambahkan fungsi rotasi dan fungsi transisi yang menggunakan parameter. Terdapat fungsi mykeyboard di gunakan untuk menangkap interaksi dari keyboard a,d,w,s,q,e yang di dalam masingmasing tombol akakn merubah nilai dari parameter pada fungsi rotasi tadi. Terdapat juga fungsi mySpecialKeyboard untuk menangkap interaksi dari keyboard tombola rah, jika di tekan tombol atas atau bawah maka akan merubah nilai para meter dari fungsi gltranslatef pada fungsi renderScene, jika di tekan tombol kiri atau kanan maka akan merubah nilai radius pada glutWireSphere tadi. 5. Buatlah sebuah program dengan menggunakan fungsi WireCone interaksi mengubah tinggi (panah atas, panah bawah) , alas (panah kanan, panah kiri), potongan(a,d).
Tampilkan screenshotnya dan beri keterangan.
Script : #include #include int w=480, h=480, z=-20; int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0, rad=1; int a=1, t=1, sl=10, st=20; void Sphere(){ glPushMatrix(); glColor3f(1,0,0); glutWireCone(a, t, sl, st); glPopMatrix(); } void renderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1,1,1,1); glLoadIdentity(); glTranslatef(0,0,z); glRotatef(sudut,x1,y1,z1); Sphere(); glutSwapBuffers(); } void resize(int w1,int h1){ glViewport(0,0,w1,h1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
void myKeyboard(unsigned char key, int x, int y){ if (key =='a'){ sl+=1;} else if (key == 'd'){ sl-=1;} else if (key == 'w') { x1=0; y1=1; z1=0; sudut+=10;} else if (key == 's') { x1=0; y1=1; z1=0; sudut-=10;} else if (key == 'e') { y1=0; x1=0; z1=1; sudut-=10;} else if (key == 'q') { y1=0; x1=0; z1=1; sudut+=10;} } void mySpecialKeyboard(int key, int x, int y){ switch(key){ case GLUT_KEY_UP: t+=1; break; case GLUT_KEY_DOWN: t-=1; break; case GLUT_KEY_RIGHT: a+=1; break; case GLUT_KEY_LEFT: a-=1; break; } } void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0); glMatrixMode(GL_MODELVIEW); } void timer(int value){ glutPostRedisplay(); glutTimerFunc(50,timer,0); } void main (int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(100,100);
glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR"); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutDisplayFunc(renderScene); glutReshapeFunc(resize); glutKeyboardFunc(myKeyboard); glutSpecialFunc(mySpecialKeyboard); glutTimerFunc(1,timer,0); init(); glutMainLoop(); }
Screenshot :
Penjelasan : Untuk membuat bangun kerangkan cone atau kerucut ini menggunakan fungsi gltuWireCone(base, height,slice,stack) yang sudah di sediakan oleh glut. Pada program ini untuk base, height, dan slice menggunakan parameter karena aka digunakan untuk interaksi perubahan. Pada fungsi myKeyboard yang digunakan untuk menangkap interaksi dari keyboard jika di tekan a dan d maka akan merubah nilai parameter slice dari glutWireCone. Terdapat juga fungsi mySpecialKeyboard untuk menangkap interaksi dari tombola rah keybard, jika di
tekan atas atau bawah maka merubah nilai dari parameter height pada glutWireCone, dan jika di tekan kanan atau kiri maka akan merubah nilai dari base pada parameter glutWireCone. 6. Buatlah sebuah program dengan menggunakan fungsi WireTorus, dengan interaksi mengubah diameter dalam (panah atas, panah bawah) , diameter luar (panah kanan, panah kiri), dan jumlah ring(q,e). Tampilkan screenshotnya dan beri keterangan. Script : #include #include int w=480, h=480, z=-20; int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0, rad=1; int irad=1, orad=2, sid=10, ring=20; void Torus(){ glPushMatrix(); glColor3f(1,0,0); glutWireTorus(irad, orad, sid, ring); glPopMatrix(); } void renderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1,1,1,1); glLoadIdentity(); glTranslatef(0,0,z); glRotatef(sudut,x1,y1,z1); Torus(); glutSwapBuffers(); } void resize(int w1,int h1){ glViewport(0,0,w1,h1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void myKeyboard(unsigned char key, int x, int y){ if (key =='a'){ x1=1; y1=0; z1=0; sudut-=10;} else if (key == 'd'){ x1=1; y1=0; z1=0; sudut+=10;} else if (key == 'w') { x1=0; y1=1; z1=0; sudut+=10;}
else if (key == 's') { x1=0; y1=1; z1=0; sudut-=10;} else if (key == 'e') { ring+=1;} else if (key == 'q') { ring-=1;} } void mySpecialKeyboard(int key, int x, int y){ switch(key){ case GLUT_KEY_UP: irad+=1; break; case GLUT_KEY_DOWN: irad-=1; break; case GLUT_KEY_RIGHT: orad+=1; break; case GLUT_KEY_LEFT: orad-=1; break; } } void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0); glMatrixMode(GL_MODELVIEW); } void timer(int value){ glutPostRedisplay(); glutTimerFunc(50,timer,0); } void main (int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR"); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutDisplayFunc(renderScene); glutReshapeFunc(resize); glutKeyboardFunc(myKeyboard); glutSpecialFunc(mySpecialKeyboard); glutTimerFunc(1,timer,0); init(); glutMainLoop(); }
Screenshot :
Penjelasan : Untuk membuat bangun 3d ini menggunakan fungsi glutWireTorus(inradius, outradius, side, ring. Fungsi ini terdapat pada fungsi torus. Terdapat juga fungsi myKeyboard jika ditekan q dan e maka merubah nilai parameter ring pada glutWirwTorus, jika ditekan a,d,w,s akan menimnulkan fungsi rotasi. Terdapat pula fungsi mySpecialKeyboard, jika ditekan atas atau bawah akan merubah nilai dari parameter inradius pada glutWireTorus, dan jika di tekan kanan atau kiri maka akanmerubah nilai outradius pada glutWireTorus.
7. Buatlah sebuah program dengan menggunakan fungsi WireTeapot, dengan interaksi rotasi pada 3 sumbu (searah dan berlawanan dengan arah jarum jam) dan mengubah ukurannya dengan tombol panah atas dan panah bawah. Script : #include #include int w=480, h=480, z=-20; int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0; int size=1;
void Sphere(){ glPushMatrix(); glColor3f(1,0,0); glutWireTeapot(size); glPopMatrix(); } void renderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1,1,1,1); glLoadIdentity(); glTranslatef(0,0,z); glRotatef(sudut,x1,y1,z1); Sphere(); glutSwapBuffers(); } void resize(int w1,int h1){ glViewport(0,0,w1,h1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void myKeyboard(unsigned char key, int x, int y){ if (key =='a'){ x1=1; y1=0; z1=0; sudut-=10;} else if (key == 'd'){ x1=1; y1=0; z1=0; sudut+=10;} else if (key == 'w') { x1=0; y1=1; z1=0; sudut+=10;} else if (key == 's') { x1=0; y1=1; z1=0; sudut-=10;} else if (key == 'e') { y1=0; x1=0; z1=1; sudut-=10;} else if (key == 'q') { y1=0; x1=0; z1=1; sudut+=10;} } void mySpecialKeyboard(int key, int x, int y){
switch(key){ case GLUT_KEY_UP: size+=1; break; case GLUT_KEY_DOWN: size-=1; break; } } void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0); glMatrixMode(GL_MODELVIEW); } void timer(int value){ glutPostRedisplay(); glutTimerFunc(50,timer,0); } void main (int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR "); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutDisplayFunc(renderScene); glutReshapeFunc(resize); glutKeyboardFunc(myKeyboard); glutSpecialFunc(mySpecialKeyboard); glutTimerFunc(1,timer,0); init(); glutMainLoop(); }
Screenshot :
Penjelasan : Untuk membuat objek 3d teko ini tinggal menggunakan fungsi glurWireTeapot(size) yang sudah di sediakan oleh glut. Pada program ini fungsi ini terdapat pada fungsi teapot(). Kemudian fungsi teapot di panggil pada fungsi renderScene. Di tambahkan fungsi rotasi dengan menggunakan parameter glRotatef(sudut,x,y,z). terdapat fungsi mykeyboard untuk manangkap interaksi dari tombol a,d,w,s,q,e yang masing tombol jika di tekan akan merubah nilai dari parameter glRotate pada fungsi renderScene dan akan menimbulkan rotasi yang berbeda-beda. Terdapat juga fungsi maySpecial keyboar yang jika di tekan tombol atas atau bawah maka akan merubah nilai parameter size pada glutWireTeapot tadi. TUGAS ASISTENSI 1. Buatlah Fungsi untuk membuat balok 3D, dengan parameter input fungsinya berupa panjang, lebar, dan tinggi yang dapat di ubah. Sajikan source code dan screenshotnya. Script : #include #include int w=480, h=480, z=-20; int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0; void balok (int u, int P, int L, int T){ glPushMatrix(); glColor3f(0,0,0); glScalef(P,T,L); glutWireCube(u); glPopMatrix(); } void renderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1,1,1,1); glLoadIdentity(); glTranslatef(0,0,z); glRotatef(sudut,x1,y1,z1); balok(2,3,2,2);
glutSwapBuffers(); } void resize(int w1,int h1){ glViewport(0,0,w1,h1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void myKeyboard(unsigned char key, int x, int y){ if (key =='w') z+=5; else if (key == 's') z-=5; else if (key == 'a') { x1=0; y1=0; z1=1; sudut+=10; } else if (key == 'd') { y1=0; x1=0; z1=1; sudut-=10; } } void mySpecialKeyboard(int key, int x, int y){ switch(key){ case GLUT_KEY_UP: x1=1; y1=0; z1=0; sudut-=10; break; case GLUT_KEY_DOWN: x1=1; y1=0; z1=0; sudut+=10; break; case GLUT_KEY_RIGHT: x1=0; y1=1; z1=0; sudut+=10; break; case GLUT_KEY_LEFT: x1=0; y1=1; z1=0; sudut-=10; break; } } void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0); glMatrixMode(GL_MODELVIEW); } void timer(int value){ glutPostRedisplay(); glutTimerFunc(50,timer,0); } void main (int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR"); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutDisplayFunc(renderScene); glutReshapeFunc(resize); glutKeyboardFunc(myKeyboard); glutSpecialFunc(mySpecialKeyboard); glutTimerFunc(1,timer,0); init(); glutMainLoop(); }
Screenshot :
Penjelasan :
Untuk membuat sebuag bangun balok tinggal menggunakan glutWireCube(size) yang kemudian ditambahkam fungsi glScalef(x,y,z) untuk membentuk kubus tadi menjadi balok. Misalnya untuk menambah panjang tinggal merubah nilai x pada glScale. Untuk fungsi mykeyboard digunakan untuk menangkap interaksi dari keyboard a,d,w,s,q,e. untuk fungsi mySpecialKeyboard digunakan untuk menangkap interaksi dari tombol arah atas, bawah, kanan, kiri. 2. Buatlah Danbo 3 dimensi dengan interaksi memutar di 3 sumbu(searah dan berlawanan dengan arah jarum jam). Sajikan source code dan screenshotnya. Script : #include #include int w=480, h=480, z=-20; int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0; void renderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1,1,1,1); glLoadIdentity(); glTranslatef(0,0,z); glRotatef(sudut,x1,y1,z1); //kaki kanan glPushMatrix(); glTranslatef(-1,-4,0); glColor3f(0.8,0.55,0.3); glScalef(1,2.5,1); glutSolidCube(1.3); glPopMatrix(); //kaki kiri glPushMatrix(); glTranslatef(1,-4,0); glColor3f(0.8,0.55,0.3); glScalef(1,2.5,1); glutSolidCube(1.3); glPopMatrix(); //badan glPushMatrix(); glTranslatef(0,0,0); glColor3f(0.8,0.5,0.2); glScalef(2,3,2); glutSolidCube(2); glPopMatrix(); //tangan kanan glPushMatrix(); glTranslatef(-2.7,-1.2,0); glColor3f(0.8,0.55,0.3); glScalef(1,3,1); glutSolidCube(1.3); glPopMatrix(); //tangan kiri
glPushMatrix(); glTranslatef(2.7,-1.2,0); glColor3f(0.8,0.55,0.3); glScalef(1,3,1); glutSolidCube(1.3); glPopMatrix(); //Kepala glPushMatrix(); glTranslatef(0,3.5,0); glColor3f(0.8,0.6,0.3); glScalef(1.5,1,1); glutSolidCube(5); glPopMatrix(); //mata glPushMatrix(); glTranslatef(-1.5,3.5,0.55); glColor3f(0,0,0); glutSolidSphere(2,100,100); glPopMatrix(); //mata glPushMatrix(); glTranslatef(1.5,3.5,0.55); glColor3f(0,0,0); glutSolidSphere(2,100,100); glPopMatrix(); //mulut glPushMatrix(); glRotatef(-65,1,0,0); glTranslatef(0,-1.1,2.8); glScalef(0.3,0.3,0.3); glColor3f(0,0,0); glutSolidCone(3,3,3,3); glPopMatrix(); glutSwapBuffers(); } void resize(int w1,int h1){ glViewport(0,0,w1,h1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void myKeyboard(unsigned char key, int x, int y){ if (key =='w') z+=5; else if (key == 's') z-=5; else if (key == 'a') { x1=0; y1=0; z1=1; sudut+=10; } else if (key == 'd') { y1=0; x1=0;
z1=1; sudut-=10; } } void mySpecialKeyboard(int key, int x, int y){ switch(key){ case GLUT_KEY_UP: x1=1; y1=0; z1=0; sudut-=10; break; case GLUT_KEY_DOWN: x1=1; y1=0; z1=0; sudut+=10; break; case GLUT_KEY_RIGHT: x1=0; y1=1; z1=0; sudut+=10; break; case GLUT_KEY_LEFT: x1=0; y1=1; z1=0; sudut-=10; break; } } void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0); glMatrixMode(GL_MODELVIEW); } void timer(int value){ glutPostRedisplay(); glutTimerFunc(50,timer,0); } void main (int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(w,h); glutCreateWindow("GLUT : WEAMAS CAPRINSA FATHIR"); gluOrtho2D(-w/2,w/2,-h/2,h/2); glutDisplayFunc(renderScene); glutReshapeFunc(resize); glutKeyboardFunc(myKeyboard); glutSpecialFunc(mySpecialKeyboard); glutTimerFunc(1,timer,0); init(); glutMainLoop();
}
Screenshoot :
Penjelasan : Untuk membuat bangun 3d ini menggunakan beberapa glutSolidCube(size) digunakan untuk membuat bangun kubus kemudian di tambahkan fungsi glScalef untuk merubah ukuran dari kubus untuk membuat kepala, badan , kaki dan tangan. Kemudian untuk tambahkan fungsi transisi untuk menggeser balok-balok yang dibuat tadi agar menjadi bentuk yang di inginkan. Terdapat fungsi mykeyboard dan myspesialkeyboard di gunakan untuk menangkap interaksi dari keyboard yang nantinya akan merubah nilai parameter dari fungsi glRotatef yang akan menimbulkan putaran-putaran yang berbeda-beda tiap tombol.
KESIMPULAN Ada beberapa fungsi yang di sediakan oleh glut yang dapat digunakan untuk membuat objek 3D : glutWireCube(GLdouble size) = kubus glutWireSphere(GLdouble radius,GLint slices, GLint stacks) = bola glutWireCone(GLdouble base, GLdouble height,GLint slices, Glint stacks) = kerucut
glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, Glint nsides, GLint rings) = banging seperti donat glutWireDodecahedron(void); = bangun 3d 12 sisi glutWiredTetrahedron void (void) = bangun 3d 4 sisi glutWireOctahedron(void); = bangun 3d 8 sisi glutWireIcosahedron(void); = bangun 3d 20 sisi glutWireTeapot(GLdouble size); = bangun 3d teko karena bangun yang di contohkan tadi masih berupa kerangka, untuk merubah menjadi bangun pada tinggal merubah “Wire” menjadi “Solid”.
DAFTAR PUSTAKA Team Asisten Universitas Negeri Malang. 2015. “Modul Praktikum V Objek 3D”. Malang : Universitas Negeri Malang