Anda di halaman 1dari 13

LAPORAN PRAKTIKUM

GRAFIKA DAN KOMPUTASI VISUAL

Judul Praktikum:
Proyeksi dan Animasi
Disusun oleh:
Rahmat Hidayat 240101313120001

Asisten praktikum:
Muhammad Nur Hardyanto
Ramadhina Febry D.
Emilia Widiyanti

INFORMATIKA
FAKULTAS SAINS DAN MATEMATIKA
UNIVERSITAS DIPONEGORO
SEMARANG
2015
BAB
PEMBAHASAN

a) Pertanyaan dan Jawaban


a) Apakah fungsi glutReshapeFunc? Jelaskan!
Jawaban:
glutReshapeFunc berfungsi untuk memberikan perintah untuk membuat layar sesuai
dengan spesifikasi yang didefinisikan di dalam prosedur yang menjadi parameter
glutReshapeFunc(). Pada kode sumber seperti pada modul praktikum 4 ataupun yang penulis
gunakan pada kode sumber di dalam laporan ini berfungsi sebagai membentuk layar seolah-
olah menampilkan sesuatu sesuai dengan perspektif 3D.

b) Apa tugas prosedur idle pada kode untuk kubus bergerak?


Jawaban:
Prosedure idle berfungsi untuk memberikan nilai yang berbeda-beda (bertambah pada
x dan y serta berkurang pada z) sebagai sudut rotasi dan kemudian memanggil fungsi display
agar terjadi loop tak hingga (sampai dihentikan oleh user).

c) Jelaskan secara sederhana yang dimaksud dengan proyeksi, proyeksi projection dan
modelview!
Jawaban:
Proyeksi merupakan cara suatu objek ditransformasikan ke layar. Proyeksi projection
adalah mentransformasikan sesuatu ke dalam layar seolah-olah benda tersebut terlihat
sebagai benda nyata (seolah-olah berbentuk 3D). Modelview mweupakan proyeksi yang
menampilkan objek ke layar tanpa mengubah ukuran dari objek yang sesungguhnya akan
ditampilkan.

b) Kode Program dan Penjelasannya


Penulis menggunakan satu projek dengan satu kode sumber untuk membentuk suatu tangan
3D beserta kemampuan tangan tersebut untuk bergerak. Projek tersebut bernama tangan.dev dan
kode sumbernya bernama tangan.cpp
tangan.cpp
#include <GL/glut.h>
static int thumb1 = 0, thumb2 = 0, thumb11 = 0;
static int telunjuk1 = 0, telunjuk2 = 0, telunjuk3 = 0;
static int jTengah1 = 0, jTengah2 = 0, jTengah3 = 0;
static int jManis1 = 0, jManis2 = 0, jManis3 = 0;
static int kelingking1 = 0, kelingking2 = 0, kelingking3 = 0;
static int telapak1 = 0, telapak2 = 0;
static int lenganA1 = 0, lenganA2 = 0,lenganB = 0;

void init(void){
glClearColor(0,0,0,0);
glShadeModel(GL_FLAT);
}

void tampilan(void){
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
//lengan atas
glTranslatef(-1.8,0,0);
glRotatef((GLfloat) lenganA1,0,0,1);
glRotatef((GLfloat) lenganA2,0,1,0);
glTranslatef(1.8,0,0);
glPushMatrix();
glTranslatef(-1.4,0,0);
glScalef(0.8,0.2,0.56);
glutWireCube(1);
glPopMatrix();
//lengan bawah
glTranslatef(-1,0,0);
glRotatef((GLfloat) lenganB,0,0,1);
glTranslatef(1,0,0);
glPushMatrix();
glTranslatef(-0.6,0,0);
glScalef(0.8,0.2,0.56);
glutWireCube(1);
glPopMatrix();
//telapak
glRotatef((GLfloat) telapak1, 1,0,0);
glRotatef((GLfloat) telapak2, 0,0,1);
glPushMatrix();
glScalef (0.4, 0.2, 0.56);
glutWireCube (1.0);
glPopMatrix();
//ibu jari
glPushMatrix();
glTranslatef(0,0,0.38);
glRotatef((GLfloat) -thumb11,1,0,0);
glRotatef((GLfloat) thumb1,0,1,0);
glPushMatrix();
glScalef(0.1,0.1,0.2);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0,0,0.2);
glRotatef((GLfloat) -thumb2,1,0,0);
glPushMatrix();
glScalef(0.1,0.1,0.25);
glutWireCube(1.0);
glPopMatrix();
glPopMatrix();
//jari telunjuk
glPushMatrix();
glTranslatef(0.3,0,0.22);
glRotatef((GLfloat) telunjuk1,0,0,1);
glPushMatrix();
glScalef(0.2,0.1,0.13);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0.2,0,0);
glRotatef((GLfloat) telunjuk2,0,0,1);
glPushMatrix();
glScalef(0.22,0.1,0.13);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0.22,0,0);
glRotatef((GLfloat) telunjuk3,0,0,1);
glPushMatrix();
glScalef(0.21,0.1,0.13);
glutWireCube(1.0);
glPopMatrix();
glPopMatrix();

//jari tengah
glPushMatrix();
glTranslatef(0.3,0,0.05);
glRotatef((GLfloat) jTengah1,0,0,1);
glPushMatrix();
glScalef(0.25,0.1,0.14);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0.25,0,0);
glRotatef((GLfloat) jTengah2,0,0,1);
glPushMatrix();
glScalef(0.27,0.1,0.14);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0.27,0,0);
glRotatef((GLfloat) jTengah3,0,0,1);
glPushMatrix();
glScalef(0.21,0.1,0.14);
glutWireCube(1.0);
glPopMatrix();
glPopMatrix();

//jari manis
glPushMatrix();
glTranslatef(0.3,0,-0.1);
glRotatef((GLfloat) jManis1,0,0,1);
glPushMatrix();
glScalef(0.2,0.1,0.11);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0.2,0,0);
glRotatef((GLfloat) jManis2,0,0,1);
glPushMatrix();
glScalef(0.21,0.1,0.11);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0.21,0,0);
glRotatef((GLfloat) jManis3,0,0,1);
glPushMatrix();
glScalef(0.2,0.1,0.11);
glutWireCube(1.0);
glPopMatrix();
glPopMatrix();

//jari kelingking
glPushMatrix();
glTranslatef(0.3,0,-0.21);
glRotatef((GLfloat) kelingking1,0,0,1);
glPushMatrix();
glScalef(0.18,0.1,0.1);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0.18,0,0);
glRotatef((GLfloat) kelingking2,0,0,1);
glPushMatrix();
glScalef(0.17,0.1,0.1);
glutWireCube(1.0);
glPopMatrix();
glTranslatef(0.17,0,0);
glRotatef((GLfloat) kelingking3,0,0,1);
glPushMatrix();
glScalef(0.19,0.1,0.1);
glutWireCube(1.0);
glPopMatrix();
glPopMatrix();

glPopMatrix();
glutSwapBuffers();
}

void reshape (int w, int h) {


glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0);
}

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


switch (key){
//lengan atas
case 'q': lenganA1 = (lenganA1 + 5) % 360;
if(lenganA1 > 110) lenganA1 = 110;
glutPostRedisplay();
break;
case 'Q': lenganA1 = (lenganA1 - 5) % 360;
if(lenganA1 < -110) lenganA1 = -110;
glutPostRedisplay();
break;
case 'w': lenganA2 = (lenganA2 + 5) % 360;
if (lenganA2 > 90) lenganA2 = 90;
glutPostRedisplay();
break;
case 'W': lenganA2 = (lenganA2 - 5) % 360;
if (lenganA2 < -90) lenganA2 = -90;
glutPostRedisplay();
break;
//lengan bawah
case 'a': lenganB = (lenganB + 5) % 360;
if(lenganB > 120) lenganB = 120;
glutPostRedisplay();
break;
case 'A': lenganB = (lenganB - 5) % 360;
if(lenganB < 0) lenganB = 0;
glutPostRedisplay();
break;
//telapak tangan
case 'z': telapak1 = (telapak1 + 5) % 360;
if(telapak1 > 90) telapak1 =90;
glutPostRedisplay();
break;
case 'Z': telapak1 = (telapak1 - 5) % 360;
if(telapak1 < -90) telapak1 =-90;
glutPostRedisplay();
break;
case 'x': telapak2 = (telapak2 + 5) % 360;
if (telapak2 > 90) telapak2 = 90;
glutPostRedisplay();
break;
case 'X': telapak2 = (telapak2 - 5) % 360;
if (telapak2 < 0) telapak2 = 0;
glutPostRedisplay();
break;
//ibu jari
case 'C': thumb11 = (thumb11 - 5) % 360;
if (thumb11 < 0) thumb11 = 0;
glutPostRedisplay();
break;
case 'c': thumb11 = (thumb11 + 5) % 360;
if (thumb11 > 90) thumb11 = 90;
glutPostRedisplay();
break;
case 'D': thumb1 = (thumb1 - 5) % 360;
if (thumb1 < 0) thumb1 = 0;
glutPostRedisplay();
break;
case 'd': thumb1 = (thumb1 + 5) % 360;
if (thumb1 > 90) thumb1 = 90;
glutPostRedisplay();
break;
case 'E': thumb2 = (thumb2 - 5) % 360;
if (thumb2 < 0) thumb2 = 0;
glutPostRedisplay();
break;
case 'e': thumb2 = (thumb2 + 5) % 360;
if (thumb2 > 90) thumb2 = 90;
glutPostRedisplay();
break;
//telunjuk
case 'V': telunjuk1 = (telunjuk1 - 5) % 360;
if (telunjuk1 < 0) telunjuk1 = 0;
glutPostRedisplay();
break;
case 'v': telunjuk1 = (telunjuk1 + 5) % 360;
if (telunjuk1 > 90) telunjuk1 = 90;
glutPostRedisplay();
break;
case 'F': telunjuk2 = (telunjuk2 - 5) % 360;
if (telunjuk2 < 0) telunjuk2 = 0;
glutPostRedisplay();
break;
case 'f': telunjuk2 = (telunjuk2 + 5) % 360;
if (telunjuk2 > 90) telunjuk2 = 90;
glutPostRedisplay();
break;

case 'R': telunjuk3 = (telunjuk3 - 5) % 360;


if (telunjuk3 < 0) telunjuk3 = 0;
glutPostRedisplay();
break;
case 'r': telunjuk3 = (telunjuk3 + 5) % 360;
if (telunjuk3 > 90) telunjuk3 = 90;
glutPostRedisplay();
break;
//jari tengah
case 'B': jTengah1 = (jTengah1 - 5) % 360;
if (jTengah1 < 0) jTengah1 = 0;
glutPostRedisplay();
break;
case 'b': jTengah1 = (jTengah1 + 5) % 360;
if (jTengah1 > 90) jTengah1 = 90;
glutPostRedisplay();
break;

case 'G': jTengah2 = (jTengah2 - 5) % 360;


if (jTengah2 < 0) jTengah2 = 0;
glutPostRedisplay();
break;
case 'g': jTengah2 = (jTengah2 + 5) % 360;
if (jTengah2 > 90) jTengah2 = 90;
glutPostRedisplay();
break;

case 'T': jTengah3 = (jTengah3 - 5) % 360;


if (jTengah3 < 0) jTengah3 = 0;
glutPostRedisplay();
break;
case 't': jTengah3 = (jTengah3 + 5) % 360;
if (jTengah3 > 90) jTengah3 = 90;
glutPostRedisplay();
break;
//jari manis
case 'N': jManis1 = (jManis1 - 5) % 360;
if (jManis1 < 0) jManis1 = 0;
glutPostRedisplay();
break;
case 'n': jManis1 = (jManis1 + 5) % 360;
if (jManis1 > 90) jManis1 = 90;
glutPostRedisplay();
break;

case 'H': jManis2 = (jManis2 - 5) % 360;


if (jManis2 < 0) jManis2 = 0;
glutPostRedisplay();
break;
case 'h': jManis2 = (jManis2 + 5) % 360;
if (jManis2 > 90) jManis2 = 90;
glutPostRedisplay();
break;
case 'Y': jManis3 = (jManis3 - 5) % 360;
if (jManis3 < 0) jManis3 = 0;
glutPostRedisplay();
break;
case 'y': jManis3 = (jManis3 + 5) % 360;
if (jManis3 > 90) jManis3 = 90;
glutPostRedisplay();
break;
//kelingking
case 'M': kelingking1 = (kelingking1 - 5) % 360;
if (kelingking1 < 0) kelingking1 = 0;
glutPostRedisplay();
break;
case 'm': kelingking1 = (kelingking1 + 5) % 360;
if (kelingking1 > 90) kelingking1 = 90;
glutPostRedisplay();
break;

case 'J': kelingking2 = (kelingking2 - 5) % 360;


if (kelingking2 < 0) kelingking2 = 0;
glutPostRedisplay();
break;
case 'j': kelingking2 = (kelingking2 + 5) % 360;
if (kelingking2 > 90) kelingking2 = 90;
glutPostRedisplay();
break;

case 'U': kelingking3 = (kelingking3 - 5) % 360;


if (kelingking3 < 0) kelingking3 = 0;
glutPostRedisplay();
break;
case 'u': kelingking3 = (kelingking3 + 5) % 360;
if (kelingking3 > 90) kelingking3 = 90;
glutPostRedisplay();
break;

case 27: exit(10);


//gunakan tombol tab untuk reset
case 9 : kelingking1 = kelingking2 = kelingking3 =
lenganA1 = lenganA2 = lenganB = jManis1 = jManis2 = jManis3 = jTengah1
= jTengah2 = jTengah3 = telunjuk1 = telunjuk2 = telunjuk3 = thumb1 =
thumb11 = thumb2 = telapak1 = telapak2 = 0;
glutPostRedisplay();
break;
default:break;
}
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (700, 600);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init();
glutDisplayFunc(tampilan);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
Program di atas menggambarkan sebuah tangan kanan. Bagian-bagian dari tangan tersebut
yang penulis gambarkan adalah lengan atas, lengan bawah, telapak tangan, dan lima jari tangan.
Masing-masing ruas jari tangan pada gambar tersebut penulis buat masing-masing secara
terpisah, sehingga memungkinkan untuk menggerakan masing-masing ruas tangan tersebut.
Berikut adalah rincian key-key pada keyboard yang dapat digunakan untuk menggerakan tangan
tersebut:
a) Lengan atas. Terdiri dari:
1) ‘q’, menggerakan lengan atas ke atas, dibatasi sampai 110 derajat.
2) ‘Q’, menggerakan lengan atas ke bawah, dibatasi sampai -110 derajat.
3) ‘w’, menggerakan lengan atas ke dalam, dibatasi sampai 90 derajat.
4) ‘W’, menggerakan lengan atas ke luar, dibatasi sampai -90 derajat.
b) Lengan bawah. Terdiri dari:
1) ‘a’, menekuk lengan bawah mendekati lengan atas, dibatasi hingga 120 derajat.
2) ‘A’, meluruskan lengan bawah menjauhi lengan atas, dibatasi hingga 0 derajat.
c) Telapak tangan. Terdiri dari:
1) ‘z’, memutar telapak tangan dengan arah berlawanan arah jarum jam dengan
batas 90 derajat.
2) ‘Z’, memutar telapak tangan dengan arah searah jarum jam dengan batas -90
derajat.
3) ‘x’, menekuk telapak tangan mendekati lengan bawah hingga 90 derajat.
4) ‘X’, meluruskan kembali telapak tangan hingga 0 derajat (datar).
d) Ibu jari. Terdiri dari:
1) ‘C’, menggerakan pangkal ibu jari sehingga datar hingga 0 derajat.
2) ‘c’, menaikan pangkal ibu jari hingga berdiri tegak terhadap telapak tangan
(maksimal 90 derajat).
3) ‘D’, mengerakan pangkal ibu jari secara horizontal hingga tegak lurus terhadap
jari lainnya.
4) ‘d’, menggerakan pangkal ibu jari secara horizontal hingga sejajar dengan jari
lainnya.
5) ‘E’, meluruskan ruas terjauh dari telapak tangan pada ibu jari (hingga 0 derajat
terhadap ruas ibu jari dekat telapak tangan).
6) ‘e’, menekuk ruas ibu jari ujung hingga tegak lurus dengan pangkal ibu jari.
e) Telunjuk. Terdiri dari:
1) ‘V’, meluruskan pangkal telunjuk.
2) ‘v’, menekuk pangkal telunjuk hingga tegak lurus dengan telapak tangan.
3) ‘F’, meluruskan ruas tengah telunjuk.
4) ‘f’, menekuk ruas tengah telunjuk hingga tegak lurus dengan pangkal telunjuk.
5) ‘R’, meluruskan ruas ujung telunjuk.
6) ‘r’, menekuk ruas ujung telunjuk hingga tegak lurus dengan ruas tengah.
f) Jari tengah. Terdiri dari:
1) ‘B’, meluruskan pangkal jari tengah.
2) ‘b’, menekuk pangkal jari tengah hingga tegak lurus dengan telapak tangan.
3) ‘G’, meluruskan ruas tengah jari tengah.
4) ‘g’, menekuk ruas tengah jari tengah hingga tegak lurus dengan pangkal jari
tengah.
5) ‘T’, meluruskan ruas ujung jari tengah.
6) ‘t’, menekuk ruas ujung jari tengah hingga tegak lurus dengan ruas tengah.
g) Jari manis. Terdiri dari:
1) ‘N’, meluruskan pangkal jari manis.
2) ‘n’, menekuk pangkal jari manis hingga tegak lurus dengan telapak tangan.
3) ‘H’, meluruskan ruas tengah jari manis.
4) ‘h’, menekuk ruas tengah jari manis hingga tegak lurus dengan pangkal jari
manis.
5) ‘Y’, meluruskan ruas ujung jari manis.
6) ‘y’, menekuk ruas ujung jari manis hingga tegak lurus dengan ruas tengah.
h) Kelingking. Terdiri dari:
1) ‘M’, meluruskan pangkal kelingking.
2) ‘m’, menekuk pangkal kelingking hingga tegak lurus dengan telapak tangan.
3) ‘J’, meluruskan ruas tengah kelingking.
4) ‘j’, menekuk ruas tengah kelingking hingga tegak lurus dengan pangkal
kelingking.
5) ‘U’, meluruskan ruas ujung kelingking.
6) ‘u’, menekuk ruas ujung kelingking hingga tegak lurus dengan ruas tengah.
i) ESC, digunakan untuk keluar dari program.
j) Tab, digunakan untuk mereset gambar seperti pertama kali ditemui saat program dibuka.

Berikut adalah screenshot dari program tangan tersebut.


Gambar 1. Kondisi pertama kali program dibuka atau setelah penekanan key tab

Gambar 2. Setelah menekan key ‘q’ beberapa kali


Gambar 3. Setelah penekanan key ‘w’ beberapa kali

Gambar 4. Setelah menekan key ‘a’ beberapa kali


Gambar 5. Setelah menekan key ‘z’ beberapa kali

Gambar 6. Hasil dari kombinasi penekanan key-key.

Anda mungkin juga menyukai