Praktikum
Grafika Komputer
[MODUL]
Genap
2016/2017
Gambaran Umum:
Praktikum ini merupakan bagian dari kuliah Grafika Komputer. Dalam praktikum ini, praktikan
dikenalkan dengan beberapa aspek yang berkaitan dalam pemrograman API grafik.
Praktikum ini memuat beberapa modul yang berisi tentang struktur program OpenGL (Open
Graphics Library): primitif drawing, kurva, transformasi, 3 dimensi, animasi, dan pencahayaan
pada OpenGL. Modul-modul ini harus dapat dikuasai oleh mahasiswa sebagai dasar penguasaan
Grafika Komputer.
I. Tugas Pendahuluan
1. Jelaskan secara singkat sejarah OpenGL!
2. Sebutkan beberapa contoh software yang menggunakan OpenGL!
3. Apa guna glBegin() dan glEnd()?
4. Jelaskan apa itu vertex!
II. Pengantar
Grafika Komputer dewasa ini telah melesat sangat jauh dibandingkan pada masa
awal kemunculannya. Cakupannya telah meluas ke berbagai bidang: kedokteran, sains,
teknik, bisnis, industri, seni, hiburan, iklan, dan lain-lain.
Salah satu tools/library pembuatan aplikasi grafik adalah OpenGL (Open Graphics
Library). OpenGL adalah suatu standar grafik yang menyediakan fungsi-fungsi low-level
untuk pembuatan berbagai gambar pada komputer.
Sebagai API (Application Programming Interface), OpenGL bersifat platform-
independent/tidak tergantung pada piranti dan platform yang digunakan. Sehingga, adalah
hal yang wajar jika aplikasi OpenGL berjalan pada sistem operasi Windows, UNIX, Mac,
Android, dll. OpenGL pada awalnya didesain untuk digunakan oleh bahasa pemrograman
C/C++, namun dalam perkembangannya OpenGL dapat juga digunakan oleh bahasa
pemrograman yang lain seperti Java, Tcl, Ada, Visual Basic, Delphi, maupun Fortran.
Primitif Drawing
OpenGL memiliki beberapa obyek dasar yang disebut primitif. Gambar-gambar
kompleks dibuat dari kombinasi obyek-obyek primitif ini. Primitif mudah digambar pada
layar monitor karena menggunakan persamaan geometrik sederhana. Contoh primitif /
grafik dasar adalah:
1. Titik
2. Garis
3. Segitiga
4. Polygon
Perintah OpenGL
OpenGL memiliki daftar fungsi yang banyak. Untuk saat ini, praktikan hanya perlu fokus
pada beberapa perintah dasar yang tertera pada tabel 1.1.
Program untuk menggambar obyek primitif dapat dilihat pada program 1.1.
void display(void)
{
/* bersihkan layar dari titik pixel yang masih ada */
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 0.0);
glFlush ();
}
Program 1.1 jika dijalankan akan menampilkan 5 titik berwarna kuning pada latar
belakang hitam. Posisi titik didefinisikan pada tiap pemanggilan glVertex3f. Ukuran
window mengambil nilai default yang disediakan oleh OpenGL: (-1,-1) untuk titik kiri
bawah dan (1, 1) untuk titik kanan atas.
!!!Yang perlu diperhatikan di codeblocks, tiap kali user membuat project baru, library yang
diperlukan harus ditambahkan. (#include <windows.h>)!!!
Ada kalanya hardware (VGA Card) yang digunakan dapat berpengaruh pada
program. Program jadi tidak dapat menampilkan obyek-obyek sebagaimana mestinya. Hal
ini bisa disebabkan oleh Driver yang tidak terinstall dengan baik, bug pada driver, bug pada
hardware VGA, atau ketidak cocokan driver dengan software lain yang terinstall. Jika
mengalami hal ini, coba download driver VGA terbaru lalu install ulang VGA. Jika
permasalahan tidak berhasil diatasi, bergabunglah dengan teman atau cari pinjaman
komputer.
Untuk modul ini, kadang bentuk QUAD_STRIP yang dihasilkan tidak sama antar
komputer yang berbeda. Untuk modul-modul selanjutnya, jika ditemukan kondisi serupa,
saran di paragraf di atas dapat dipertimbangkan untuk dilakukan.
IV. Percobaan
1. Gantilah sintak program yang berwarna merah bold untuk membuat berbagai macam
primitive drawing. Lakukan pengamatan apa yang terjadi
glBegin(GL_POINTS);
glBegin(GL_LINE_STRIP);
glBegin(GL_LINE_LOOP);
glBegin(GL_LINES);
glBegin(GL_TRIANGLES);
glBegin(GL_TRIANGLE_FAN);
glBegin(GL_TRIANGLE_STRIP);
glBegin(GL_QUADS);
glBegin(GL_QUAD_STRIP);
glBegin(GL_POLYGON);
V. Tugas
1. Lakukan percobaan sesuai dengan perintah diatas.
2. Buat Pelangi horisontal yang terdiri dari 7 warna berbeda menggunakan 7 rectangle
(GL_POLYGON).
3. 3. Buat Pelangi vertikal yang terdiri dari 7 warna berbeda menggunakan 7 rectangle
(GL_POLYGON).
4. 4. Ulang soal nomor 2 dan 3 menggunakan glRect().
VI. Referensi
1. Edward Angel, Interactive Computer Graphics Sixth Edition, Pearson, 2012, ch 2,
p 43 114
2. F. S. Hill, Jr., Stephen M. Kelley, Computer Graphics Using OpenGL Third
Edition, Prentice Hall, 2007, ch 2, p 39 89
3. Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis, OpenGL Programming
Guide Fifth Edition, Addison-Wesley, 2006, ch 1, p 1-25, ch 2, p 27-102
II. Pengantar
Kurva dalam matematika adalah garis yang tidak harus lurus. Sebuah garis lurus
adalah sebuah kurva, demikian juga sebuh garis lengkung. Contoh kurva garis lengkung:
lintasan parabola, grafik sinus, grafik persamaan logaritma, dll.
float t = 0.0;
glBegin(GL_POINTS);
Program 2.2 menggambar x(t) = t; y(t) = t2 0.5 atau y = x2 0.5 pada interval -1.0 sampai
1.0.
void display(void)
{
/* bersihkan layar */
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 0.0);
float t = 0.0;
glBegin(GL_POINTS);
for(t = -1.0; t<=1.0; t+=0.01){
/* x(t) = -1 + 2t; y(t) = 0 */
glVertex3f (t, -0.5+t*t, 0.0);
}
glEnd();
glFlush ();
}
void display(void)
{
/* bersihkan layar */
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 0.0);
float t = 0.0;
//f(x) = 1/14 (x+4)(x+1)(x-1)(x-3) + 0.5
glBegin(GL_POINTS);
for(t = -10.0; t<=10.0; t+=0.1){
glVertex3f (t, (t+4)*(t+1)*(t-1)*(t-3)/14 + 0.5, 0.0);
}
glEnd();
glBegin(GL_LINES);
glVertex3f(-10.0,0.0,0.0);
glVertex3f(10.0,0.0,0.0);
glVertex3f(0.0,-10.0,0.0);
glVertex3f(0.0,10.0,0.0);
glEnd();
glFlush ();
}
Kurva Trigonometri
Kurva trigonometri adalah kurva yang dihasilkan dari fungsi-fungsi trigonometri: sinus,
cosinus, dan tangen.
Program 2.4 menggambar kurva berbentuk grafik fungsi sinus.
//Supaya bisa menggunakan fungsi sin(), program perlu include Math.h
#include <Math.h>
void myinit()
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glColor3f(1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 10.0, -2.0, 2.0);
glMatrixMode(GL_MODELVIEW);
}
void display(void)
{
/* bersihkan layar */
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 0.0);
float x = 0.0;
glBegin(GL_POINTS);
III. Percobaan
Berikut adalah yang harus dilakukan selama sesi lab:
1. Copy contoh-contoh program diatas, jalankan, dan amati output yang ditampilkan.
2. Ubah program 2.1, 2.2, 2.3, dan 2.4 dari GL_POINTS untuk menggambar kurva
menjadi GL_LINES, GL_LINE_STRIP, dan GL_LINE_LOOP!
Amati perubahan tampilan yang terjadi. Mana yang menurutmu sebaiknya
digunakan dan sebaiknya dihindari dalam menggambar kurva?
3. Modifikasi program 2.4 dari fungsi sinus menjadi fungsi tangen.
IV. Tugas
Selesaikan pertanyaan-pertanyaan berikut ini:
1. Ubah persamaan linear pada program 2.1 menjadi x(t): -0.8 + 1.6t; y(t) = -1 + 2t.
2. Ubah program 2.2 supaya bisa menampilkan plot seperti berikut:
Gambar yang dihasilkan tidak harus persis sama, tetapi harus dibuat semirip mungkin.
Jangan gunakan teknik transformasi(modul 3), gunakan pendekatan persamaan
matematis untuk menghasilkan gambar tersebut.
3. Modifikasi program 2.3 untuk menampilkan fungsi berikut: f(x) = (x-3)(x-2)(x-1)
(x)(x+1)(x+2)(x+3).
Sesuaikan viewport supaya kurva dapat terlihat jelas di dalam jendela program.
4. Fungsi sinus memiliki bentuk baku sebagai berikut:
y = A Sin(Bx + C) + D
dimana:
- A menentukan tinggi rendahnya grafik yang dihasilkan pada sumbu y
- B menentukan berapa kali perulangan grafik dalam satu interval
- C menentukan pergeseran sudut inputan sinus
- D menentukan pegeseran grafik sinus pada sumbu y.
Modifikasi program 2.4 supaya bisa mengakomodasi bentuk baku ini. Hint: buat
variabel untuk A, B, C, dan D.
Program tidak perlu mempunyai fasilitas menerima inputan ketika dijalankan.
Sebagai contoh, berikut ini adalah gambar grafik sinus dengan A = 4, B = 5, C = 0.3, D
= 1.
I. Tugas Pendahuluan
1. Jelaskan dengan singkat apa yang disebut sebagai translasi, scaling, dan rotasi dalam
transformasi geometri!
2. Gambarkan dengan tangan grafik transformasi titik (2, 3) yang ditranslasi sejauh (3,
- 4)!
3. Gambarkan dengan tangan grafik transformasi titik (3, 3) yang dirotasi sejauh 90
derajat terhadap sumbu koordinat!
4. Gambarkan dengan tangan grafik transformasi titik (3, 2) yang di-scaling sebesar (2,
1.5) terhadap sumbu koordinat!
II. Pengantar
Dalam matematika, transformasi adalah fungsi yang memetakan suatu set X ke set
yang lain ataupun ke set X sendiri. Dalam dunia Grafika Komputer, set X (yang mengalami
proses transformasi) biasanya berupa strukur geometri, sehingga disebut transformasi
geometri. Terdapat banyak jenis operasi transformasi: translasi, refleksi, rotasi, scaling,
shearing.
//translasi ke 20, 20
glTranslated(20.0, 20.0, 0);
glRecti(0,0, 10, 10);
glFlush();
}
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,50.0,0.0,50.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,0.0);
}
return 0;
}
Program 3.1 Translasi
glFlush();
}
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,50.0,0.0,50.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,0.0);
}
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(100,100);
glutCreateWindow("Transform");
glutDisplayFunc(display);
myinit();
glutMainLoop();
return 0;
}
Program 3.2 Scaling
Yang perlu diperhatikan disini adalah bahwa proses scaling dilakukan dari sumbu koordinat
yang terletak di sudut kiri bawah jendela. Hal inilah yang menyebabkan tampilan pada
program 3.2 diatas terlihat cenderung lebih ke kanan atas jendela.
//rotasi kotak kedua sebesar 15 derajat terhadap sumbu koordinat(titik kiri bawah)
glRotated(15, 0, 0, 1.0);
glRecti(20,20, 30, 30);
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,50.0,0.0,50.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,0.0);
}
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(100,100);
glutCreateWindow("Transform");
glutDisplayFunc(display);
myinit();
glutMainLoop();
return 0;
}
Program 3.3 Rotasi
Yang perlu diperhatikan dari program diatas adalah bahwa rotasi dilakukan terhadap titik
koordinat yang terletak pada ujung kiri bawah jendela. Supaya rotasi terjadi pada titik
tengah obyek, perlu dilakukan kombinasi perintah transformasi.
Kombinasi Transformasi
Operasi-operasi transformasi yang berbeda dapat dikombinasikan. Contoh: jika ingin
melakukan operasi-operasi berikut pada sebuah obyek:
translasi sebesar (3, -4)
lalu rotasi sebesar 30 pada sumbu z
lalu skala sebesar (2, -1)
lalu translasi lagi sebesar (0, 1.5)
dan terakhir rotasi sebesar -30
maka perintah-perintahnya adalah:
glRotated(-30, 0, 0, 1);
glTranslated(0.0, 1.5, 0.0);
glScaled(2.0, -1.0, 0.0);
glRotated(30.0, 0, 0, 1);
Yang perlu diperhatikan disini adalah urutan perintah. OpenGL melakukan perintah
transformasi mulai dari yang paling bawah.
Perlu diingat pula bahwa karena pada dasarnya operasi transformasi dilakukan dengan
menggunakan operasi perkalian matrix yang tidak bersifat komutatif (AB BA), maka
urutan operasi transformasi sangat berpengaruh.
Salah satu kegunaan kombinasi Transformasi adalah untuk melakukan rotasi pada obyek
terhadap arbitrary point/titik apapun (bukan terhadap sumbu koordinat). Metode rotasi
terhadap arbitrary point adalah pertama-tama mentranslasikan obyek untuk berhimpit
dengan sumbu koordinat, diikuti dengan rotasi, dan terakhir men-translasikan kembali
obyek pada posisinya semula.
Program 3.4 menunjukkan contoh kombinasi transformasi.
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,0.0,0.5);
glFlush();
}
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,50.0,0.0,50.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,0.0);
}
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(100,100);
glutCreateWindow("Transform");
glutDisplayFunc(display);
return 0;
}
Program 3.4 Rotasi terhadap arbitrary point
Yang perlu pula diperhatikan di topik transformasi adalah Current Transformation Matrix
(CTM). Perintah OpenGL yang berkatan dengan CTM ini adalah: glPushMatrix(),
glPopMatrix(), dan glLoadIdentity(). Berikut keterangan terkait ketiga perintah tersebut:
1. glPushMatrix() menduplikasi CTM dan meletakkannya di bagian teratas stack
2. glPopMatrix() pop matrix teratas dari stack
3. glLoadIdentity() mengubah matrix teratas stack menjadi matrix identitas
Contoh:
1. Inisialisasi stack
glMatrixMode(GL_MODEL_VIEW);
glLoadIdentity(); I
2. Scale by 2
glScaled(1.0, 2.0, 1.0); S(2)
Push stack
4. glPushMatrix(); copy
S(2).R(90)
S(2).R(90)
5. Translate by a
glTranslatef(a.x, a.y, a.z); S(2).R(90)Tr(a)
S(2).R(90)
Stack transformasi ini berguna kalau kita ingin membuat hirarki transformasi. Contoh: kita
hendak memodelkan tangan yang terdiri dari lengan atas, lengan bawah, telapak tangan,
jari-jari. Untuk keseluruhan tangan, transformasinya kita simpan di stack terbawah. Untuk
lengan bawah, telapak tangan, dan jari-jari, transformasinya kita simpan di stack nomor 2
dari bawah. Untuk telapak tangan dan jari-jari, transformasinya kita simpan di stack nomor
3 dari bawah. Sedangkan untuk jari-jari, transformasinya kita simpan di stack teratas.
Dengan demikian kita jadi lebih fleksibel untuk mentransformasi tiap bagian obyek.
//Point pertama
glBegin(GL_POINTS);
glVertex2f(15,15);
glEnd();
glPushMatrix();
glScalef(2,1,1);
glPopMatrix();
glRotatef(10, 0, 0, 1);
glPushMatrix();
glTranslatef(5,0,0);
glFlush();
}
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,50.0,0.0,50.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,0.0);
}
return 0;
}
Program 3.5 Contoh penggunaan glPushMatrix() dan glPopMatrix().
III. Percobaan
1. Untuk program 3.1, modifikasi parameter glTranslated, lalu amati perubahan
tampilannya. Kombinasikan dengan memodifikasi parameter pada glRecti; amati
perubahannya juga.
2. Untuk program 3.2, modifikasi parameter glScaled, lalu amati perubahan
tampilannya. Kombinasikan dengan memodifikasi parameter pada glRecti; amati
perubahannya juga.
IV. Tugas
1. Buat checker board 8 x 8 kotak dengan menggunakan glTranslate.
I. Tugas Pendahuluan
1. Apa beda 2 dimensi dan 3 dimensi?
2. Jelaskan apa itu proyeksi!
II. Pengantar
Alam fisik dalam persepsi manusia adalah sebuah ruang yang berformat 3 dimensi.
Benda-benda yang ada di dalamnya umum direpresentasikan menggunakan format 3
dimensi: panjang, lebar, dan tinggi.
Dalam matematika, 3 dimensi ini biasa dinyatakan dalam sistem koordinat kartesian.
Koordinat kartesian 3 dimensi memiliki 3 bidang yang saling tegak lurus satu dengan yang
lainnya. Tiap bidang memiliki sumbu yang koordinat yang biasa disebut sumbu x, y, dan z.
3 dimensi di OpenGL
OpenGL menggunakan matrix sebagai komponen dasar untuk menghasilkan
tampilan pada layar. Semua matrix ini didefinisikan untuk dapat memproses operasi-operasi
dalam 3 dimensi.
Jika pada pelajaran-pelajaran sebelumnya obyek dibuat dalam 2 dimensi, sebenarnya
obyek-obyek tersebut adalah obyek 3 dimensi. Hanya saja dimensi ketiga diabaikan.
Termasuk didalam konsep ini adalah transformasi. Transformasi selalu dilakukan dalam
format 3 dimensi.
Proyeksi
Proyeksi diperlukan untuk menggambarkan obyek 3 dimensi kedalam format 2
dimensi, contohnya: arsitek perlu menuangkan idenya tentang sebuah obyek bangunan 3
dimensi diatas kertas (2 dimensi). Contoh lain adalah penggambaran dunia OpenGL yang 3
dimensi ke layar monitor yang 2 dimensi. Perubahan format dari 3 dimensi menjadi 2
dimensi ini memerlukan proses/aturan khusus. Proses/aturan ini disebut proyeksi grafis.
Proyeksi di OpenGL
Dalam OpenGL, diperlukan beberapa perubahan setting agar sebuah aplikasi dapat
menampilkan obyek 3 dimensi. Jika pada aplikasi-aplikasi sebelumnya perintah proyeksi
yang digunakan adalah gluOrtho2D(kiri, kanan, bawah, atas) untuk menampilkan obyek 2
dimensi, perintah yang sama harus diganti agar aplikasi dapat menampilkan obyek 3
dimensi:
1. Untuk proyeksi parallel, gunakan glOrtho(kiri, kanan, bawah, atas, dekat, jauh);
2. Untuk proyeksi perspektif, gunakan gluPerspective(sudut buka, aspek rasio, dekat,
jauh);
Program 4.1 menghasilkan tampilan kotak 3 dimensi.
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glRotated(35,1,1,1);
glutWireCube(2);
glFlush();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glShadeModel (GL_FLAT);
glEnable(GL_DEPTH_TEST);
}
Jika dicoba, obyek-obyek solid ini tampak tidak jelas bentuknya di layar. Yang
tampak hanyalah blok berwarna putih. Ini wajar. Di modul 6, pencahayaan yang benar
akan menampilkan bentuk obyek-obyek ini dengan baik.
Ada kalanya obyek yang ingin dibuat/ditampilkan tidak tersedia dalam library
bawaan glut. Untuk kasus seperti ini, programmer perlu membuat sendiri obyek tersebut. Di
OpenGL, untuk membuat obyek 3 dimensi, salah satu caranya adalah dengan membuat tiap
//depan
glColor3f(0.0,0.0,1.0);
glBegin(GL_POLYGON);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glEnd();
//belakang
glColor3f(0.0,1.0,0.0);
glBegin(GL_POLYGON);
glVertex3f(1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd();
//kiri
glColor3f(1.0,0.0,0.0);
glBegin(GL_POLYGON);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glEnd();
//kanan
glColor3f(0.0,1.0,1.0);
glBegin(GL_POLYGON);
glVertex3f(1.0, -1.0, -1.0);
glVertex3f(1.0, 1.0, -1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glEnd();
//bawah
glColor3f(1.0,0.0,1.0);
glBegin(GL_POLYGON);
glVertex3f(1.0, -1.0, 1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(1.0, -1.0, -1.0);
glEnd();
//atas
glColor3f(1.0,1.0,0.0);
glBegin(GL_POLYGON);
glFlush();
}
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-3.0,3.0,-3.0,3.0,-3.0,3.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0,0.0,0.0,1.0);
glColor3f(0.0,0.0,0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
}
return 0;
}
Program 4.2 Kubus 3 dimensi yang dibangun dari 6 polygon
Modul ini memiliki kemungkinan untuk membuat beberapa komputer tidak dapat
menampilkan bentuk obyek sebagaimana mestinya. Jika memang program sudah benar
sementara tampilan tidak juga sesuai, bergabunglah dengan teman atau cari pinjaman
komputer.
III. Percobaan
1. Untuk program 4.1, modifikasi parameter glRotated, lalu amati perubahan
tampilannya. Kombinasikan dengan memodifikasi parameter pada glutSolidCube;
amati perubahannya juga.
2. Untuk program 4.1, ganti glutWireCube dengan obyek-obyek 3 dimensi bawaan
yang lain: baik sesama wire maupun solid. Modifikasi parameter glRotated, lalu
amati perubahan tampilannya.
V. Referensi
1. Edward Angel, Interactive Computer Graphics Sixth Edition, Pearson, 2012, ch 3,
p 115 194
2. F. S. Hill, Jr., Stephen M. Kelley, Computer Graphics Using OpenGL Third
Edition, Prentice Hall, 2007, ch 5, p 190 263
I. Tugas Pendahuluan
1. Apa yang dimaksud dengan callback function?
2. Apa yang dimaksud dengan komputasi interaktif?
3. Apa yang dimaksud dengan simulasi?
4. Berikan penjelasan secara singkat sejarah animasi komputer!
II. Pengantar
Modul ini membahas tentang penambahan kemampuan untuk menerima input bagi
program OpenGL. Selain itu, modul ini juga membahas tentang pembuatan animasi dengan
menggunakan OpenGL.
Input
Yang dimaksud sebagai input di sini adalah fasilitas program untuk menerima sinyal
dari perangkat input (keyboard dan mouse) ketika program dijalankan. Dengan fasilitas ini,
program dan user dapat berinteraksi secara langsung (real-time), tanpa perlu melakukan
kompilasi ulang tiap kali user ingin mengubah tampilan program.
Di GLUT, mekanisme input dijalankan dalam konsep callback function. Di konsep
ini, fungsi main memanggil fungsi input glut dan programmer harus mendefinisikan isi
fungsi input tersebut.
Program 5.1 menunjukkan contoh menerima input dari keyboard untuk merotasi 2
garis.
static float rotAngle = 0.1;
void init(void)
{
glClearColor(0.0,0.0, 0.2, 0.0);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (0.0, 1.0, 0.0);
glPushMatrix();
glRotatef(-rotAngle, 0.0, 0.0, 0.1);
glBegin (GL_LINES);
glVertex2f (-0.5, 0.5);
glVertex2f (0.5, -0.5);
glEnd ();
glPopMatrix();
glFlush();
}
Program 5.2 menunjukkan contoh menerima input dari keyboard untuk menggerakan
simulasi lengan robot.
static int shoulder = 0, elbow = 0;
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0); glPushMatrix();
glScalef (2.0, 0.4, 1.0); glutWireCube (1.0);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glPushMatrix();
glutWireSphere(1.0, 20, 16); /* gambar matahari */
glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);
glTranslatef (2.0, 0.0, 0.0);
glRotatef ((GLfloat) day, 0.0, 1.0, 0.0);
glutWireSphere(0.2, 10, 8); /* gambar planet kecil */
glPopMatrix();
glutSwapBuffers();
}
Animasi.
Animasi adalah Illusion Of Motion yang dibuat dari sekumpulan image statis yang
ditampilkan secara berurutan sehingga seolah-olah gambar-gambar diskontinyu tadi
menjadi terlihat kontinyu. Animasi berkembang dari teori-teori/fenomena-fenomena terkait
penglihatan manusia: phi phenomena, beta movement, & persistance of vision. Intinya
adalah bahwa mata manusia cenderung menangkap urutan gambar-gambar yang
ditampilkan pada tenggang waktu minimal tertentu sebagai suatu pola pergerakan.
Pada OpenGL, animasi dapat dibuat dengan memanfaatkan proses transformasi pada
obyek yang dilakukan secara terus-menerus/berulang-ulang. Program 5.4 memutar kotak
yang ditrigger dan distop oleh penekanan tombol mouse.
static GLfloat spin = 0.0;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glRectf(-25.0, -25.0, 25.0, 25.0);
glPopMatrix();
glutSwapBuffers();
}
void spinDisplay(void)
{
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
III. Percobaan
1. Cobalah program-program diatas
2. Amati pada fungsi program inti
3. Amati pada fungsi masukan
4. Ubahlah program 5.1 supaya kedua garis yang muncul pada gambar menjadi
bergerak searah jarum jam dengan sudut 90 derajat antara keduanya
5. Pada program 5.4 ubahlah program supaya kotak bergerak dan berhenti jika di tekan
tombol keyboard P atau p
6. Pada program 5.3 coba ganti perintah glutWireSphere(1.0, 40, 16); dengan
glutWireCube (1.0) dan glutWireSphere(0.2, 10, 8); dengan glutWireCube(0.2);
7. Pada program 5.3 buatlah garis lintasan planet yang mengelilingi matahari
IV. Tugas
1. Buatlah program untuk menampilkan gambar bintang segi 4 dengan warna yang
dapat diubah dengan menggunakan tombol panah dan
2. Modifikasi program 5.4 supaya
a. ketika tombol mouse kiri ditekan, kotak berotasi terhadap sumbu z (rotasi
yang sekarang)
b. ketika tombol mouse tengah ditekan, kotak berotasi terhadap sumbu y
c. ketika tombol mouse kanan ditekan, kotak berotasi terhadap sumbu x
d. start dan stop pergerakan dilakukan dengan menekan tombol p atau P
3. Modifikasi program 5.4 dengan mengganti kotak yang diputar dengan checkerboard
8x8
4. Modifikasi program 5.4 supaya
a. Ketika ditekan tombol u, ukuran kotak mengecil menjadi 0.75 ukuran
semula
b. Ketika ditekan tombol U, ukuran kotak membesar menjadi 1.5 ukuran
semula
I. Tugas Pendahuluan
1. Jelaskan dengan singkat apa itu cahaya dan pengaruhnya terhadap penangkapan
visual (visual perception)!
2. Jelaskan tentang sistem warna addition dan substraction!
3. OpenGL menggunakan sistem warna addition atau substraction?
4. Apa itu vektor normal? Apa pengaruhnya terhadap pemantulan cahaya pada obyek?
II. Pengantar
Pencahayaan memegang peranan penting dalam proses penangkapan citra oleh
perangkat optik. Tanpa ada cahaya, tidak ada citra yang dapat ditangkap. Dengan adanya
cahaya yang cukup, detail obyek 3 dimensi jadi terlihat dengan jelas.
Sistem pencahayaan pada OpenGL merupakan bentuk pendekatan terhadap sistem
pencahayaan di dunia nyata. Cahaya lampu dalam OpenGL dipecah menjadi komponen merah,
hijau, dan biru. Tiap sumber cahaya dapat diatur konsentrasi cahaya merah, hijau, dan biru yang
dipancarkannya.
Model pencahayaan yang OpenGL mempunyai empat bentuk: memancarkan
(emissi), ambient, diffuse, dan specular. Semua komponen dihitung secara independen lalu
hasilnya dijumlahkan. Hasil akhir penjumlahan inilah yang menjadi warna pada obyek.
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 0.0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glShadeModel (GL_SMOOTH);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(1);
glFlush ();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 0.0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(theta, 0,1,0);
glutSolidTeapot(1);
glFlush ();
}
void myIdle(){
theta +=0.1;
display();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 0.0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glShadeModel (GL_SMOOTH);
glEnable(GL_LIGHT0);
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(theta, 0,1,0);
glutSolidTeapot(1);
glFlush ();
}
void myIdle(){
theta +=0.1;
display();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 0.0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glShadeModel (GL_SMOOTH);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glRotatef(theta, 0,1,0);
glTranslatef(1.0, 0.0, 0.0);
glutSolidTeapot(0.5);
glTranslatef(-2.0, 0.0, 0.0);
glFlush ();
}
void myIdle(){
theta +=0.1;
display();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotated(35, 1,1,1);
glRotatef(theta, 0,1,0);
//depan
glBegin(GL_POLYGON);
glNormal3f(0.0,0.0,1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glEnd();
//belakang
glBegin(GL_POLYGON);
glNormal3f(0.0,0.0,-1.0);
glVertex3f(1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd();
//kiri
glBegin(GL_POLYGON);
glNormal3f(-1.0,0.0,0.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glEnd();
//kanan
glBegin(GL_POLYGON);
glNormal3f(1.0,0.0,0.0);
glVertex3f(1.0, -1.0, -1.0);
glVertex3f(1.0, 1.0, -1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glEnd();
//bawah
//atas
glBegin(GL_POLYGON);
glNormal3f(0.0,1.0,0.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(1.0, 1.0, -1.0);
glVertex3f(-1.0, 1.0, -1.0);
glEnd();
glFlush();
}
void myinit()
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 0.0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glShadeModel (GL_SMOOTH);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
}
III. Percobaan
1. Cobalah program-program diatas. Modifikasi nilai posisi dan nilai warna obyek dan
sumber cahaya lalu amati perbedaannya.
2. Modifikasi program 6.4 dan 6.5 diatas dengan menambahkan sumber cahaya tambahan
(GL_LIGHT3/4/5/6 dll)!
3. Modifikasi program 6.4 dan 6.5 diatas dengan menambahkan obyek tambahan!
IV. Tugas
1. Modifikasi program 6.5 yaitu dengan mengganti kotak dengan 3 digit NIM terakhir
dalam bentuk 3 dimensi
2. Tambahkan hingga total 4 sumber cahaya (dengan posisi dan nilai komponen cahaya
yang berbeda) untuk program hasil modifikasi pada nomor 1 diatas
#include <windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdlib.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-2.0,-2.0);
glVertex2f(0.0,1.0);
glVertex2f(2.0,-2.0);
glEnd();
glFlush();
}
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-2.0,2.0,-2.0,2.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,1.0);
}
return 0;
}