laporan grafika modul 5
DESCRIPTION
Laporan Grafika Modul 5 universitas negeri malangTRANSCRIPT
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<stdlib.h> #include<glut.h> 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 rotasi-
rotasi tersebut dan tulis program pada fungsi display. Beri keterangan.
Script :
#include<stdlib.h> #include<glut.h> 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<stdlib.h> #include<glut.h> 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<stdlib.h> #include<glut.h> 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 == '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: 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 masing-
masing 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<stdlib.h> #include<glut.h> 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<stdlib.h> #include<glut.h> 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<stdlib.h> #include<glut.h> 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<stdlib.h> #include<glut.h> 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<stdlib.h> #include<glut.h> 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