laporan grafika modul 5

27
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

Upload: weamas-caprinsa-fathir

Post on 21-Dec-2015

82 views

Category:

Documents


20 download

DESCRIPTION

Laporan Grafika Modul 5 universitas negeri malang

TRANSCRIPT

Page 1: Laporan Grafika Modul 5

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

Page 2: Laporan Grafika Modul 5

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);

Page 3: Laporan Grafika Modul 5

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

Page 4: Laporan Grafika Modul 5

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') {

Page 5: Laporan Grafika Modul 5

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 :

Page 6: Laporan Grafika Modul 5

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);

Page 7: Laporan Grafika Modul 5

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);

Page 8: Laporan Grafika Modul 5

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

Page 9: Laporan Grafika Modul 5

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;}

Page 10: Laporan Grafika Modul 5

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); }

Page 11: Laporan Grafika Modul 5

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

Page 12: Laporan Grafika Modul 5

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(); }

Page 13: Laporan Grafika Modul 5

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);

Page 14: Laporan Grafika Modul 5

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

Page 15: Laporan Grafika Modul 5

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;}

Page 16: Laporan Grafika Modul 5

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 :

Page 17: Laporan Grafika Modul 5

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;

Page 18: Laporan Grafika Modul 5

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){

Page 19: Laporan Grafika Modul 5

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 :

Page 20: Laporan Grafika Modul 5

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);

Page 21: Laporan Grafika Modul 5

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);

Page 22: Laporan Grafika Modul 5

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 :

Page 23: Laporan Grafika Modul 5

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

Page 24: Laporan Grafika Modul 5

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;

Page 25: Laporan Grafika Modul 5

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();

Page 26: Laporan Grafika Modul 5

}

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

Page 27: Laporan Grafika Modul 5

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