You are on page 1of 24

LAPORAN MODUL V

PRAKTIKUM GRAFIKA KOMPUTER


OBJEK 3D

Disusun untuk Memenuhi Matakuliah Praktikum Grafika Komputer


Yang Dibimbing oleh Bapak Heru Wahyu Herwanto

Disusun Oleh :
Ananda Putri Syaviri
130533608243
PTI Off B 2013

UNIVERSITAS NEGERI MALANG


FAKULTAS TEKNIK
JURUSAN TEKNIK ELEKTRO
PRODI PENDIDIKAN TEKNIK INFORMATIKA
APRIL 2015

Modul 5
Object 3D

A. Kompetensi Dasar
Memahami Inisialisasi dunia 3D.
Memahami Object 3D (Wired).
Memahami dasar menampilkan susunan objek 3D.

B. 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.
Sintaks:
#include<stdlib.h>
#include<glut.h>

float x=0, y=0, z=-10;


int w = 500, h = 500;

void drawQuad(int a, int b){


glColor3f(0,0,1);
glBegin(GL_QUADS);
glVertex2d(3, -3);
glVertex2d(-3, -3);
glVertex2d(-3, 3);
glVertex2d(3, 3);
glEnd();
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, 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+=1;
break;

case GLUT_KEY_DOWN:
z-=1;
break;
}
}
void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(100,100);
glutInitWindowSize(w,h);
glutCreateWindow("OBJEK 3D SYAVIRI");
glutTimerFunc(50, update, 0);
glutSpecialFunc(mySpecialKeyboard);
init();
glutDisplayFunc(render);
glutReshapeFunc (reshape);
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutMainLoop();
}

Hasil

Penjelasan
Program diatas menggunakan fungsi myspecialKeyboard yang digunakan untuk
mengubah bentuk dari objek yang dibangun pada program ini. Menggunakan tombol
navigasi key up dan key down, key up untuk meresize ukuran objek menjadi lebih
besar, sedangkan key down , merubah objke menjadi lebih kecil. Fungsi untuk
mendeklarasikan agar objke yang dibangun dapat bergerak 3D adalah fungsi init dan
reshape , yang nantinya pengaplikasiannya akan dipanggil pada fungsi utama,
sehingga ketika program dijalankan , objek dapat bergerak.
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.
Sintaks:
#include<stdlib.h>
#include<glut.h>

int w = 480;
int h = 480;
int tz ;
int x ;
int y ;
int z ;
float sudut;

void segiEmpat()
{
glBegin(GL_QUADS);
glVertex2d(0.5, -0.5);
glVertex2d(-0.5, -0.5);
glVertex2d(-0.5, 0.5);
glVertex2d(0.5, 0.5);
glEnd();
}

void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glColor3f(0., 0., 1.);
glTranslatef(0,0,tz);
glRotatef(sudut,x,y,z);
segiEmpat();
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 init()
{
glClearColor(0.0,0.0,0.0,1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.,(GLdouble)w/(GLdouble)h,1.,300.);
glMatrixMode(GL_MODELVIEW);
}

void mySpecialKeyboard (int key, int x, int y)


{
switch (key)
{
case GLUT_KEY_UP ://deteksi tombol panah atas
tz += 3;
break;
case GLUT_KEY_DOWN ://deteksi tombol panah atas
tz -= 3;
break;
}
}

void myKeyboard(unsigned char key, int a, int b)


{
if (key == 'x' )
{
sudut += 20;
x = 1;
y =0;
z =0;
}
else if (key == 'y' )
{
sudut += 20;
x = 0;
y =1;
z =0;
}
else if (key == 'z' )
{
sudut += 20;
x = 0;
y =0;
z =1;
}
}

void update(int value)


{
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}

void main(int argc,char **argv)


{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(500,500);
glutCreateWindow("OBJEK 3D SYAVIRI");
glutReshapeFunc(resize);
init();
gluOrtho2D(-250.0, 250.0, -250, 250.0);
glutDisplayFunc(renderScene);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(50,update,0);
glutMainLoop();
}

Hasil:
Penjelasan
Program diatas hampir sama seperti program sebelumnya, hanya saja , pergerakan
objke terlihat lebih dinamis, dapat berotasi dan bertranslasi pada sumbu x, y.
Menggunakan specialkeyboard up, down, right, dan left akan menggerakkan objek
berdasarkan sumbu x dan y. Searah dan berlawa nan jarumnya. Untuk pergerakannya
20 derajat tiap kali tombol keyboard x/y/z ditekan.

3. Latihan 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.
Sintaks:
#include <stdlib.h>
#include <glut.h>

int w=400, h=400, z=-50;


int x1=0, y1=0, sudut=0, z1=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);
glColor3f(0,0,1);
glutWireCube(4);
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 == 'x') {
x1=1;
y1=0;
z1=0;
sudut+=5;
}
else if (key == 'y') {
y1=1;
x1=0;
z1=0;
sudut+=-5;
}
else if (key == 'z') {
y1=0;
x1=0;
z1=z;
sudut+=5;
}
}

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 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("OBJEK 3D SYAVIRI");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}

Hasil

Penjelasan
Pada program diatas tidak menggunakan fungsi drawQuads, seperti program- program
sbeelumnya, tetapi menggunakan fungsi WireCube untuk membuat sebuah kerangka
kubus 3D, sehingga tidak ada pendeklarasian penggunaan glvertex untuk membentuk
sebuah objek. Menggunakan fungsi mykeyboard untuk memberikan pergerakan pada
objek yang bergerak terhadap sumbu x, y dan z searah maupun berlawanan dengan
arah jarum jam. Menggunakan fungsi myspecialKeyboard juga untuk pergerakan
objke , key up dan key down.

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.
Sintaks:
#include <stdlib.h>
#include <glut.h>

int w=400, h=400, z=-50;


int x1=0, y1=0, sudut=0, z1=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);
glColor3f(0,0,1);
// glutWireCube(4);
glutWireSphere(50,50,50);
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 == 'x') {
x1=1;
y1=0;
z1=0;
sudut+=5;
}
else if (key == 'y') {
y1=1;
x1=0;
z1=0;
sudut+=-5;
}
else if (key == 'z') {
y1=0;
x1=0;
z1=z;
sudut+=5;
}
}

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 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("OBJEK 3D SYAVIRI");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}

Hasil
Penjelasan
Sama seperti program sebelumnya, tidak menggunakan fungsi drawQuad, melainkan
menggunakan fungsi wireSphere yang merupakan kerangka 3D objek bola. Untuk
membangun garis garis pada bola, menggunakan parameter pada fungsi wireSphere itu
sendiri. Banyak- sedikitnya atau besar kecilnya objke tergantung pada parameter yang
digunakan.

5. Latihan 5 - Buatlah sebuah program dengan menggunakan fungsi WireCone interaksi


mengubah tinggi (panah atas, panah bawah) , alas (panah kanan, panah kiri),
potongan(a,d).
Sintaks :
#include <stdlib.h>
#include <glut.h>
int w = 480;
int h = 480;
int z = -150;
int sudut = 45;
int sumbux, sumbuy, sumbuz;
void wirecone (void){
glColor3f(0,0,1);
glLineWidth(2);
glutWireCone(40., 80, 40,20);
}
void renderScene(){
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0,z);
glRotatef(sudut,sumbux,sumbuy,sumbuz);
wirecone();
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, 1300.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void init(){
glClearColor(0,0,0,1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float) w/(float) h, 1.0, 1300.0);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
if (key == 'a') z+=2;
else if (key == 's') z-=2;
else if (key == 'x') {sudut +=2; sumbux = 1; sumbuy = 0; sumbuz = 0;}
else if (key == 'y') {sudut +=2; sumbux = 0; sumbuy = 1; sumbuz = 0;}
else if (key == 'z') {sudut +=2; sumbux = 0; sumbuy = 0; sumbuz = 1;}
}
void update (int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main (int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(480,480);
glutCreateWindow("OBJEK 3D SYAVIRI");
gluOrtho2D(-320.,320.,-320.,320.);
glutTimerFunc(50, update, 0);
glutDisplayFunc(renderScene);
glutKeyboardFunc(myKeyboard);
glutReshapeFunc(resize);
init();
glutMainLoop();
}

Hasil:
Penjelasan
Program diatas menggunakan fungsi wirecone yang membentuk kerangka objek 3D
kerucut. Parameter wirecone menunjukkan alas, tinggi, slice, sedangkan parameter
terakhir langsung di inputkan tanpa deklarasi variabel. Untuk animasi 3D pada
program ini , sama seperti program- program sebelumnya, scalef, translate, rotatef.
Untuk scalef maka kerucut diatas akan semakin mengecil/membesar tergantung
keyboard yang digunakan, sesuai pendeklarasian pada script. Untuk pendeklarasian
pergerakan objke dideklarasikan pada fungsi myKeyboard, jika menggunakan
keyboard tertentu sesuai yang dirumuskan, maka akan mengubah objek.

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.
Sintaks :
#include<stdlib.h>
#include<glut.h>
float x=0, y=0, z=-10;
int w = 320, h = 320, i, j, k, l;
int dlm = 2, lr=4, sisi=50, cincin=50;
void objek(void){
glColor3f(0,0,1);
glutWireTorus(1, 3, 50, 50);
}
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);
objek();
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 == 'a')
{
i+=10; j=1; k=0;
}
else if(key == 'b')
{
i+=10; j=0; k=1;
}
else if(key == 'c')
{
i+=10; j=1; k=1;
}
}
void mySpecialKeyboard(int key, int x, int y){
switch(key){
case GLUT_KEY_UP:
dlm+=1;
break;
case GLUT_KEY_DOWN:
dlm-=1;
break;
case GLUT_KEY_LEFT:
lr-=1;
break;
case GLUT_KEY_RIGHT:
lr-=-1;
break;
}
}

void main(int argc, char **argv) {


glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(100,100);
glutInitWindowSize(w,h);
glutCreateWindow("OBJEK 3D SYAVIRI");
glutTimerFunc(50, update, 0);
glutKeyboardFunc(myKeyboard);
init();
glutDisplayFunc(myDisplay);
glutReshapeFunc (reshape);
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutMainLoop();
}

Hasil

Penjelasan
Program diatas menggunakan fungsi wire torus yang membentuk kerangka donat.
Parameter dari wire torus menunjukkan diamater dalam, diameter luar, dan cincin
untuk jumlah ring. Menggunakan fungsi mykeyboard dan specialKeuboard untuk
peregrakan objek. Untuk penggunaan parameter perlu diperhatika karena semakin
sedikit ring maka bentuk tidak akan terlihat bulat/ menjadi bulat dan semakin kecil
diameter dalamnya maka bentuknya tidak akan terlihat jelas.

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.
Sintaks :
#include<stdlib.h>
#include<glut.h>
#include<stdio.h>
float w=480, h=480;
float n=-10;
int sumbu=30;
int xx=0, yy=0, zz=0, s=2;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0,n);
glRotatef(sumbu, xx,yy,zz);
glColor3f(0,0,1);
glutWireTeapot(s);
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 init()
{
glClearColor(1.0,1.0,1.0,1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.,(GLdouble)w/(GLdouble)h,1.,300.);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y)
{
if (key=='x')
{
sumbu+=10;
xx=1;
yy=0;
zz=0;
}
else if(key=='y')
{
sumbu+=10;
xx=0;
yy=1;
zz=0;
}
else if(key=='z')
{
sumbu+=10;
xx=0;
yy=0;
zz=1;
}
}

void Spesial(int key, int x, int y)


{
switch(key)
{
case GLUT_KEY_UP:
s++;
break;
case GLUT_KEY_DOWN:
s--;
break;
}
}
void timer(int value)
{
glutPostRedisplay();
glutTimerFunc(500,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("OBJEK 3D SYAVIRI");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(display);
glutReshapeFunc(resize);
init();
glutTimerFunc(50,timer,0);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(Spesial);
glutMainLoop();
}

Hasil
Penjelasan
Program diatas menggunakan fungsi WireTeapot yang membentuk kerangka teko.
Untuk pergerakan objek menggunakan fungsi myKeyboard dan special, sehingga
objek akan berotasi, bertranslasi atau membesar/mengecil sesuai tombol yang ditekan.
Pergerakannya mengarah pada sumbu x dan y, kemudian arah putaran searah dan
berlawanan arah jarum jam.

C. 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.
Sintaks :
#include<stdlib.h>
#include<glut.h>

int w=640, h=640, z=-30;


int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0;

void balok (int a, int panjang, int lebar, int tinggi){


glPushMatrix();
glColor3f(0,1,0); //hijau
glScalef(panjang,tinggi,lebar);
glutWireCube(a);
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(3,4,3,3);

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 =='q') z-=3; //zoom out
else if (key == 'a') z+=3; //zoom in
else if (key == 'z') { //counter clockwise
x1=0;
y1=0;
z1=1;
sudut+=30;
}
else if (key == 'w') {//clockwise
y1=0;
x1=0;
z1=1;
sudut-=30;
}
}

void mySpecialKeyboard(int key, int x, int y){


switch(key){
case GLUT_KEY_UP:
x1=1;
y1=0;
z1=0;
sudut-=30;
break;
case GLUT_KEY_DOWN:
x1=1;
y1=0;
z1=0;
sudut+=30;
break;
case GLUT_KEY_RIGHT:
x1=0;
y1=1;
z1=0;
sudut+=30;
break;
case GLUT_KEY_LEFT:
x1=0;
y1=1;
z1=0;
sudut-=30;
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(320,240);
glutInitWindowSize(w,h);
glutCreateWindow("ASISTENSI 1 SYAVIRI");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}

Hasil

Penjelasan
Untuk membuat program diatas, pendeklarasian pembentukan objek dan penggunaan
animasi dideklarasikan pada fungsi renderScene. Program diatas menggunakan fungsi
balok dengan parameter panjang lebar tinggi dan ketebalan garis. Terdapat
pendeklarasian fungsi translate dan rotatef.

2. Buatlah Danbo 3 dimensi dengan interaksi memutar di 3 sumbu(searah dan


berlawanan dengan arah jarum jam). Sajikan source code dan screenshotnya.
Sintaks:
#include <Windows.h>
#include <iostream>
#include <glut.h>
#include <math.h>

int a=640, b=320, c=-30;


int a1=0, b1=0, sud=0, c1=0;

void myKeyboard(unsigned char key, int x, int y) {


if (key =='a') c+=3;
else if (key == 'b') c-=3;
else if (key == 'c') {
a1=0;b1=0;c1=1;
sud+=15;
}
else if (key == 'd') {
a1=1;b1=0;c1=0;
sud+=15;
}
else if (key == 'e') {
a1=1;b1=1;c1=0;
sud+=15;
}
}

void init() {
glClearColor(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30., (GLdouble)a/(GLdouble)b, 1., 300.);
glMatrixMode(GL_MODELVIEW);
}

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 Balok(double p, double l, double t) {


glScalef(p, t, l);
glutSolidCube(1);
}

void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glClearColor(0,0,1,0); //biru
glTranslatef(0, 0, c);
glRotatef(sud, a1, b1, c1);

glPushMatrix(); //badan
glColor3f(1, 0, 1);
Balok(10, 6, 9);
glPopMatrix();

glPushMatrix(); //kepala
glTranslatef(0, 9.5, 0);
glColor3f(0, 0.5, 1);
Balok(15, 8, 10);
glPopMatrix();

glPushMatrix(); //mata kiri


glTranslatef(-2.2, 9.6, 4.1);
glRotatef(90, 0, 1, 0);
glColor3f(0, 0, 0);
glutSolidSphere(1, 2, 30);
glPopMatrix();

glPushMatrix(); //mata kanan


glTranslatef(2.2, 9.6, 4.1);
glRotatef(90, 0, 1, 0);
glColor3f(0, 0, 0);
glutSolidSphere(1, 2, 30);
glPopMatrix();

glPushMatrix(); //hidung
glTranslatef(0, 6.5, 4.1);
glRotatef(90, 0, 1, 0);
glRotatef(-90, 1, 0, 0);
glColor3f(0, 0, 0);
glutSolidCone(1.5, 2, 2, 2);
glPopMatrix();

glPushMatrix(); //tangan kiri


glTranslatef(-6.5, -0.5, 2.5);
glRotatef(-45, 1, 0, 0);
glColor3f(0, 0.5, 1);
Balok(4, 4, 10);
glPopMatrix();

glPushMatrix(); //tangan kanan


glTranslatef(6.5, -0.5, -2.5);
glRotatef(45, 1, 0, 0);
glColor3f(0, 0.5, 1);
Balok(4, 4, 10);
glPopMatrix();

glPushMatrix(); //kaki kiri


glTranslatef(-2, -4, -0.5);
glRotatef(10, 1, 0, 0);
glColor3f(0, 0.5, 1);
Balok(4, 4, 8);
glPopMatrix();

glPushMatrix(); //kaki kiri


glTranslatef(2, -4, 0.5);
glRotatef(-10, 1, 0, 0);
glColor3f(0, 0.5, 1);
Balok(4, 4, 8);
glPopMatrix();
glutSwapBuffers();
}

void timer(int value) {


glutPostRedisplay();
glutTimerFunc(50,timer,0);
}

void main(int argc, char **argv) {


glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(320,240);
glutInitWindowSize(a,b);
glutCreateWindow("ASISTENSI 2 SYAVIRI");
gluOrtho2D(-a/2, a/2, -b/2, b/2);
glutDisplayFunc(renderScene);
glutTimerFunc(50, timer, 0);
glutKeyboardFunc(myKeyboard);
glutReshapeFunc(resize);
init();
glutMainLoop();
}

- Hasil
Penjelasan
Program diatas menggunakan fungsi balok yang didalamnya terdapat pendeklarasian
penggunakan scalef dan solidcube yang didalamnya menggunakan parameter 1, yang
dimaksudkan, nilai parameter pada setiap balok akan berbeda kesolidannya tergantung
dari parameter yang membangun balok itu sendiri. Untuk membuat setiap anggota
tubuh, menggunakan fungsi balok dengan parameter berbeda sesuai keinginan dan
kebutuhan dari bentuk objek agar terlihat baik.

D. Kesimpulan
- Objek 3D merupakan perputaran dari 3 sumbu.
- Fungsi wire Cube digunakan untuk membuat kerangka balok secara otomatis. Fungsi
wiresphere untuk membuat kerangka bola. Fungsi wire teapot untuk membuat
kerangka teko. Fungsi wire torus untuk membuat kerangka donat. Fungsi wire cone
utnuk membuat kerangka kerucut.
- Gunakan fungsi glutSolid untuk dapat membuat objek menjadi berisi atau membuat
objek dengan full.
- Untuk pergerakan objek menggunakan fungsi rotate, dapat diatur jika ingin membuat
objek berputar searah atau berlawanan jarum jam. Untuk putaran searah jarum jam
maka maka deklarasikan sudutnya dengan menggunakan operator (+) atau increment,
sedangkan jika ingin berlawanan maka menggunakan operator (-) atau decrement.
- Untuk dapat memudahkan dalam penulisan parameter, maka dapat menggunakan
pedneklarasian variable, sehingga tidak perlu menuliskan secara berulang, cukup
menuliskan variable yang digunakan, maka nantinya program akan memanggil nilai
dari variable tersebut.

E. Daftar Pustaka
Modul V praktikum Grafika Komputer, Jurusan Teknik Elektro, Fakultas
Teknik,Universitas Negri Malang.