Professional Documents
Culture Documents
Penyusun:
Nana Ramadijanti,S.Kom.,M.Kom.
NIP. 19711109.1998.02.2.001
Alhamdulillah, Segala puji hanya untuk Allah SWT, Tuhan Yang Maha Berilmu.
atas petunjukNya-lah kami dapat menyelesaikan buku ajar mahasiswa D3 Teknik
Informatika untuk matakuliah Workshop Grafika Komputer. Diharapkan dengan adanya
buku ini, mahasiswa mendapatkan panduan dalam mengikuti perkuliahan Workshop
Grafika Komputer.
Materi yang disusun pada buku ini sesuai dengan silabus matakuliah Workshop
Grafika Komputer di program studi D3 Teknik Informatika. Jumlah modul praktikum 10
(sepuluh) percobaan dan 2 tugas:proyek 1 dan proyek 2 yang harus dikerjakan siswa di
tengah semester dan akhir semester,pengganti UTS dan UAS. Isi buku setiap judul
praktikum disusun mulai dari dasar teori, tugas pendahuluan,percobaan,tugas dan laporan
resmi yang harus dikerjakan siswa saat mengikuti workshop grafika komputer.
Pengerjaan percobaan dilakukan dengan bahasa pemrograman c++ dengan library
OpenGL. Dengan mengacu pada buku ini,mahasiswa diharapkan dapat mengerti dan
membuat obyek grafik 2D dan 3D. Ucapan terima kasih tak lupa kami sampaikan kepada
beberapa pihak yang telah memberikan kontribusi dalam penyelesaian buku Workshop
Grafika Komputer ini, yaitu:
Dr. Zainal Arief,ST.,MT.,selaku Direktur PENS
Ir. Anang Budikarso,MT.,selaku Pembantu Direktur II PENS
Eko Henfri Binugroho, SST, MSc,selaku Ketua Unit Penelitian PENS
Arna Fariza,S.Kom.,M.Kom.,selaku Ketua Departemen Teknik Informatika dan
Komputer PENS
Arif Basofi,S.Kom.,M.T.,selaku Ketua Program Studi D3 Teknik Informatika
PENS
Isbat Uzzin Nadhori,S.Kom.,M.T.,selaku Ketua Program Studi D4 Teknik
Informatika PENS
Dosen-dosen dan karyawan PENS,khususnya rekan-rakan di program studi D3
dan D4 Teknik Informatika PENS
Sekalipun buku ini telah selesai dengan proses yang cukup panjang, akan tetapi
masih tidak menutup adanya kekurangan padanya. Segala masukan, kritik dan review
sangat kami harapkan untuk semakin menyempurnakannya pada kesempatan mendatang.
PENYUSUN
i
DAFTAR ISI
KATA PENGANTAR ...................................................................................................................................... i
DAFTAR ISI ................................................................................................................................................... ii
DAFTAR GAMBAR..................................................................................................................................... vii
DAFTAR TABEL ........................................................................................................................................ viii
Praktikum 1 ..................................................................................................................................................... 1
Pengantar Workshop Grafika Komputer ......................................................................................................... 1
A. TUJUAN ................................................................................................................................................. 1
B. DASAR TEORI ...................................................................................................................................... 1
B.1. Pengenalan Grafika Komputer .................................................................................................... 1
B.2. Pengenalan Pemrograman Grafik ................................................................................................ 3
B.3. Instalasi OpenGL ......................................................................................................................... 4
B.3.1. Instalasi di Visual C++6.0 ..................................................................................................... 4
B.3.2. Instalasi di Visual C++ .Net .................................................................................................. 4
B.3.3. Instalasi Instalasi di Xcode (Mac OS X 10.5 Leopard) ......................................................... 5
C. TUGAS PENDAHULUAN .................................................................................................................... 8
D. PERCOBAAN ........................................................................................................................................ 8
E. LAPORAN RESMI ................................................................................................................................. 8
Praktikum 2 ..................................................................................................................................................... 9
Menggambar dengan Fungsi Primitif Open GL .............................................................................................. 9
A. TUJUAN ................................................................................................................................................. 9
B. DASAR TEORI ...................................................................................................................................... 9
B.1. Sistem Koordinat ......................................................................................................................... 9
B. 2. Program Dasar Dengan OpenGL .............................................................................................. 10
B.3. Menggambar dengan Fungsi Primitif openGL ........................................................................... 11
B.4. Menggambar Titik ..................................................................................................................... 13
B.5. Mengubah Ukuran Titik ............................................................................................................. 13
B.6. Menggambar Garis ..................................................................................................................... 14
B.7. Menggambar Banyak Garis (Polyline) ....................................................................................... 14
B.8. Menggambar Banyak Garis (Polyline Kurva Tertutup) ............................................................. 14
B.9. Menggambar Polygon ................................................................................................................ 15
B.10. Menggambar Segi Empat (Quad)............................................................................................. 15
B.11. Menggambar N Segi Empat (Quad Strip) ................................................................................ 15
B.12. Menggambar Segi Tiga (Triangeles)........................................................................................ 16
B.13. Menggambar N Segi Tiga (Triangele Strip) ............................................................................ 16
B.14. Menggambar N Segi Tiga dengan 1 Titip Pusat (Triangele Fan)............................................. 17
B.15. Mengatur Warna ...................................................................................................................... 17
C. TUGAS PENDAHULUAN .................................................................................................................. 18
D. PERCOBAAN ...................................................................................................................................... 18
ii
E. TUGAS ................................................................................................................................................. 28
F. LAPORAN RESMI ............................................................................................................................... 28
Praktikum 3 ................................................................................................................................................... 30
OBYEK 2D ................................................................................................................................................... 30
A. TUJUAN ............................................................................................................................................... 30
B. DASAR TEORI .................................................................................................................................... 30
B.1. Obyek Grafik 2 Dimensi ............................................................................................................ 30
B.2. Menggambar Polyline ................................................................................................................ 31
B.3. Menggambar Polygon ................................................................................................................ 31
B.4. Membuat Polygon Berwarna...................................................................................................... 32
B.5. Membuat Polygon Bergradiasi ................................................................................................... 33
C. TUGAS PENDAHULUAN .................................................................................................................. 34
D. PERCOBAAN ...................................................................................................................................... 34
E. TUGAS ................................................................................................................................................. 35
F. LAPORAN RESMI ............................................................................................................................... 36
Praktikum 4 ................................................................................................................................................... 37
OBYEK PUTAR 2D ..................................................................................................................................... 37
A. TUJUAN ............................................................................................................................................... 37
B. DASAR TEORI .................................................................................................................................... 37
B.1. Membuat Lingkaran ................................................................................................................... 37
B.2 Membuat Ellipse ......................................................................................................................... 38
B.3. Membuat Obyek Polar ............................................................................................................... 38
C. TUGAS PENDAHULUAN .................................................................................................................. 40
D. PERCOBAAN ...................................................................................................................................... 41
E. TUGAS ................................................................................................................................................. 46
F. LAPORAN RESMI ............................................................................................................................... 47
Praktikum 5 ................................................................................................................................................... 48
Melakukan Pengesetan Perseptive View dan ................................................................................................ 48
View Port Fungsi Transformasi ..................................................................................................................... 48
A. TUJUAN ............................................................................................................................................... 48
B. DASAR TEORI .................................................................................................................................... 48
B.1. Sistem Koordinat Layar ............................................................................................................. 48
B.2. Menggambar Obyek 2D ............................................................................................................. 49
B.2.1. Mendefinisikan World Window .......................................................................................... 50
B.2.2. Mendefinisikan Viewport.................................................................................................... 51
B.2.3. Mapping World Window ke Vewport Window .................................................................. 51
B.2.4. Rasio Lebar R dan L ........................................................................................................... 52
B.2.5. Rasio Tinggi T dan B .......................................................................................................... 52
B.3. Transformasi di OpenGL ........................................................................................................... 53
B.3.1. Translasi .............................................................................................................................. 54
B.3.2. Scaling................................................................................................................................. 55
iii
B.3.3. Rotasi .................................................................................................................................. 56
B.3.4. Matrik Identitas ................................................................................................................... 57
C. TUGAS PENDAHULUAN .................................................................................................................. 57
D. PERCOBAAN ...................................................................................................................................... 58
E. TUGAS ................................................................................................................................................. 62
F. LAPORAN RESMI ............................................................................................................................... 63
Praktikum 6 ................................................................................................................................................... 64
Fungsi keyboard dan mouse .......................................................................................................................... 64
A. TUJUAN ............................................................................................................................................... 64
B. DASAR TEORI .................................................................................................................................... 64
B. 1. Event Handling di OpenGL ...................................................................................................... 64
B. 2. Mendefinisikan Event Keyboard............................................................................................... 65
B. 3. Mendefinisikan Event Mouse ................................................................................................... 67
C. TUGAS PENDAHULUAN .................................................................................................................. 68
D. PERCOBAAN ...................................................................................................................................... 68
E. TUGAS ................................................................................................................................................. 80
F. LAPORAN RESMI ............................................................................................................................... 81
Praktikum 7 ................................................................................................................................................... 82
TEXT DAN FONT ........................................................................................................................................ 82
A. TUJUAN ............................................................................................................................................... 82
B. DASAR TEORI .................................................................................................................................... 82
B. 1. Karakter Bitmap ............................................................................................................................ 82
B. 2. Stroke Teks Karakter .................................................................................................................... 83
B. 3. Menempatkan Teks ....................................................................................................................... 83
C. TUGAS PENDAHULUAN .................................................................................................................. 83
D. PERCOBAAN ...................................................................................................................................... 83
E. TUGAS ................................................................................................................................................. 87
F. LAPORAN RESMI ............................................................................................................................... 88
Praktikum 8 ................................................................................................................................................... 89
PROYEK 1 .................................................................................................................................................... 89
A. TUJUAN ............................................................................................................................................... 89
B. DASAR TEORI .................................................................................................................................... 89
B.1. Membuat Latar Belakang .............................................................................................................. 89
B.2. Pembuatan Obyek Pesawat ............................................................................................................ 90
B.3. Sistem Kendali ............................................................................................................................... 90
C. TUGAS PENDAHULUAN .................................................................................................................. 91
D. PERCOBAAN ...................................................................................................................................... 91
E. LAPORAN RESMI............................................................................................................................... 91
Praktikum 9 ................................................................................................................................................... 92
Vertex Array – Creating 3D Object ............................................................................................................... 92
A. TUJUAN ............................................................................................................................................... 92
iv
B. DASAR TEORI .................................................................................................................................... 92
C. TUGAS PENDAHULUAN .................................................................................................................. 98
D. PERCOBAAN ...................................................................................................................................... 98
E. TUGAS ............................................................................................................................................... 105
F. LAPORAN RESMI............................................................................................................................. 105
Praktikum 10 ............................................................................................................................................... 106
Transformation and Projection .......................................................................Error! Bookmark not defined.
A. TUJUAN ............................................................................................................................................. 106
B. DASAR TEORI .................................................................................................................................. 106
B.1. Koordinat Obyek .......................................................................................................................... 106
B.2. Koordinat Mata ............................................................................................................................ 106
B.3. Koordinat Klip ............................................................................................................................. 107
B.4. Koordinat Perangkat Normalisasi (Normalized Device Coordinates / NDC) .............................. 108
B.5. Koordinat Window (Koordinat Layar) ......................................................................................... 108
B.6. Matrix Transformasi OpenGL ..................................................................................................... 109
B.7. Model-View Matrix (GL_MODELVIEW) .................................................................................. 109
B.8. Matrix Proyeksi (GL_PROJECTION) ......................................................................................... 110
B.9. Matrix Tekstur (GL_TEXTURE) ................................................................................................ 112
B.10. Matrix Warna (GL_COLOR) ..................................................................................................... 112
C. TUGAS PENDAHULUAN ................................................................................................................ 113
D. PERCOBAAN .................................................................................................................................... 113
E. TUGAS ............................................................................................................................................... 116
F. LAPORAN RESMI............................................................................................................................. 116
Praktikum 11 ............................................................................................................................................... 117
Lighting dan Shading .................................................................................................................................. 117
A. TUJUAN ............................................................................................................................................. 117
B. DASAR TEORI .................................................................................................................................. 117
B.1. Lighting Model ............................................................................................................................ 117
B.2. Diffuse Scattering ........................................................................................................................ 118
B.3. Specullar Reflection ..................................................................................................................... 119
B.4. Ambient ....................................................................................................................................... 120
B.5. Phong Model ................................................................................................................................ 121
B.6. Flat dan Smooth Shading ............................................................................................................. 122
C. TUGAS PENDAHULUAN ................................................................................................................ 122
D. PERCOBAAN .................................................................................................................................... 123
E. TUGAS ............................................................................................................................................... 127
F. LAPORAN RESMI ............................................................................................................................. 127
Praktikum 12 ............................................................................................................................................... 128
PROYEK 2 .................................................................................................................................................. 128
A. TUJUAN ............................................................................................................................................. 128
B. DASAR TEORI .................................................................................................................................. 129
v
B.1. Membuat Obyek...................................................................................................................... 129
B.2. Pembuatan Kendali Camera View ........................................................................................... 129
C. TUGAS PENDAHULUAN ................................................................................................................ 130
D. PERCOBAAN .................................................................................................................................... 130
E. LAPORAN RESMI ............................................................................................................................. 130
Daftar Pustaka ............................................................................................................................................. 131
vi
DAFTAR GAMBAR
vii
DAFTAR TABEL
viii
ix
PRAKTIKUM 1
PENGANTAR WORKSHOP GRAFIKA KOMPUTER
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mengetahui definisi dan manfaat grafika komputer
2. Mengenal pemrograman grafis
3. Mengenal dan mempersiapkan library grafis Open GL
B. DASAR TEORI
B.1. Pengenalan Grafika Komputer
Grafika computer (Computer Graphics) adalah suatu bidang yang mempelajari
bagaimana menghasilkan suatu gambar menggunakan komputer. Sehingga di dalam
grafika komputer akan dibahas teknik-teknik menggambar. Grafika komputer
menghasilkan software-software disain grafis yang saat ini sudah sangat canggih. Grafika
komputer menghasilkan software dengan GUI (Graphics User Interface) yang
memudahkan dan menyenangkan.
Kebutuhan akan pembuatan grafika komputer saat ini tidak bisa dihindarkan dengan
perkembangan teknologi komputer yang semakin cepat. Hampir semua bidang
menggunakan grafika komputer, tetapi kebutuhan grafika komputer lebih dirasakan
dalam bidang-bidang berikut:
(1) Visualisasi proses
a) b)
Gambar 1. 1.a ) Contoh simulasi grafis b) Contoh visualisasi proses
1
(2) Entertainment:
a) b)
Gambar 1.2. a) grafik 3D pada Final Fantasy b) grafik 3D pada game Euro 2004
(3) Design
Nany
2
Gambar 1.6. Peta 3D pada sistem informasi geografis
Pada workshop grafika komputer dipakai library grafis OpenGL glut. Library ini
lebih ringan dari DirectX dan dapat bekerja di semua sistem operasi, meskipun dalam
buku ini hanya dibahas untuk Windows. Selain itu library ini sangat sederhana, sehingga
memudahkan para pemula dalam mempelajari pemrograman grafik.
Di samping itu, dalam pemrograman grafik terdapat komponen dasar yang disebut
dengan obyek grafik. Obyek garfik ini merupakan obyek dasar dalam pembuatan grafik di
komputer antara lain:
Titik dan Garis,
Polyline dan Polygon
Raster,
Warna,
Text,
Paint.
3
Gambar 1.7. Elemen Dasar pada Grafika Komputer
4
B.3.3. Instalasi Instalasi di Xcode (Mac OS X 10.5 Leopard)
• Double Click icon. Icon Xcode dapat dicari di dock, atau dipilih dari Machintosh
HD -> Developer -> Applications -> Double click icon Xcode
5
Gambar 1.11. Jendela Dialog Nama Project
• Tampilan awal project coba sbb :
6
• Pada dialog project coba info yang tampil, pilih header search path, dan isikan
value dengan : /Developer/SDKs/MacOSX10.5.sdk/usr/x11/include
7
C. TUGAS PENDAHULUAN
Mengumpulkan artikel tentang trend pemanfaatan grafika komputer terkini di bidang :
Desain Grafis
Publishing
Arsitektur/Teknik Sipil/Interior
Game
Animasi dan Movie
Pemetaan 3D
Simulasi dan Visualisasi
Sertakan sumber informasi dari artikel.
D. PERCOBAAN
1. Lakukan instalasi Open GL di Windows (laptop masing-masing) mengikuti langkah
pada B.3.
2. Lakukan instalasi Open GL di Mac Os (di laboratorium computer vision) mengikuti
langkah pada B.3.
E. LAPORAN RESMI
Tidak ada laporan resmi pada Workshop Grafika Komputer I, selain laptop dan atau
komputer Windows/Mac Os sudah terinstal OpenGL dan siap dipakai membuat program
grafika pada Workshop Grafika Komputer pertemuan II.
8
PRAKTIKUM 2
MENGGAMBAR DENGAN FUNGSI PRIMITIF OPEN GL
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mengerti dan dapat Melakukan Inisialisasi Window Grafis
2. Mengerti dan dapat Membuat Gambar dengan Fungsi Primitif Open GL
3. Mengerti dan dapat Membuat Gambar 2D
B. DASAR TEORI
B.1. Sistem Koordinat
Meletakkan suatu gambar pada layar diperlukan pengetahuan mengenai sistem
koordinat Kartesian, karena OpenGL menggunakan sistem koordinat ini untuk
meletakkan suatu obyek gambar, berbeda dengan library grafis pada umumnya yang
menggunakan sistem koordinat layar. Perbedaan sistem koordinat Kartesian dan sistem
koordinat layar dapat dilihat pada gambar 2.1 dan gambar 2.2.
Y
P(x,y) x X
Y
x X
Sistem koordinat Kartesian mempunyai ciri arah positif pada sumbu X adalah ke
kanan dan arah positif pada sumbu Y adalah ke atas.
Berbeda dengan sistem koordinat Kartesian, sistem koordinat layar mempunyai ciri
arah positif pada sumbu X adalah ke kanan dan arah positif pada sumbu Y adalah ke
bawah. Library grafik yang baik adalah library grafik yang mendukung sistem koordinat
Kartesian, karena para pengguna lebih familiar dengan sistem koordinat ini.
9
B. 2. Program Dasar Dengan OpenGL
Beberapa pernyataan penting untuk pemrograman grafis terutama untuk menginisialisasi
layar grafis, antara lain:
#include <GL/glut.h>
Pernyataan ini digunakan untuk mengaktifkan fungsi-fungsi grafik yang telah
disediakan oleh OpenGL. Untuk komputer Mac OS, penulisan library openGL
sebagai berikut : #include <GLUT/glut.h>
glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB );
Menginisialisasi layar grafis menggunakan OpenGL. Dari perintah ini terlihat
bahwa struktur data gambar dinyatakan dalam bilangan dengan format double,
dan penyajian warna dalam RGB (Red Green Blue). Untuk mengurangi beban
memory, format diubah menjadi GLUT_SINGLE. Untuk menghasilkan obyek
yang transparan penyajian warna dapat diubah menjadi RGBA (Red Green Blue
Alpha).
glutInitWindowPosition(100,100);
Pernyataan ini digunakan untuk menginisialisasi posisi kiri-atas kanvas/window
tempat untuk mengambar. Pada contoh perintah di atas posisi kiri-atas di titik
(100,100). Pengubahan posisi window ini tidak terlalu bermanfaat karena
windows pada OpenGL dapat digeser dengan drag & drop, bahkan dapat di-
maximaze tanpa mengubah hasil gambar karena terjadi proses auto-resize.
glutInitWindowSize(640,480);
Pernyataan ini digunakan untuk mengatur ukuran kanvas, pada contoh di atas
ukuran diatur 640X480 pixel. Pengubahan ukuran window ini tidak terlalu
bermanfaat karena windows pada OpenGL dapat diubah dengan drag & drop,
bahkan dapat di-maximaze tanpa mengubah hasil gambar karena terjadi auto-
resize.
glutCreateWindow("My first drawing");
Pernyataan ini digunakan untuk memberikan judul pada kanvas. Pada contoh ini
judul pada kanvas adalah “My first drawing”.
glClearColor(0.0, 0.0, 0.0, 0.0);
10
Pernyataan ini digunakan untuk memberi warna latar belakang pada kanvas, pada
contoh di atas warna latar belakang kanvas adalah hitam (0,0,0,0), untuk
mengganti menjadi warna putih diubah menjadi (1,1,1,0). Konsep warna yang
digunakan adalah RGBA dengan struktur (red,green,blue,alpha) yang menyatakan
komponen (merah, hijau, biru, tranparansi), tetapi warna-warna yang akan banyak
disajikan dalam buku ini menggunakan konsep RGB dan Alpha tidak digunakan.
gluOrtho2D(-100., 100., -100.0, 100.0);
Pernyataan ini digunakan untuk menyatakan ukuran sistem koordinat dengan
struktur (xmin, xmax, ymin, ymax). Pada contoh di atas, sistem koordinat yang
digunakan mempunyai batas koordinat sumbu X dari -100 ke 100, dan sumbu Y
dari -100 ke 100. Ukuran sistem koordinat ini tidak berhubungan dengan ukuran
kanvas.
glutIdleFunc(display);
Pernyataan ini digunakan untuk refresh setiap proses menggambar selesai dan
biasanya digunakan untuk membuat animasi. Untuk gambar yang tidak bergerak,
pernyataan ini tidak digunakan.
glutDisplayFunc(display);
Pernyataan ini digunakan untuk menampilkan semua perintah grafis yang ada di
fungsi userdraw().
Untuk selanjutnya semua perintah (program) untuk menggambar obyek baik 2D atau 3D
diletakkan pada fungsi userdraw(), ini berlaku untuk semua perintah yang dijelaskan
dalam buku workshop grafika ini.
glBegin(GL_POLA);
glVertex2f(koordinat titik 1);
glVertex2f(koordinat titik 2);
.........
glVertex2f(koordinat titik n);
glEnd();
11
Sepuluh macam GL_POLA yang ada di openGL sebagai berikut :
GL_QUADSMenggambar segi 4
GL_QUAD_STRIPMenggambar N segi 4
12
Gambar 2.2. Sepuluh macam GL_POLA di Fungsi Primitif openGL
13
Bila ditulis glPointSize(4) maka besar titiknya adalah 4x4 pixel. Bila tidak digunakan
maka ukuran titiknya adalah 1 pixel.
Perintah ini bisa digunakan untuk menggambar banyak garis, dengan catatan titiknya
harus berpasangan dan berurutan.
14
B.9. Menggambar Polygon
Polygon adalah gabungan garis-garis yang tertutup yang membentuk satu obyek dan
bisa diblok dengan warna. Perintah untuk mengambar polygon dari posisi (x1,y1) ke
(x2,y2) ... ke (xn, yn) menghasilkan kurva tertutup dengan warna dalam bahasa C
menggunakan library OpenGL adalah:
glBegin(GL_POLYGON);
glVertex2f(pos_x_1,pos_y_1);
glVertex2f(pos_x_2,pos_y_2);
..........
glVertex2f(pos_x_n, pos_y_n);
glEnd();
glVertex2f(pos_x_4, pos_y_4);
…
Quad N (setiap 4
titik berikutnya)
glVertex2f(pos_x_n, pos_y_n);
glEnd();
15
glVertex2f(pos_x_3,pos_y_3);
glVertex2f(pos_x_4,pos_y_4);
glVertex2f(pos_x_3,pos_y_3);
glVertex2f(pos_x_4,pos_y_4); Quad II
glVertex2f(pos_x_5,pos_y_5);
glVertex2f(pos_x_6,pos_y_6);
...
glEnd();
glBegin(GL_TRIANGLES);
glVertex2f(pos_x_1,pos_y_1);
Triangles I
glVertex2f(pos_x_2,pos_y_2); Quad I
glVertex2f(pos_x_3, pos_y_3);
glVertex2f(pos_x_4, pos_y_4);
Triangles II
glVertex2f(pos_x_5, pos_y_6);
glVertex2f(pos_x_7, pos_y_8);
glEnd();
16
glEnd();
17
C. TUGAS PENDAHULUAN
D. PERCOBAAN
1. Membuat window I: program dasar untuk menggunakan library OpenGL dalam
bahasa C++
#include <GL/glut.h>
void userdraw(void) {
// Disini tempat untuk menggambar
}
void display(void) {
glClear( GL_COLOR_BUFFER_BIT);
userdraw();
glutSwapBuffers();
}
18
Contoh hasil dari contoh program di atas adalah:
2. Pada bagian userdraw() ketikkan program berikut untuk mengambar titik di posisi
(50,10) .
glBegin(GL_POINTS);
glVertex2f(50,10);
glEnd();
3. Pada bagian userdraw() ketikkan program berikut untuk mengambar titik di posisi
(25,10), (10,10) dan (10,25).
void userdraw(void){
glBegin(GL_POINTS);
glVertex2f(25,10);
glVertex2f(10,10);
glVertex2f(10,25);
glEnd();
}
19
#include <stdlib.h>
void userdraw(void) {
int s; // ukuran titik
float x,y; // posisi titik
for(int i=0;i<1000;i++){
s=rand()%4+1;
glPointSize(s);
glBegin(GL_POINTS);
x=-100+200*(float)rand()/RAND_MAX;
y=-100+200*(float)rand()/RAND_MAX;
glVertex2f(x,y);
glEnd();
}
}
void display(void) {
glClear( GL_COLOR_BUFFER_BIT);
userdraw();
glutSwapBuffers();
}
int main(int argc, char **argv) {
glutInit(&argc,argv);
glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("My first drawing");
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100., 100., -100.0, 100.0);
glutIdleFunc(display); // idle event call back
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
20
Gambar 2.4. Titik-titik acak
Bila ini dijalankan akan seperti gambar TV rusak karena program berjalan secara terus-
menerus. Untuk menghentikan proses tutup satu baris perintah di bagian main() yaitu:
glutIdleFunc(display);
5. Menggambar efek bintang berkelip, efeknya hampir sama dengan menggambar titik-
titik acak, tetapi posisi titik tetap sehingga diperlukan sebuah kondisi untuk mengacak
posisi titik-titik yang hanya sekali saja (penggunaan variabel static tick yang terus-
menerus ditambah satu dan kondisi tick=0), dan untuk kemudian hanya diacak titik
mana yang akan diubah ukurannya. Programnya hampir sama dengan contoh 2.3,
tetapi fungsi userdrawnya diganti menjadi:
void userdraw(void) {
static int tick=0; // variable yang berjalan terus
static point2D_t bintang[100];
int i;
// mengacak posisi bintang saat tick=0 atau sekali saja
if(tick==0){
for(i=0;i<100;i++){
bintang[i].x=rand()%400;
bintang[i].y=rand()%300;
21
}
}
// menggambar bintang
setColor(1,1,1);
glPointSize(2);
for(i=0;i<100;i++){
glBegin(GL_POINTS);
glVertex2f(bintang[i].x,bintang[i].y);
glEnd();
}
// mengacak bintang yang berkelip
int k=rand()%100;
glPointSize(4);
glBegin(GL_POINTS);
glVertex2f(bintang[k].x,bintang[k].y);
glEnd();
}
(5,10)
(40,0)
22
void userdraw(void){
glBegin(GL_LINES);
glVertex2f(0,50);
glVertex2f(20,0);
glEnd();
glBegin(GL_LINES);
glVertex2f(20,0);
glVertex2f(-20,0);
glEnd();
glBegin(GL_LINES);
glVertex2f(-20,0);
glVertex2f(0,50);
glEnd();
}
Pada program ini terlihat bahwa glBegin(GL_LINES) selalu membutuhkan pasangan dari
2 titik untuk menghasilkan sebuah garis, sehingga untuk membuat segitiga (tiga buah
garis) dibutuhkan 6 buah peritah glVertex. Hasilnya adalah sebagai berikut:
23
Gambar 2.6. Segitiga
8. Program berikut tidak akan menghasilkan segitiga, karena tidak ada pasangan titik
yang pas.
void userdraw(void){
glBegin(GL_LINES);
glVertex2f(0,50);
glVertex2f(20,0);
glVertex2f(-20,0);
glEnd();
}
9. Program ini hanya menghasilkan garis dari titik (0,50) sampai titik (20,0).
Sedangkan titik (-20,0) tidak digambar karena tidak mempunyai pasangan.
Cara lain untuk membuat segitiga dapat menggunakan perintah
glBegin(GL_LINE_STRIP) dengan menuliskan kembali titik yang pertama
seperti proram di bawah ini, lebih jauh lagi akan dibahas di bab selanjutnya.
void userdraw(void){
glBegin(GL_LINE_STRIP);
glVertex2f(0,50);
glVertex2f(20,0);
glVertex2f(-20,0);
glVertex2f(0,50);
glEnd();
}
24
10. Menggambar efek hujan, sama seperti menggambar bintang dengan titik acak,
tetapi yang obyeknya berupa garis diagonal. Program untuk menggambar efek
hujan ini adalah:
void userdraw(void){
float xp,yp;
for(int i=0;i<300;i++){
xp=640*(float)rand()/RAND_MAX;
yp=480*(float)rand()/RAND_MAX;
glColor3f(1,1,1);
glBegin(GL_LINES);
glVertex2f(xp,yp);
glVertex2f(xp+8,yp-8);
glEnd();
}
}
Hasilnya adalah:
25
operasi penjumlahan atau pengurangan dari masing-masing nilai x dan nilai y pada setiap
garis. Permainan sudut akan menjadi lebih baik karena bisa mengubah arah hujan menjadi
lebih realistik dengan memberikan afek angin.
11. Membuat segitiga pada contoh 2.6 di atas berwarna merah dengan latar belakang
putih dapat dilakukan dengan menambahkan glColor3f(1,0,0); sebelum membuat
segitiga sebagai berikut. Sebelumnya ubah perintah glClearColor(0.0, 0.0, 0.0, 0.0);
pada bagian main() menjadi glClearColor(1.0, 1.0, 1.0, 0.0);
void userdraw(void){
glColor3f(1,0,0);
glBegin(GL_LINE_STRIP);
glVertex2f(0,50);
glVertex2f(20,0);
glVertex2f(-20,0);
glVertex2f(0,50);
glEnd();
}
26
Gambar 2.8. Segitiga berwarna merah
13. Membuat grid dengan warna biru (0,0,1) dan sumbu koordinat.dengan warna biru
muda (0,1,1). Jarak antar grid adalah 10 satuan dengan batas sumbu koordinat (-
100,100) untuk sumbu X dan (-100,100) untuk sumbu Y seperti gambar berikut:
(Sebelumnya ubah latar belakang menjadi hitam dengan glClearColor(0.0, 0.0,
0.0, 0.0); pada bagian main().
27
glColor3f(0,0,1);
for(float x=-100;x<=100;x+=10){
glBegin(GL_LINES);
glVertex2f(x,-100);
glVertex2f(x,100);
glEnd();
glBegin(GL_LINES);
glVertex2f(-100,x);
glVertex2f(100,x);
glEnd();
}
glColor3f(0,1,1);
glBegin(GL_LINES);
glVertex2f(-100,0);
glVertex2f(100,0);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,-100);
glVertex2f(0,100);
glEnd();
}
E. TUGAS
Membuat rumah 2D tampak depan ( yang telah didesain di tugas pendahuluan) dengan
menggunakan 10 pola pada fungsi primitive openGL, contoh pada gambar.
F. LAPORAN RESMI
28
1. Buatlah kesimpulan dari masing-masing percobaan program grafika yang sudah
dilakukan !
2. Demo dan kumpulkan listing program beserta penjelasan tugas workshop
menggambar dengan fungsi primitif.
29
PRAKTIKUM 3
OBYEK 2D
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mendefinisikan obyek 2D
2. Mendefinisikan warna obyek 2D
3. Membuat fungsi menggambar obyek 2D
4. Membuat gambar obyek 2D lebih baik
B. DASAR TEORI
B.1. Obyek Grafik 2 Dimensi
Obyek grafik 2 dimensi sebenarya adalah titik, mengingat bahwa grafik 2 dimensi
adalah kumpulan dari titik-titik yang dihubungkan sehingga membentuk obyek gambar.
Berdasarkan sistem koordinat kartesian, titik dinyatakan dengan properti lokasi x dan y,
yang dituliskan dengan P(x,y). Sehingga tipe data titik dituliskan dengan:
typedef struct {
float x,y;
} point2D_t;
Untuk mendefinisikan variable titik dapat dilakukan dengan menuliskan:
point2D_t p;
Gambar dalam 2D adalah kumpulan titik-titik 2D yang dihubungkan menggubanak garis
atau polygon sesuai dengan urutan titik-titik tersebut seperti terlihat pada gambar 3.1
berikut:
P2
P1 P3
P5
P4
P6
P10 P7
P9 P8
30
Untuk menyatakan sebuah obyek gambar yang terdiri dari sekumpulan titik dapat
dituliskan dalam bentuk array sebagai berikut:
point2D_t gambar[100];
Dari pernyataan di atas, gambar terdiri dari maksimum 100 titik. Jumlah titik seharusnya
didefinisikan dulu.
B.2. Menggambar Polyline
Polyline adalah sebuah bentuk gambar yang terdiri dari kumpulan garis yang
dihubungkan satu dengan yang lain secara berurutan, dengan tidak menyambungkan
kembali ke titik awalnya, seperti gambar 3.2 di bawah ini.
Dan untuk menggambar Polyline dari 3 titik (0,50), (30,0) dan (-30,0) adalah sebagai
berikut:
point2D_t p[3]={{0,50},{30,0},{-30,0}};
drawPolyline(p,3);
31
Gambar 3.3. Polygon
Fungsi membuat polygon sama seperti fungsi polyline dengan menambahkan titik awal di
akhirnya sebagai berikut:
void drawPolygon(point2D_t p[],int n){
glBegin(GL_LINE_STRIP);
for(int i=0;i<n;i++){
glVertex2f(p[i].x,p[i].y);
}
glVertex2f(p[0].x, p[0].y);
glEnd();
}
Contoh :
Untuk membuat segitiga dari (0,50), (30,0) dan (-30,0) pada userdraw dapat dilakukan
dengan:
point2D_t p[3]={{0,50},{30,0},{-30,0}};
drawPolygon(p,3);
32
Kemudian buatlah fungsi untuk mengubah/melakukan setting warna sebagai berikut:
(1) Fungsi dengan lanngsung memasukkan nilai r,g,b
void setColor(float r, float g, float b){
glColor3f(r,g,b);
}
(2) Fungsi dengan tipe data color_t
void setColor(color_t col){
glColor3f(col.r, col.g, col.b);
}
Kemudian membuat fungsi untuk memberi warna pada bagian dalam polygon dengan
menambahkan fungsi berikut:
void fillPolygon(point2D_t p[],int n,color_t col){
setColor(col);
glBegin(GL_POLYGON);
for(int i=0;i<n;i++){
glVertex2f(p[i].x,p[i].y);
}
glEnd();
}
33
glVertex2f(p[i].x,p[i].y);
}
glEnd(); }
C. TUGAS PENDAHULUAN
Siapkan definisi struktur data untuk obyek 2D dan color_t. Begitu pula fungsi untuk
menggambar polyline(),polygon(),fillpolygon(),dan gradatepolygon() pada program
obyek 2D yang akan dibuat.
D. PERCOBAAN
1. Membuat gambar fungsi sinus dari 0o sampai dengan 360o, dapat dilakukan dengan
terlebih dahulu mengubah sistem koordinat pada main() dengan:
gluOrtho2D(0., 360., -1.1, 1.1);
Dan tambahan header file math.h untuk mengaktifkan fungsi-fungsi trigonometri sebagai
fungsi dalam matematika.
#include <math.h>
Kemudian di userdraw dituliskan:
void userdraw(void) {
point2D_t p[360];
for(int i=0;i<360;i++){
p[i].x=(float)i;
p[i].y=(float)sin((float)i/57.3);
}
drawPolyline(p,360);
}
Hasil dari program di atas adalah seperi gambar 3.4 di bawah ini.
34
2.Program berikut membuat segitiga berwana merah dengan titik-titk sudut (0,50), (30,0)
dan (-30,0)
point2D_t p[3]={{0,50},{30,0},{-30,0}};
color_t merah={1,0,0};
fillPolygon(p,3,merah);
Hasil dari program ini adalah seperti gambar 3.5 berikut.
E. TUGAS
1. Buatlah program menggambar fungsi sinus dari 0o sampai dengan 360o dengan
menambahkan fungsi grid dan sumbu koordinat, seperti pada gambar 3.7.
35
Gambar 3.7. Fungsi Sinus dengan Grid
2. Buatlah gambar langit. Atur sumbu koordinat menjadi (0,640,0,480) dengan
mengganti nilai pada gluOrtho2D. Kemudian buat kotak sebesar windowsnya, dan
definisikan warna yang bersesuaian. Output dari program seperti pada gambar 3.8.
biru biru
putih putih
F. LAPORAN RESMI
1. Buatlah kesimpulan dari masing-masing percobaan program grafika yang sudah
dilakukan !
2. Demo dan kumpulkan listing program beserta penjelasan tugas workshop
menggambar obyek 2D.
36
PRAKTIKUM 4
OBYEK PUTAR 2D
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mengerti dan dapat Membuat Obyek Lingkaran
2. Mengerti dan dapat Membuat Obyek Ellipse
3. Mengerti dan dapat Membuat Obyek Polar
B. DASAR TEORI
B.1. Membuat Lingkaran
Secara definisi, lingkaran adalah segi banyak. Jadi persoalannya disini adalah
bagaimana membuat sebuah bangun segi banyak, dimana setiap segi mempunyai sudut
yang sama besar. Untuk mempermudah terlebih dahulu diperhatikan sistem koordinat
sudut dimana setiap titik dituliskan dengan P(r,a), r adalah jari-jari atau jarak dengan titik
pusat dan a adalah sudut.
P(r,a)
37
Konversi sistem koordinat sudut menjadi sistem koordinat Kartesian adalah sebagai
berikut.
x r. cos(a )
y r. sin( a )
Lingkaran adalah suatu bangun yang pada setiap sudutnya, jarak dengan titik pusat selalu
sama r.
B.2 Membuat Ellipse
Ellipse sebenarnya hampir sama dengan lingkaran, hanya saja bedanya adalah pada
jari-jari, jika pada lingkaran hanya mengenal satu jari-jari maka ellipse mempunyai dua
jari-jari a (arah horisontal) dan b (arah vertikal). Hal inilah yang membuat bentuk ellipse
menjadi lonjong.
38
Tabel 4.1. Fungsi Polar dan Hasil Menggambar Obyek Polar
Fungsi Hasil
Rose 4 daun:
r sin 2
Rose 3 daun:
r sin 3
Kardioda:
r 1 cos( )
Spiral:
r
39
Fungsi Hasil
Lingkaran:
ra
C. TUGAS PENDAHULUAN
1. Tulislah persamaan lingkaran koordinat kartesian (x,y) dari kordinat polar!
2. Tulislah persamaan ellipse koordinat kartesian (x,y) dari kordinat polar!
3. Tulislah persamaan koordinat kartesian (x,y) dari 4 (empat) obyek polar lainnya!
40
D. PERCOBAAN
1. Menggambar lingkaran pada userdraw() memanggil drawCircle(jari-jari, jumlah_titik),
misalkan bila dituliskan drawCircle(30,40) berarti membuat lingkaran dengan jari-jari
30 dan jumlah titik 40.
void drawCircle(float r, int n){
point2D_t p[360];
float a=6.28/n;
for(int i=0;i<n;i++){
p[i].x=r*(float)cos((float)i*a);
p[i].y=r*(float)sin((float)i*a);
}
drawPolygon(p,n);
}
Pada bagian userdraw tambahkan :
void userdraw(void){
setColor(1,0,0);
drawCircle(40,30);
}
Output program dapat dilihat pada gambar 4.3.
2. Membuat 2 lingkaran berwarna merah dan biru dengan latar belakang putih, jari-
jarinya masing-masing 40 dan 30, dan titik pusatnya masing-masing di (-50,0) dan
(50,0), sebelumnya ganti perintah glClearColor(0.0, 0.0, 0.0, 0.0); menjadi
glClearColor(1.0, 1.0, 1.0, 0.0); dan sumbu koordinat diganti menjadi (-320,320,-
41
340,340) agar mempunyai skala yang sama antara x dan y dengan cara mengganti
gluOrtho2D(-100.,100., -100.,100.); menjadi gluOrtho2D(-320.,320.,-240., 240.);
void drawCircle(float r, int n, float x, float y){
point2D_t p[360];
float a=6.28/n;
for(int i=0;i<n;i++){
p[i].x=x+r*(float)cos((float)i*a);
p[i].y=y+r*(float)sin((float)i*a);
}
drawPolygon(p,n);
}
Pada bagian userdraw tambahkan :
void userdraw(void){
setColor(1,0,0);
drawCircle(40,30);
}
Output program dapat dilihat pada gambar 44.
42
void fillCircle(float r, int n, color_t col){
point2D_t p[360];
float a=6.28/n;
for(int i=0;i<n;i++){
p[i].x=r*(float)cos((float)i*a);
p[i].y=r*(float)sin((float)i*a);
}
fillPolygon(p,n,col);
}
Fungsi untuk membuat warna pada lingkaran yang diletakkan pada koordinat (x,y).
void fillCircle(float r, int n, float x, float y, color_t col){
point2D_t p[360];
float a=6.28/n;
for(int i=0;i<n;i++){
p[i].x=x+r*(float)cos((float)i*a);
p[i].y=y+r*(float)sin((float)i*a);
}
fillPolygon(p,n,col);
}
Pembanggilan fungsi di userdraw:
void userdraw(void){
color_t merah={1,0,0};
color_t biru={0,0,1};
color_t kuning={1,1,0};
fillCircle(30,40,-100,0,merah);
fillCircle(40,40,0,0,biru);
fillCircle(50,40,100,0,kuning);
}
43
Gambar 4.5. Lingkaran berwarna
4. Membuat 3 buah ellips dengan:
Jari-jari (80,100), (20,10), dan (20,10)
Diletakkan di (0,0), (100,0) dan (-100,0) mempunyai warna merah, hijau dan biru
void drawEllips(float a, float b, int n){
point2D_t p[360];
float t=6.28/n;
for(int i=0;i<n;i++){
p[i].x=a*(float)cos((float)i*t);
p[i].y=b*(float)sin((float)i*t);
}
drawPolygon(p,n);
}
Untuk membuat ellips dengan titik pusat (x,y) maka fungsi di atas diubah menjadi:
void drawEllips(float a, float b, int n, float x, float y){
point2D_t p[360];
float t=6.28/n;
for(int i=0;i<n;i++){
p[i].x=x+a*(float)cos((float)i*t);
p[i].y=y+b*(float)sin((float)i*t);
}
drawPolygon(p,n);
}
44
Untuk memberi warna pada bagian dalam ellips, diperlukan fungsi fillPolygon sebagai
penggati fungsi drawPolygon, tetapi masih membutuhkan tambahan warna pada
fungsinya dan dituliskan sebagai berikut:
void fillEllips(float a, float b, int n, float x, float y,
color_t col){
point2D_t p[360];
float t=6.28/n;
for(int i=0;i<n;i++){
p[i].x=x+a*(float)cos((float)i*t);
p[i].y=y+b*(float)sin((float)i*t);
}
fillPolygon(p,n,col);
}
Program pada userdraw adalah:
void userdraw(void)
{
color_t merah={1,0,0};
color_t hijau={0,1,0};
color_t biru={0,0,1};
fillEllips(80,100,30,0,0,merah);
fillEllips(20,10,30,100,0,hijau);
fillEllips(20,10,30,-100,0,biru);
}
45
5. Membuat kardioda sebelum menggambar diperlukan perhitungan nilai r 1 cos
atau r . Menggambar koordinat polar diperlukan definisi r sebagai fungsi dari sudut
atau r sebagai array. Nilai r inilah yang menghasilkan bentuk-bentuk koordinat polar.
Fungsi untuk menggambar koordinat polar adalah:
void drawPolar(float r[], int n){
point2D_t p[360];
float t=6.28/n;
for(int i=0;i<n;i++){
p[i].x=r[i]*(float)cos((float)i*t);
p[i].y=r[i]*(float)sin((float)i*t);
}
drawPolygon(p,n);
}
Program pada userdraw adalah:
void userdraw(void)
{
// create Polar Function
float r[360];
float t=6.28/360;
for(int i=0;i<360;i++){
r[i]=150*(1+cos(i*t));
}
// draw Polar Object
setColor(0,0,0);
drawPolar(r,360);
}
E. TUGAS
1. Buatlah program menggambar bintang segi-5. Gambar bintang ini mempunyai 10 titik
yang terletak pada 2 buah lingkaran r1 dan r2 secara bergantian. Sehingga dapat dituliskan
dengan: r[10] {r1 , r2 , r1 , r2 , r1 , r2 , r1 , r2 , r1 , r2 } Misalkan r1=50 dan r2=100 maka:
r[10] {50,100,50,100,50,100,50,100,50,100}
46
r1
r2
F. LAPORAN RESMI
1. Buatlah kesimpulan dari masing-masing percobaan program grafika yang sudah
dilakukan !
2. Demo dan kumpulkan listing program beserta penjelasan tugas menggambar dengan
fungsi obyek polar!
47
PRAKTIKUM 5
MELAKUKAN PENGESETAN PERSEPTIVE VIEW DAN
VIEW PORT FUNGSI TRANSFORMASI
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mengerti dan dapat Melakukan Pengesetan Persepektif View
2. Mengerti dan dapat Melakukan Pengesetan View Port
3. Mengerti dan dapat Melakukan Transformasi Sumbu Koordinat
B. DASAR TEORI
B.1. Sistem Koordinat Layar
Sistem koordinat layar berbentuk 2D kartesian, dengan pusat (0,0) pada pojok kiri
bawah (OpenGL). Piksel didefinisikan pada interseksi kolom dan baris. Didefinisikan
relatif pada display layar.
48
Gambar 3.2. Contoh representasi 2 sistem koordinat layar yang berbeda
2. Orang lebih suka menggambar berdasarkan ukuran sebenarnya
Obyek gambar dalam sistem koordinat riil seharusnya dapat dinyatakan dalam
sistem koordinat layar yang terpisah.
49
Gambar 3.4. Mapping World Window ke Screen Window
50
B.2.2. Mendefinisikan Viewport
Viewport window adalah sebuah daerah kotak di layar yang ditampilkan ( sistem
koordinat layar) , perhatikan gambar 3.6.
51
B.2.4. Rasio Lebar R dan L
Pada Mapping World Window ke Vewport Window rasio lebar R dan L harus
sama, sehingga koordinat sx didapatkan dengan formula :
(x-W_L)/(W_R-W_L)=(sx-V_L)/(V_R-V_L)
sx=(x-W_L)(V_R-V_L)/(W_R-W_L)+V_L
Pada Mapping World Window ke Vewport Window rasio tinggi T dan B harus
sama, sehingga koordinat sx didapatkan dengan formula :
(y-W_B)/(W_T-W_B)=(sy-V_B)/(V_T-V_B)
sy=(y-W_B)(V_T-V_B)/(W_R-W_B)+V_B
52
B.3. Transformasi di OpenGL
Transformasi vertex di OpenGL sebagai berikut gambar 3.10.:
Pernyataan yang ditulis paling akhir akan dioperasikan pertama kali, sedangkan
pernyataan yang ditulis di awal dioperasikan terakhir.
Sedangkan matrik transformasi terdiri dari tiga operasi dasar yaitu :
1. Translasi
2. Scaling
3. Rotasi
53
B.3.1. Translasi
Translasi adalah proses perpindahan posisi dari obyek gambar. Formulasi dari
proses translasi dapat dijelaskan sebagai berikut:
P’(x’,y’)
Y
dy
P(x,y)
dx
Untuk membuat fungsi yang menghasilkan matrik translasi ini, terlebih dahulu dibuat
fungsi untuk menghasilkan matrik identitas
1 0 0
0 1 0
0 0 1
void glTranslatef(dx,dy,dz)
54
Gambar 3.12. glTranslatef(0.,2.,-2)
B.3.2. Scaling
Scaling adalah proses membesarkan/mengecilkan jarak titik sebesar m, yang
ditunjukkan oleh gambar 3.12 berikut:
P’(x’,y’)
P(x,y)
55
Dan matrik transformasi dari proses scaling adalah sebagai berikut:
m x 0 0
0 my 0
0 0 1
B.3.3. Rotasi
Rotasi adalah proses memutar titik sebesar ao dengan titik pusat putaran berada
pada titik pusat koordinat, yang ditunjukkan oleh gambar 3.13 berikut:
Y
P’(x’,y’)
a P(x,y)
X
Gambar 3.15. Proses rotasi
56
Dan matrik transformasi dari proses rotasi adalah sebagai berikut:
cos(a ) sin( a ) 0
sin( a ) cos(a ) 0
0 0 1
C. TUGAS PENDAHULUAN
57
D. PERCOBAAN
1. Menggambar segiempat (fungsi GL_QUAD) pada sistem koordinat world window
dan viewport window. Ketikkan program ini pada userdraw().
void DrawQuad()
{ glViewport(50,50,100,100);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1,1,-1,1);
glBegin(GL_QUADS);
glVertex2f(-0.5,-0.5);
glVertex2f(0.5,-0.5);
glVertex2f(0.5,0.5);
glVertex2f(-0.5,0.5);
glEnd();
}
Amati output akhir yang ditampilkan. Buat kesimpulan tentang gluOrtho2D() dan
glViewport().
2. Merubah kesamaan rasio lebar dan tinggi dari screen window (glViewport)
58
3. Program userdraw() untuk memindahkan obyek segiempat dengan titik-titik
(x1,y1)=(10.,10.) dan (x2,y2)=(100.,100.),untuk menggambar gunakan fungsi
glRectf(x1,y1,x2,y2) atau fungsi glBegin(GL_POLYGON). Lakukan translasi
sebesar 110 satuan ke arah sumbu X dan 110 satuan ke arah sumbu Y,gunakah
fungsi glTranslatef(110.,110.,0.). Jika diketahui gluOrtho2D(0.,400.,0.,400.).
Perhatikan potongan program pada userdraw() berikut :
void userdraw(void)
{
glColor3f(1.,1.,0.); //Rect Kuning=Rect hasil translasi
glRectf(10.,10.,100.,100.);
glColor3f(1.,0.,0.);
glTranslatef(110., 110., 0.);//Rect Merah=Rect hasil translasi
glRectf(10.,10.,100.,100.);
}
59
4. Program userdraw() untuk mengubah skala lebar 0.5 kali dan tinggi 0.5 kali pada
obyek segiempat dengan titik-titik (x1,y1)=(10.,10.) dan
(x2,y2)=(100.,100.),untuk menggambar gunakan fungsi glRectf(x1,y1,x2,y2) atau
fungsi glBegin(GL_POLYGON). Lakukan dengan fungsi glScalef(0.5,0.5.,0.).
Jika diketahui gluOrtho2D(0.,400.,0.,400.). Perhatikan potongan program pada
userdraw() berikut :
void userdraw {
glRectf(10.,10.,100.,100.);
glColor3f(1.,0.,0.); //R=Scale
glScalef(0.5,0.5, 0.);
glRectf(10.,10.,100.,100.);
}
Hasil dari program di atas adalah seperti gambar 3.18 a. Amati hasilnya,sumbu
koordinat x dan y akan di scale 0.5 dari asal. Tambahkan glTranslatef((30., 25., 0.)
sebelum fungsi glScalef() akan didapatkan hasil gambar 3.15 b. Buatlah
kesimpulan dari hasil fungsi glScalef() !
60
void userdraw(void)
{
glRectf(10.,10.,50.,100.);
glColor3f(1.,0.,0.);
glTranslatef(70., 100., 0.);
glRotatef(45., 0., 0.,1.);
glRectf(10.,10.,50.,100.);
}
Hasil dari program di atas adalah seperti gambar 3.19 a,amati hasilnya,sumbu
koordinat x akan diputar 450 dari sumbu x asal. Tambahkan glTranslatef((70., 100., 0.)
sebelum fungsi glRotatef() akan didapatkan hasil gambar 3.19 b. Buatlah kesimpulan dari
hasil fungsi glRotatef() !
Gambar 3.19. a. Contoh Hasil Rotasi 450 b. Contoh Hasil Translasi Rotasi 450
6. Program userdraw() untuk menggambar segitiga sebanyak 24 buah dengan rotasi
150 dari segitiga sebelumnya. Agar gambar yang segitiga yang dihasilkan tidak
mempunyai sumbu koordinat yang berbeda setelah di rotasi lakukan translasi
sumbu koordinat kembali ke posisi x,y,z = (0.,0.,0.).
void drawTriangle()
{ glBegin(GL_TRIANGLES);
glVertex2f(-30.,0.);
glVertex2f(30.,0.);
glVertex2f(0.,100.);
glEnd();
}
61
void userdraw(void)
{
int i;
glColor3f(1.,1.,0.);
drawTriangle();
for (i=0; i<24; i++) {
glColor3f(1.,1.,0.);
glRotatef(-15.*(i+1), 0., 0.,1.);
glTranslatef(0., 0., 0.);
drawTriangle();
}
}
E. TUGAS
1. Buatlah program user draw untuk menggambar sarang laba-laba yang dibuat dari
segitiga yang diputar berkali-kali. Catatan : gunakan fungsi transformasi glRotatef
(s,0.,0.,1.), dimana s adalah sudut 00 s/d 1800 dengan perubah 60. Output program
menghasilkan gambar 3.21.
62
Gambar 3.21. Sarang Laba-Laba dari Segitiga
F. LAPORAN RESMI
1. Buatlah kesimpulan dari masing-masing percobaan program grafika yang sudah
dilakukan !
2. Demo dan kumpulkan listing program beserta penjelasan tugas menggambar dengan
fungsi trasformasi
63
PRAKTIKUM 6
FUNGSI KEYBOARD DAN MOUSE
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mengenal Fungsi Callback Keyboard dan Mouse
2. Mengerti dan dapat Membuat Program dengan fungsi glutKeyboardFunc()
3. Mengerti dan dapat Membuat Program dengan fungsi glutMouseFunc()
B. DASAR TEORI
B. 1. Event Handling di OpenGL
OpenGL menyediakan fungsi yang didefinisikan oleh user dan dipanggil pada saat
ada event yang bersesuaian. OpenGL memonitor peralatan input, ketika ada sesuatu yang
terjadi,misalkan saat mouse down,key press,dan lain-lain. Pada tabel 4.1 adalah beberapa
event yang dicek oleh OpenGL.
Tabel 4.1. Event di OpenGL
Event Contoh Fungsi Callback OpenGL
Keypress KeyDown glutKeyboardFunc
KeyUp
Mouse leftButtonDown glutMouseFunc
leftButtonUp
Motion With mouse press glutMotionFunc
Without glutPassiveMotionFunc
Window Moving glutReshapeFunc
Resizing
System Idle glutIdleFunc
Timer glutTimerFunc
Software What to draw glutDisplayFunc
Fungsi Callback GLUT adalah fungsi yang berjalan saat ada kejadian (event-driven).
Program-program yang menggunakan window untuk input/output,menunggu sampai ada
kejadian dan kemudian mengeksekusi beberapa fungsi yang didefinisikan sebelumnya
berdasarkan input dari user. Kejadian yang dimaksud : key press,mouse button press dan
64
release,window resize,dan lain-lain. Program OpenGL yang dibuat akan berjalan tak
terbatas (infinite loop). Berikut adalah contoh coding program menggunakan input
OpenGL. Pembahasan fungsi Callback OpenGL pada praktikum 4 ini akan difokuskan
pada pengecekan adanya kejadian mouse motion dan kejadian pada penekanan keyboard.
int main( intargc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_RGB || GLUT_SINGLE );
glutInitWindowSize( 250, 250 );
glutInitWindowPosition( 100, 100 );
glutCreateWindow(argv[0]);
init ();
glutDisplayFunc( display );
glutReshapeFunc (reshape );
glutMouseFunc( mouse );
glutMotionFunc( motion );
glutKeyboardFunc( keyboard );
glutMainLoop();
return 0;
}
Func adalah mencatat fungsi yang dipanggil ketika sebuah tombol keyboard di tekan.
Parameter key mengembalikan nilai karakter ascii dari tombol keyboard yang ditekan.
Koordinat x,y adalah posisi pointer mouse saat keyboard ditekan,yang diukur dari pojok
kiri atas window. Sedangkan x dan y menyatakan lokasi (di window : koordinat relatif)
dari pointer ketika kejadian key ditekan.
Fungsi OpenGL callback yang lain untuk event adanya keyboard up (pelepasan tombol
keyboard) adalah:
void glutKeyboardUpFunc
65
(void (*func)(unsigned char key, int x, int y));
Func adalah mencatat fungsi yang dipanggil ketika sebuah tombol keyboard selesai
ditekan,diangkat. Parameter key mengembalikan nilai karakter ascii dari tombol keyboard
yang diangkat. Koordinat x,y adalah posisi pointer mouse saat keyboard ditekan,yang
diukur dari pojok kiri atas window. Sedangkan x dan y menyatakan lokasi (di window :
koordinat relatif) dari pointer ketika kejadian key ditekan.
Fungsi OpenGL callback yang lain untuk event adanya penekanan pada tombol khusus
keyboard adalah:
void glutSpecialFunc
(void (*func)(int key, int x, int y));
Func adalah mencatat fungsi yang dipanggil ketika sebuah tombol keyboard khusus yang
ditekan. Parameter key mengembalikan nilai karakter ascii dari tombol keyboard khusus
yang ditekan. Koordinat x,y adalah posisi pointer mouse saat keyboard ditekan,yang
diukur dari pojok kiri atas window. Sedangkan x dan y menyatakan lokasi (di window :
koordinat relatif) dari pointer ketika kejadian key ditekan. Berikut nilai konstanta key dari
tombol keyboard khusus yang ditekan dan fungsi tombolnya di keyboard, tabel 4.2 dan
tabel 4.3.
Tabel 4.2. Konstanta Key dari Tombol Keyboard Khusus
Konstanta Spesial Key Fungsi
GLUT_KEY_F1 Key F1
GLUT_KEY_F2 Key F2
GLUT_KEY_F3 Key F3
GLUT_KEY_F4 Key F4
GLUT_KEY_F5 Key F5
GLUT_KEY_F6 Key F6
GLUT_KEY_F7 Key F7
GLUT_KEY_F8 Key F8
GLUT_KEY_F9 Key F9
GLUT_KEY_F10 Key F10
GLUT_KEY_F11 Key F11
GLUT_KEY_F12 Key F12
66
Konstanta Key Arah Fungsi
GLUT_KEY_UP Key atas
GLUT_KEY_RIGHT Key kanan
GLUT_KEY_DOWN Key bawah
GLUT_KEY_PAGE_UP Key Page Up
GLUT_KEY_PAGE_DOWN Key Page Dwon
GLUT_KEY_HOME Key Home
GLUT_KEY_END Key End
GLUT_KEY_INSERT Key Insert
Fungsi OpenGL yang akan mengembalikan salah satu dari nilai konstanta berikut :
GLUT_ACTIVE_SHIFT, GLUT_ACTIVE_CTRLatau GLUT_ACTIVE_ALT jika
tombol keyboard ini ditekan atau jika ada event mouse yang bekerja.
int glutGetModifiers( )
Func adalah sebuah pointer ke fungsi yang membawa 4 parameter integer. Func
dipanggil oleh OpenGL ketika mouse ditekan atau dilepas (pressed atau released). Button
menyatakan tombol mouse yang ditekan, salah satu dari berikut :
1. GLUT_LEFT_BUTTON
2. GLUT_RIGHT_BUTTON, atau
3. GLUT_MIDDLE_BUTTON
State menyatakan state dari tombol mouse, bernilai salah satunya :
1. GLUT_UP
2. GLUT_DOWN
Sedangkan x dan y menyatakan lokasi (di window : koordinat relatif) dari mouse ketika
kejadian.
Fungsi OpenGL untuk event adanya pergerakan pada mouse (mouse motion) adalah:
glutMotionFunc(void(*fuc)(int x,int y));
67
Func dipanggil oleh OpenGL ketika pointer mouse berpindah di dalam window selama
satu atu beberapa button mouse ditekan. Sedangkan x dan y menyatakan lokasi dari
mouse ketika kejadian.
Fungsi OpenGL untuk pengecekan tidak adanya event pada mouse (mouse motion)
adalah:
glutPassiveMotionFunc(void(*fuc)(int x,int y));
Func dipanggil oleh OpenGL ketika pointer mouse berpindah di dalam window dengan
tidak adanya button mouse yang ditekan. Sedangkan x dan y menyatakan lokasi dari
mouse ketika kejadian.
Fungsi OpenGL untuk event mouse yang berisi state GLUT_ENTERED atau
GLUT_LEFT berdasarkan mouse masuk atau meninggalkan window yaitu:
void glutEntryFunc(void(*func)(int state));
C. TUGAS PENDAHULUAN
D. PERCOBAAN
1. Event Keyboard: glutKeyboardFunc, glutKeyboardUpFunc, dan
glutSpecialFunc
Potongan program dengan fungsi glutMouseFunc(mouse)sebagai berikut :
- Tempatkan pemanggilan fungsi callback keyboard pada main program sbb :
1. glutKeyboardFunc(keyboard);
2. glutKeyboardUpFunc(keyboardup);
3. glutSpecialFunc(diectional_Keys);
4. glutSpecialFunc(special);
- Buat prosedur dengan nama dan parameter yang sama dengan prosedur pada
parameter fungsi callback sbb :
1. void keyboard(unsigned char key, int x, int y)
2. void keyboardup(unsigned char key, int x, int y)
68
3. void directional_Keys(int key, int x, int y)
4. void special(int key, int x, int y)
- Jalankan program,uji coba :
Fungsi callback keyboard : semua tombol keyboard,kecuali tombol directional key dan
tombol Fxx. Pengujian tombol Ctrl,Shift,dan Alt menggunakan fungsi glutGetModifier().
69
}//end switch
int mod = glutGetModifiers();
switch(mod)
{
case GLUT_ACTIVE_CTRL :
cout<<"Ctrl Held"<<endl; break;
case GLUT_ACTIVE_SHIFT :
cout<<"Shift Held"<<endl; break;
case GLUT_ACTIVE_ALT :
cout<<"Alt Held"<<endl; break;
}//end switch
}//end void keyboard
70
int main(int argc, char *argv[])
{ glutInit(&argc, argv);
glutInitWindowPosition(200, 200);
glutInitWindowSize(400, 400);
glutCreateWindow("GLUT_KEYBOARD_FUNC");
glClearColor(1.,1.,1.,1.);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutKeyboardUpFunc(keyboardup);
glutMainLoop();
return 0;
}
71
Gambar 4.2. Output Program glutKeyboardUpFunc()
72
case GLUT_KEY_F3 :
cout<<"Pressed F3"<<endl;break;
case GLUT_KEY_F4 :
cout<<"Pressed F4"<<endl;break;
case GLUT_KEY_F5 :
cout<<"Pressed F5"<<endl;break;
case GLUT_KEY_F6 :
cout<<"Pressed F6"<<endl;break;
case GLUT_KEY_F7 :
cout<<"Pressed F7"<<endl;break;
case GLUT_KEY_F8 :
cout<<"Pressed F8"<<endl;break;
case GLUT_KEY_F9 :
cout<<"Pressed F9"<<endl;break;
case GLUT_KEY_F10 :
cout<<"Pressed F10"<<endl;break;
case GLUT_KEY_F11 :
cout<<"Pressed F11"<<endl;break;
case GLUT_KEY_F12 :
cout<<"Pressed F12"<<endl;break;
}
}
Output program dengan fungsi callback glutSpecialFunc() disajikan pada gambar 4.3.
73
- Jalankan program,uji coba :
1. Fungsi callback spesial keyboard : pada tabel 4.3 tombol directional key
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowPosition(200, 200);
glutInitWindowSize(400, 400);
glutCreateWindow("Directional Keyboard");
glClearColor(1.,1.,1.,1.);
glutDisplayFunc(display);
glutSpecialFunc(directional_Keys);
glutMainLoop();
return 0;
}
74
printf("GLUT_KEY_INSERT %d\n",key);break;
}//end switch
}//end void
Output program dengan fungsi callback glutSpecialFunc() disajikan pada gambar 4.4.
75
2. klik mouse kanan diujung kanan atas window
3. Klik mouse kiri di tengah window
4. Klik mouse kiri di ujung kiri bawah window
5. Klik mouse kanan di ujung kanan bawah window
76
Gambar 4.5. Output Program fungsi callback glutMouseFunc(mouse)
77
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutPassiveMotionFunc(motionPassive);
…
}
78
{
cout<<"Mouse moved at "
<<"("<< x <<","<< y <<")"<<endl;
}
79
}
E. TUGAS
1. Buatlah gambar persegi(5x5) pada userdraw() , gunakan fungsi callback
glutSpecialFunc() untuk menggerakkan persegi maju GLUT_KEY_RIGHT
(koordX+5) dan mundur GLUT_KEY_LEFT (koordX-5).
2. Tambahkan pemanggilan fungsi callback mouse event glutMouseFunc() pada
program persegi yang sudah dibuat dengan button = GLUT_LEFT_BUTTON pada
posisi persegi akan merubah warna persegi. Lakukan juga pemanggilan callback
glutMouseMotion() dan tambahkan / kurangkan posisi x dan y dari mouse pada
koordinat posisi persegi sebelumnya.
3. Buatlah jalur maze 2D, contoh seperti pada gambar 4.7, definisikan semua range
batas koordinat tembok, gerakkan keyboard arah dari posisi start (merah) sampai
dengan mencapai posisi finish (hijau), pada saat obyek menyentuh tembok posisi
obyek tetap tidak berpindah. Gunakan tombol keyboard lain untuk mempercepat
gerakan, memperlambat dan menghentikan gerakan obyek.
80
F. LAPORAN RESMI
1. Lampirkan listing program,dan output program dari percobaan fungsi callback
keyboard dan mouse. Berikan juga kesimpulan dari masing-masing percobaan
2. Demo program tugas 1 sampai dengan tugas 4 dan kumpulkan listing program,
beserta penjelasan dan output program. Catatan : masing-masing siswa mengerjakan
tugas program berbeda dengan siswa yang lain.
81
PRAKTIKUM 7
TEXT DAN FONT
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mengenal Fungsi Rendering Teks dengan Bitmap
2. Mengenal Fungsi Stroke Teks Karakter
3. Mengerti dan dapat Menambahkan Teks pada Program
B. DASAR TEORI
B. 1. Karakter Bitmap
OpenGL tidak menyediakan dukungan untuk font dan demikian pula untuk teks.
OpenGL menyediakan fungsi untuk bitmap dan fungsi ini dapat dipakai untuk teks.
GLUT (dan sistem window yang lain) menyediakan fungsi untuk teks. Fungsi GLUT
Bitmap berikut untuk menampilkan teks dengan model *font dan indek karakter ascii
(char) :
void glutBitMapCharacter( void *font, int char)
Model font yang dapat dipilih, salah satu dari tabel 5.1. berikut :
Tabel 5.1. Konstanta Font Bitmap
No Konstanta Font Bitmap Arti Output
1 GLUT_BITMAP_8_BY_13 Setiap font berukuran 8x13
2 GLUT_BITMAP_9_BY_15 Setiap font berukuran 9x15
3 GLUT_BITMAP_TIMES_ROMAN_10 Setiap font Times Roman,
berukuran 10 point
4 GLUT_BITMAP_TIMES_ROMAN_24 Setiap font Times
Roman,berukuran 24 point
82
berukuran 18 point
Parameter font sebagai simbolik karakter menyatakan stroke font yang dipakai
(GLUT_STROKE_ROMAN atau GLUT_STROKE_MONO_ROMAN). Sedangkan
character adalah karakter yang dibuat.
B. 3. Menempatkan Teks
Untuk menempatkan teks yang telah dibuat dengan glut bitmap atau dengan stroke
charakter, digunakan fungsi openGL berikut:
void glRasterPos{234}{sifd}( Type x, Type y, Type z, Type w)
void glRasterPos{234}{sifd}v(TYPE *array)
Penjelasan {234} merujuk pada jumlah parameter fungsi salah satu dari 2,3 atau 4,begitu
pula dengan {sifd} berarti tipe parameter single,integer,float,atau double.
C. TUGAS PENDAHULUAN
1. Tulislah kembali fungsi-fungsi OpenGL yang berhubungan dengan text dan font
2. Tampilkan semua konstanta font bitmap dan stroke teks karakter.
D. PERCOBAAN
1. Menampilkan teks menggunakan fungsi glutBitmap. Konstanta font glutBitmap yang
digunakan pada program berikut adalah : GLUT_BITMAP_TIMES_ROMAN_24
#include <GL/glut.h>
void drawBitmapText(char *string,float x,float y,float z)
{
char *c;
83
glRasterPos3f(x,y,z);
for(c=string;*c!='\0';c++)
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,*c);
}
}
void init()
{
glClearColor(0.,0.,0.,0.);
}
void reshape(int w,int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,w,h,0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void render(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glColor3f(0,1,0);
drawBitmapText("Test Font",50,50,0);
glutSwapBuffers();
}
int main(int argc,char * argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
glutInitWindowSize(200,200);
glutInitWindowPosition(100,100);
glutCreateWindow("Text-glutBitmap");
glClearColor(1.,1.,1.,1.);
glutDisplayFunc(render);
84
glutIdleFunc(render);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
2. Menampilkan teks menggunakan fungsi Stroke Teks Character. Konstanta font Stroke
Teks Character yang digunakan pada program berikut adalah :
GLUT_STROKE_ROMAN
#include <GL/glut.h>
void drawStrokeText(char *string, int x, int y, int z)
{
char *c;
glPushMatrix();
glTranslatef(x,y+8,z);
glScalef(0.5f,-0.5f,0);
for(c=string;*c!='\0';c++)
{
glutStrokeCharacter(GLUT_STROKE_ROMAN,*c);
}
glPopMatrix();
85
}
void init()
{
glClearColor(0.,0.,0.,0.);
}
void reshape(int w,int h)
{ glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,w,h,0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void render(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glColor3f(0,1,0);
drawStrokeText("Test Font",10,200,0);
glutSwapBuffers();
}
int main(int argc,char * argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Text-glutStrokeCharacter");
glClearColor(1.,1.,1.,1.);
glutDisplayFunc(render);
glutIdleFunc(render);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
86
Output hasilnya pada gambar 5.2.
E. TUGAS
1. Buatlah program untuk menampilkan semua konstanta font dari glutBitmap(),dengan
output seperti contoh gambar 5.3. berikut :
87
Gambar 5.4. GlutStrokeCharacter Font
F. LAPORAN RESMI
1. Lampirkan listing program,dan output program dari percobaan fungsi glutBitmapFont
dan glutStrokeFont. Berikan juga kesimpulan dari hasil dari masing-masing
percobaan !
2. Demo program tugas 1 dan tugas 2. Kumpulkan listing program, beserta penjelasan
dan output program. Catatan : masing-masing siswa mendemokan output akhir tugas
program berbeda dengan siswa yang lain.
88
PRAKTIKUM 8
PROYEK 1
A. TUJUAN
1. Menerapkan aplikasi menggambar obyek 2D
2. Menerapkan aplikasi event keyboard
3. Membuat proyek simulasi pesawat (obyek 2D) realistik,animasi,dan kendali
keyboard
Pembuatan simulasi pesawat dengan obyek grafik 2D yang realistik, animasi dan
kendalinya menggunakan keyboard seperti gambar 8.1 di bawah ini:
Gambar 8.1. [Kiri] Gerakan pesawat saat digerakkan ke kiri menggunakan tombol anak
panah kiri, [Tengah] Pesawat dalam keadaan state tengah, [Kanan] Gerakan pesawat saat
digerakkan ke kanan menggunakan tombol anak panah kanan.
Spesifikasi simulasi:
(1) Pesawat bisa bergerak ke kanan, kiri, atas dan bawah.
(2) Pesawat bisa menambah dan mengurangi kecepatan.
(3) Efek gerakan maju divisualisasikan dengan garis-garis horisontal pada latar
belakang yang bergerak dari tengah ke bawah. Kecepatan pesawat digambarkan
oleh kecepatan garis-garis horisontal.
B. DASAR TEORI
B.1. Membuat Latar Belakang
Latar belakang dari simulasi kendali pesawat ini terdapat dua macam obyek latar
belakang yaitu:
(1) Latar belakang diam yang berupa langit, gunung dan rumput/tanah.
89
(2) Latar belakang bergerak yang berupa garis-garis horisontal yang bergerak dari
tengah ke bawah.
Adapun teknik pembuatannya bisa menggunakan polygon dan pewarnaan polygon baik
satu warna maupun warna yang bergradiasi. Kreatifitas dalam membuat latar belakang
sangat dibutuhkan untuk mendapatkan latar belakang yang sesuai dengan ide proyek.
Ruang
kemudi/penumpang Baling-baling
Sayap pesawat
Badan pesawat
Mesin jet
90
Gerakan ke atas dan ke bawah merupakan gerakan linier yang menambah atau
mengurangi nilai y dari obyek pesawat seperti terlihat pada gambar 8.3 sebelah kiri.
Gerakan ke kiri dan kanan merupakan gerakan parabolik untuk menghasilkan kesan
pesawat berbelok seperti terlihat pada gambar 8.3 sebelah kanan.
C. TUGAS PENDAHULUAN
Mengumpulkan skenario dari simulasi kendali pesawat berupa gambar obyek pesawat dan
latar belakang.
D. PERCOBAAN
1. Membuat latar belakang dengan garis-garis horisontal yang bergerak dari tengah ke
bawah sesuai dengan skenario.
2. Membuat obyek pesawat sesuai dengan skenario.
3. Membuat sistem kendali untuk gerakan pesawat.
E. LAPORAN RESMI
Laporan resmi berupa demonstrasi dari proyek ini.
91
PRAKTIKUM 9
VERTEX ARRAY – CREATING 3D OBJECT
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
B. DASAR TEORI
Daripada Anda menentukan data vertex individu secara langsung (diantara pasangan
glBegin() dan glEnd ()), Anda dapat menyimpan data vertex dalam satu set array
termasuk posisi vertex, normals, koordinat tekstur dan informasi warna. Dan Anda
dapat menggambar seleksi geometri primitif dengan mereferensikan kembali elemen
array dengan indeks array.
Perhatikan kode berikut untuk menggambar
kubus secara langsung. Setiap sisi
membutuhkan 6 kali pemanggilan
glVertex*() untuk membuat 2 segitiga,
misalnya, sisi depan memiliki
segitiga v0-v1-v2 dan v2-v3-v0. Sebuah
kubus memiliki 6 sisi, sehingga jumlah total
Gambar 9.1. Kubus dengan 8 vertek
pemanggilan glVertex*() adalah 36. Jika Anda juga menentukan normals, koordinat
tekstur dan warna untuk vertex yang sesuai, hal itu akan meningkatkan jumlah
pemanggilan fungsi OpenGL.
Hal lain yang harus Anda perhatikan adalah vertex "v0" dibagi dengan 3 sisi yang
berdekatan, sisi depan, kanan dan atas. Dalam mode langsung, Anda harus
menyediakan shared vertex ini 6 kali, dua kali untuk setiap sisi seperti yang
ditunjukkan dalam kode berikut.
glBegin(GL_TRIANGLES); // menggambar kubus dengan 12
segitiga
92
// front face =================
glVertex3fv(v0); // v0-v1-v2
glVertex3fv(v1);
glVertex3fv(v2);
glVertex3fv(v2); // v2-v3-v0
glVertex3fv(v3);
glVertex3fv(v0);
glVertex3fv(v4); // v4-v5-v0
glVertex3fv(v5);
glVertex3fv(v0);
glVertex3fv(v6); // v6-v1-v0
glVertex3fv(v1);
glVertex3fv(v0);
glEnd();
1. Inisialisasi
OpenGL menyediakan fungsi glEnableClientState() dan
glDisableClientState() untuk mengaktifkan dan menonaktifkan 6 jenis array.
Ditambah, ada 6 fungsi untuk menentukan posisi yang tepat (alamat) dari array,
sehingga, OpenGL dapat mengakses array dalam aplikasi Anda.
glVertexPointer(): menetapkan pointer ke coords array vertex
glNormalPointer(): menetapkan pointer to normal array
93
glColorPointer(): menetapkan pointer ke array warna RGB
glIndexPointer(): menetapkan pointer ke array warna index
glTexCoordPointer(): menetapkan pointer ke tekstur array cords
glEdgeFlagPointer(): menetapkan pointer ke array flag tepi
Setiap fungsi yang ditetapkan memerlukan parameter yang berbeda. Silahkan
melihat API manual OpenGL. Flag tepi digunakan untuk menandai apakah titik
berada di tepi batas atau tidak. Oleh karena itu, satu-satunya tepi di mana flag
tepi yang akan terlihat jika glPolygonMode() diatur dengan GL_LINE.
1. size: Jumlah koordinat vertex, 2 untuk titik 2D, 3 untuk titik 3D.
2. type: GL_FLOAT, GL_SHORT, GL_INT or GL_DOUBLE.
3. stride: Jumlah byte untuk mengimbangi ke vertex berikutnya
(digunakan untuk array yang disisipkan).
4. pointer: Pointer ke vertex array.
94
glDrawArrays() tidak memungkinkan untuk melompati vertex array, Anda
masih harus mengulang shared vertex satu kali pada tiap sisi.
glDrawArrays() memakai argumen 3. Yang pertama adalah tipe primitif.
Parameter kedua adalah offset awal dari array. Parameter terakhir adalah
jumlah vertex untuk melewati saluran rendering OpenGL.
Sebagai contoh di atas untuk menggambar kubus, parameter pertama adalah
GL_TRIANGLES, yang kedua adalah 0, yang berarti mulai dari awal array.
Dan parameter terakhir adalah 36: kubus memiliki 6 sisi dan masing-masing
sisi perlu 6 vertex untuk menggambar 2 segitiga, 6 × 6 = 36.
GLfloat vertices[] = {...}; // 36 koordinat vertex
...
// mengaktifkan dan menentukan pointer ke vertex array
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
// menggambar kubus
glDrawArrays(GL_TRIANGLES, 0, 36);
3. glDrawElements()
glDrawElements() menggambar rangkaian primitif dengan melompati vertex
array dengan indeks array yang terkait. Hal ini mengurangi jumlah
pemanggilan fungsi dan jumlah vertex untuk ditransfer. Selanjutnya, OpenGL
mungkin membuat cache untuk vertex yang baru diproses dan
menggunakannya kembali tanpa mengirim vertex yang sama ke saluran
transformasi vertex berkali-kali.
glDrawElements() membutuhkan 4 parameter. Yang pertama adalah tipe
primitif, yang kedua adalah jumlah indeks dari indeks array, yang ketiga adalah
95
tipe data indeks array dan parameter terakhir adalah alamat dari indeks array.
Dalam contoh ini, parameternya adalah, GL_TRIANGLES, 36,
GL_UNSIGNED_BYTE dan indeks masing-masing.
GLfloat vertices[] = {...}; // 8 koordinat vertex
GLubyte indices[] = {0,1,2, 2,3,0, // 36 index
0,3,4, 4,5,0,
0,5,6, 6,1,0,
1,6,7, 7,2,1,
7,4,3, 3,2,7,
4,7,6, 6,5,4};
...
// mengaktifkan dan menentukan pointer ke vertex array
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
// menggambar kubus
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE,
indices);
Ukuran koordinat vertex array sekarang 8, yang merupakan jumlah yang sama
persis vertex dalam kubus tanpa entri berlebihan.
Perhatikan bahwa tipe data indeks array adalah GLubyte bukan GLuint atau
GLushort. Ini harus menjadi tipe data terkecil yang dapat ditampung nomor
indeks maksimal untuk mengurangi ukuran indeks array, jika tidak, dapat
menyebabkan penurunan kinerja karena ukuran dari indeks array. Sejak array
vertex mengandung 8 vertex, GLubyte cukup untuk menyimpan semua indeks.
Hal lain yang harus dipertimbangkan adalah
vektor normal pada shared vektor. Jika normals
dari poligon yang berdekatan di shared vektor
semua berbeda, maka vektor normal harus
ditentukan sebanyak jumlah sisi, sekali untuk
masing-masing sisi.
Sebagai contoh, vertex v0 dibagi dengan sisi
Gambar 9.2. Vektor Normal Kubus
bagian depan, kanan dan atas, namun, normals tidak dapat dibagi di v0. Normal
dari sisi depan n0, normal sisi yang kanan adalah n1 dan sisi atas adalah n2.
Untuk situasi ini, normal tidak sama dengan shared vertex, vertex tidak dapat
96
didefinisikan hanya sekali dalam vertex array lagi. Hal ini harus didefinisikan
beberapa kali dalam array untuk koordinat vertex dalam rangka untuk
mencocokkan jumlah elemen yang sama dalam array normal. Sebuah kubus
dengan normals yang tepat membutuhkan 24 vertex yang unik: 6 sisi × 4 vertex
per sisi.
4. glDrawRangeElements()
Seperti glDrawElements(), glDrawRangeElements() juga baik untuk
melompat-lompat di vertex array. Namun, glDrawRangeElements() memiliki
dua parameter lainnya (indeks awal dan akhir) untuk menentukan sejumlah
vertex yang di-prefetch. Dengan menambahkan pembatasan range ini, OpenGL
dapat memperoleh jumlah yang terbatas hanya dari data vertex array sebelum
rendering, dan mungkin dapat meningkatkan kinerja.
Parameter tambahan dalam glDrawRangeElements() adalah indeks awal dan
akhir, kemudian OpenGL mem-prefetch jumlah terbatas dari vertex dari nilai-
nilai: akhir – awal + 1. Dan nilai-nilai dalam indeks array harus terletak di
antara index awal dan akhir. Perhatikan bahwa tidak semua vertex dalam
rentang (awal, akhir) harus dirujuk. Tapi, jika Anda menentukan rentang yang
jarang digunakan, hal itu menyebabkan proses yang tidak perlu bagi banyak
simpul yang tidak digunakan dalam kisaran tersebut.
//Catatan : Definisi dari vertices
GLfloat vertices[] = {...}; // 8 koordinat vertex
GLubyte indices[] = // paruh pertama (18 index)
{0,1,2, 2,3,0,
0,3,4, 4,5,0,
0,5,6, 6,1,0,
1,6,7, 7,2,1,
// paruh kedua (18 index)
7,4,3, 3,2,7,
4,7,6, 6,5,4};
...
// mengaktifkan dan menetapkan pointer ke vertex array
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
97
glDrawRangeElements(GL_TRIANGLES, 1, 7, 18,
GL_UNSIGNED_BYTE, indices+18);
Anda dapat mengetahui jumlah maksimum vertex yang akan di-prefetch dan
jumlah maksimum indeks dapat direferensikan dengan menggunakan
glGetIntegerv() dengan GL_MAX_ELEMENTS_VERTICES dan
GL_MAX_ELEMENTS_INDICES.
Perhatikan bahwa glDrawRangeElements() tersedia di OpenGL versi 1.2 atau
lebih.
C. TUGAS PENDAHULUAN
Tulislah kembali fungsi-fungsi OpenGL yang berhubungan dengan VERTEX
ARRAY dan jelaskan kegunaannya
D. PERCOBAAN
1. Contoh Implementasi Vertex Array untuk membuat Objek 3D
Buatlah kubus dengan 4 cara yang berbeda; modus langsung, glDrawArrays(),
glDrawElements() dan glDrawRangeElements().
draw1(): Gambarlah sebuah kubus dengan modus langsung.
draw2(): Gambarlah sebuah kubus dengan glDrawArrays ().
draw3(): Gambarlah sebuah kubus dengan glDrawElements ().
draw4(): Gambarlah sebuah kubus dengan glDrawRangeElements ().
draw5(): Gambarlah sebuah kubus dengan glDrawElements () dan berbagai
simpul yang disisipkan.
98
glColor3f(1,1,1);
glVertex3f(1,1,1);
glColor3f(1,1,0);
glVertex3f(-1,1,1);
glColor3f(1,0,0);
glVertex3f(-1,-1,1);
// face v2-v3-v0
glColor3f(1,0,0);
glVertex3f(-1,-1,1);
glColor3f(1,0,1);
glVertex3f(1,-1,1);
glColor3f(1,1,1);
glVertex3f(1,1,1);
// right faces
glNormal3f(1,0,0);
// face v0-v3-v4
glColor3f(1,1,1);
glVertex3f(1,1,1);
glColor3f(1,0,1);
glVertex3f(1,-1,1);
glColor3f(0,0,1);
glVertex3f(1,-1,-1);
// face v4-v5-v0
glColor3f(0,0,1);
glVertex3f(1,-1,-1);
glColor3f(0,1,1);
glVertex3f(1,1,-1);
glColor3f(1,1,1);
glVertex3f(1,1,1);
// top faces
glNormal3f(0,1,0);
// face v0-v5-v6
glColor3f(1,1,1);
glVertex3f(1,1,1);
glColor3f(0,1,1);
glVertex3f(1,1,-1);
99
glColor3f(0,1,0);
glVertex3f(-1,1,-1);
// face v6-v1-v0
glColor3f(0,1,0);
glVertex3f(-1,1,-1);
glColor3f(1,1,0);
glVertex3f(-1,1,1);
glColor3f(1,1,1);
glVertex3f(1,1,1);
// left faces
glNormal3f(-1,0,0);
// face v1-v6-v7
glColor3f(1,1,0);
glVertex3f(-1,1,1);
glColor3f(0,1,0);
glVertex3f(-1,1,-1);
glColor3f(0,0,0);
glVertex3f(-1,-1,-1);
// face v7-v2-v1
glColor3f(0,0,0);
glVertex3f(-1,-1,-1);
glColor3f(1,0,0);
glVertex3f(-1,-1,1);
glColor3f(1,1,0);
glVertex3f(-1,1,1);
// bottom faces
glNormal3f(0,-1,0);
// face v7-v4-v3
glColor3f(0,0,0);
glVertex3f(-1,-1,-1);
glColor3f(0,0,1);
glVertex3f(1,-1,-1);
glColor3f(1,0,1);
glVertex3f(1,-1,1);
// face v3-v2-v7
glColor3f(1,0,1);
100
glVertex3f(1,-1,1);
glColor3f(1,0,0);
glVertex3f(-1,-1,1);
glColor3f(0,0,0);
glVertex3f(-1,-1,-1);
// back faces
glNormal3f(0,0,-1);
// face v4-v7-v6
glColor3f(0,0,1);
glVertex3f(1,-1,-1);
glColor3f(0,0,0);
glVertex3f(-1,-1,-1);
glColor3f(0,1,0);
glVertex3f(-1,1,-1);
// face v6-v5-v4
glColor3f(0,1,0);
glVertex3f(-1,1,-1);
glColor3f(0,1,1);
glVertex3f(1,1,-1);
glColor3f(0,0,1);
glVertex3f(1,-1,-1);
glEnd();
glPopMatrix();
}
101
glDrawArrays(GL_TRIANGLES, 0, 36);
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY);
// disable vertex arrays
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}
102
void draw4()
{
// enable and specify pointers to vertex arrays
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 0, normals2);
glColorPointer(3, GL_FLOAT, 0, colors2);
glVertexPointer(3, GL_FLOAT, 0, vertices2);
glPushMatrix();
glTranslatef(2, -2, 0);// move to bottom-right
// draw first half (18 elements){0,1,2,
//2,3,0, 4,5,6, 6,7,4, 8,9,10, 10,11,8}
// The minimum index value in this range is 0, and the maximum index
//is 11 therefore, "start" param is 0 and "end" param is 11.
// Then, OpenGL will prefetch only 12 vertex data from the array
//prior to rendering. (half of total data)
glDrawRangeElements(GL_TRIANGLES, 0, 11, 18,
GL_UNSIGNED_BYTE, indices);
// draw last half (18 elements) {12,13,14, 14,15,12, 16,17,18,
//18,19,16, 20,21,22, 22,23,20}
// The minimum index value in this range is 12, and the maximum
//index is 23,therefore, "start" param is 12 and "end" param is 23.
// Then, OpenGL will prefetch only 12 vertex data from the array
//prior to rendering.
// Note that the last param of glDrawRangeElements(). It is the
//pointer to the location of the first index value to be drawn.
glDrawRangeElements(GL_TRIANGLES, 12, 23, 18,
GL_UNSIGNED_BYTE, indices+18);
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}
103
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 9 * sizeof(GLfloat),
vertices3 + 3);
glColorPointer(3, GL_FLOAT, 9 * sizeof(GLfloat),
vertices3 + 6);
glVertexPointer(3, GL_FLOAT, 9 * sizeof(GLfloat), vertices3);
glPushMatrix();
glTranslatef(-2, -2, 0);// move to bottom-left
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY);
// disable vertex arrays
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}
104
E. TUGAS
Buatlah program untuk menggambar 3D pyramid dengan modus langsung,
glDrawArrays(), glDrawElements() dan glDrawRangeElements()., Ouput seperti pada
gambar 9.4
F. LAPORAN RESMI
Buatlah laporan hasil percobaan di atas. Laporan berisikan dasar teori, langkah-langkah
percobaan, hasil percobaan, analisa percobaan, dan analisa kegunaan dari program yang
telah dibuat.
105
PRAKTIKUM 10
TRANSFORMASI DAN PROYEKSI
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mengimplementasikan transformasi pada oyek 3D
2. Mengerti dan memahami OpenGL Projection
B. DASAR TEORI
Data geometris seperti posisi vertex dan vektor normal ditransformasikan
melalui Operasi Vertex dan operasi Primitif Assembly di saluran OpenGL sebelum
proses raterization.
106
objek untuk ruang dunia. Dan, transform View adalah untuk mengkonversi dari
ruang dunia ke ruang mata.
107
B.4. Koordinat Perangkat Normalisasi (Normalized Device Coordinates / NDC)
Koordinat ini dihasilkan dengan cara membagi koordinat klip oleh w . Ini
disebut dengan pembagian perspektif. Lebih seperti koordinat window (layar),
namun belum diterjemahkan dan ditingkatkan ke layar piksel. Kisaran nilai
sekarang dinormalisasi dari -1 sampai 1 di semua 3 sumbu.
Rumus transformasi viewport diperoleh dari hubungan linier antara NDC dan
koordinat window;
108
B.6. Matrix Transformasi OpenGL
OpenGL menggunakan matriks 4 x 4 untuk
transformasi. Perhatikan bahwa 16 elemen
dalam matriks disimpan sebagai array 1D dalam
urutan kolom-utama. Anda perlu mentranspose
matriks ini jika Anda ingin mengubahnya
menjadi standar konvensi, yaitu format baris-
utama. OpenGL memiliki 4 jenis matriks, GL_MODELVIEW,
GL_PROJECTION, GL_TEXTURE, dan GL_COLOR. Anda dapat
mengganti tipe saat ini dengan menggunakan glMatrixMode() dalam kode
Anda. Misalnya, dalam rangka untuk memilih matriks GL_MODELVIEW,
gunakan glMatrixMode(GL_MODELVIEW).
109
2. (m4, m5, m6) : sumbu +Y, vektor atas, (0, 1, 0) secara default
3. (m8, m9, m10) : sumbu +Z, vektor depan, (0, 0, 1) secara default
Lookat ke Axes
Matrix4 kelas
110
kliping, kliping kiri, kanan, bawah, atas, dekat dan jauh. 8 simpul dari frustum
pandangan ditunjukkan pada gambar berikut.
111
const double DEG2RAD = 3.14159265 / 180;
112
Matrix Lain Yang Biasa Digunakan
glPushMatrix() : mendorong matriks saat ini ke dalam matriks stack.
glPopMatrix() : pop matriks arus dari matriks stack.
glLoadIdentity() : mengatur matriks saat ini untuk matriks identitas.
glLoadMatrix{fd}(m) : menggantikan matriks saat ini dengan m matriks.
glLoadTransposeMatrix{fd}(m) : menggantikan matriks saat ini dengan
baris-utama memerintahkan matriks m.
glMultMatrix{fd}(m) : kalikan matriks saat ini dengan m matriks, dan
memperbarui hasil untuk matriks saat ini.
glMultTransposeMatrix{fd}(m) : kalikan matriks saat ini dengan m baris-
utama matriks memerintahkan, dan memperbarui hasil untuk matriks saat ini.
glGetFloatv(GL_MODELVIEW_MATRIX, m) : mengembalikan 16 nilai
GL_MODELVIEW matriks m.
C. TUGAS PENDAHULUAN
Pahamilah langkah-langkah yang ada pada prosedur percobaan. Kemudian buatlah
flowchart untuk aplikasi yang akan di buat.
D. PERCOBAAN
1. Translasi pada obyek bola (sphere)
Tambahkan program berikut pada fungsi draw()
void Draw() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
// Draw a sphere
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(0, deltaY, 0.0); // fungsi translasi
glutSolidSphere(.5, 20, 20);
glPopMatrix();
glFlush();
deltaY+=0.001*oprY;
if(deltaY>=1)oprY=-1;
if(deltaY<=-1)oprY=1;
113
glutPostRedisplay();
}
Dalam program dia atas dibuat sebuah obyek sphere (glutSolidSphere) yang
akan bergerak keatas kebawah sesuai nilai dari deltaY. Fungsi yang digunakan
untuk menggerakkan adalah glTranslatef(x,y,z).
Berikut adalah hasil running program dari program tersebut.
void Draw() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
// Draw a sphere
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glRotated(deltaY, deltaY, deltaY, deltaY);
glTranslatef(1.0, 0.0, 0.0);
glutSolidSphere(.5, 20, 20);
glPopMatrix();
glFlush();
deltaY+=0.1*oprY;
glutPostRedisplay();
}
114
Dalam program dia atas dibuat sebuah obyek sphere (glutSolidSphere) yang
akan berputar searah sumbu x, y dan z sesuai nilai dari deltaY. Fungsi yang
digunakan untuk menggerakkan adalah glRotated(angle, x, y, z).
Berikut adalah hasil running program dari program tersebut.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
// Draw a sphere
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glScalef(delta, delta, delta);
glutSolidSphere(.5, 20, 20);
glPopMatrix();
delta+=0.0001;
glutPostRedisplay();
Dalam program diatas dibuat sebuah obyek sphere (glutSolidSphere) yang akan
semakin membesar dan membesar sesuai nilai dari deltaY. Fungsi yang
digunakan untuk menggerakkan adalah glScalef(x, y, z).
Berikut adalah hasil running program dari program tersebut.
115
Gambar 10.7. Scalling Obyek Bola
E. TUGAS
Buatlah gambar matahari,bumi,bulan dengan bentuk bola. Gunakan fungsi scalling
untuk tiga ukuran bola,posisikan bumi dan bulan dari matahari dengan translasi. Jika
sudah tepat buatlah animasi gerakan bumi mengelilingi matahari,dan bulan
mengelilingi bumi. Contoh tampilan output pada gambar 10.8.
116
PRAKTIKUM 11
LIGHTING DAN SHADING
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Mengenal dan Mengerti Lighting pada OpenGL
2. Mengerti dan dapat Melakukan Flat Shading
3. Mengerti dan dapat Melakukan Smooth Shading
B. DASAR TEORI
B.1. Lighting Model
Ada beberapa macam metode optical view yang dapat dijadikan dasar sebagai
pencahayaan yang jatuh pada benda, yaitu:
Diffuse Scattering
Specullar Reflection
Ambient
Phong Model
Dari semua model pencahayaan tersebut, Phong model merupakan model pencahayaan
yang paling lengkap. Jadi dalam buku grafika ini fungsi pencahayaan yang digunakan
adalah Phong model.
Untuk dapat mengimplementasikan model-model pencahayaan itu terlebih dahulu kita
perlu melakukan pengaturan terhadap lighting model view point menjadi local. Secara
default opengl menyediakan sudut pandang infinite dimana jarak antara sumber cahaya,
sudut pandang dan setiap komponen vertex yang tergambar di layar dianggap sama.
Sehinga cahaya terlihat merata diseluruh bagian obyek pada gambar. Untuk merubahnya
kita gunakan perintah berikut ini:
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);
117
selain itu kita juga harus mengaktifkan fungsi enablelighting, untuk mengaktifkan
pencahayaan dengan sumber cahaya yang kita tentukan.
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
Dua baris perintah diatas adalah perintah untuk mengaktifkan pencahayaan
“glEnable(GL_LIGHTING)” dan mengaktifkan sumbercahaya yang akan kita gunakan
“glEnable(GL_LIGHT0)”. Kita akan mengimplementasikan pencahayaan phong model
kedalam “GL_LIGHT0” ini.
118
Gambar 11.2 Diffuse Lighting
Untuk mengimplementasikan diffuse lighting terlebih dahulu kita inisialisasikan
intensitas cahaya dan warna seperti berikut:
GLfloat qaDiffuseLight[] = {0.8, 0.8, 0.8, 1.0};
glLightfv(GL_LIGHT0, GL_DIFFUSE, qaDiffuseLight);
Kemudian di fungsi draw kita tambahkan perintah untuk memberikan properti pada
material atau gambar.
GLfloat qaGreen[] = {0.0, 1.0, 0.0, 1.0};
glMaterialfv(GL_FRONT, GL_DIFFUSE, qaGreen);
perintah itu digunakan untuk memberikan properti cahaya diffuse (GL_DIFFUSE)
dengan warna (qaGreen) pada sisi depan material (GL_FRONT).
119
Misalkan cahaya datang searah garis P maka cahaya akan dipantulkan ke arah Q. Dimana
sudut antara Q dan sumbu normal (Qr) sama dengan P dan sumbu normal (Qi).
Jika specullar reflection ini diimplementasikan pada gambar maka akan terlihat seperti
gambar 11.4 berikut ini.
Kemudian di fungsi draw kita tambahkan perintah untuk memberikan properti pada
material atau gambar.
GLfloat qaGreen[] = {0.0, 1.0, 0.0, 1.0};
glMaterialfv(GL_FRONT, GL_ SPECULLAR, qaGreen);
B.4. Ambient
Model pencahayaan menggunakan ambient adalah model pencahayaan yang merata pada
semua permukaan benda. Gambar 11.3 adalah contoh hasil pencahayaan ambient pada
benda.
120
Gambar 11.5 Ambient Lighting
Untuk mengimplementasikan specullar lighting terlebih dahulu kita inisialisasikan
intensitas cahaya dan warna seperti berikut:
GLfloat qaSpecullarLight[] = {1.0, 1.0, 1.0, 1.0};
glLightfv(GL_LIGHT0, GL_SPECULLAR, qaSpecullarLight);
Kemudian di fungsi draw kita tambahkan perintah untuk memberikan properti pada
material atau gambar.
GLfloat qaGreen[] = {0.0, 1.0, 0.0, 1.0};
glMaterialfv(GL_FRONT, GL_ SPECULLAR, qaGreen);
121
Gambar 11.6 Phong Model
Flat shading umumnya lebih ringan dibandingkan dengan smooth shading. Namun
smooth shading membuat obyek terlihat lebih halus. Mode default yang disediakan oleh
opengl adalah mode smooth shading. Jika kita tidak mengubah shadeModel maka
otomatis shade yang digunakan adalah smooth. Gambar 11.7 adalah hasil penggunaan flat
dan smooth shading pada sebuah bola.
C. TUGAS PENDAHULUAN
1. Jelaskan mengenai ambient, diffuse, specular dan phong mode menurut pemahaman
anda!
2. Apa kegunaan dari fungsi glShadeModel()?
3. Jelaskan default shading model yang disediakan oleh opengl!
122
D. PERCOBAAN
1. Mengimplementasikan phong model pada gambar segiempat (GL_QUAD).
a. Aturlah window size menjadi 250x250. Dan ortho menjadi -1 sampai 1
glutInitWindowSize(250, 250);
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
b. Melakukan pengaturan lighting, intensitas lighting, warna lighting, dan posisi
lighting
// Lighting set up
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
123
glMaterialf(GL_FRONT, GL_SHININESS, 60.0);
// Draw square with many little squares
glBegin(GL_QUADS);
glNormal3f(0.0, 0.0, 1.0);
const GLfloat kqDelta = .01;
for (int i = -90; i < 90; ++i) {
for (int j = -90; j < 90; ++j) {
glVertex3f(j*kqDelta, i*kqDelta, -.2);
glVertex3f((j+1)*kqDelta, i*kqDelta, -.2);
glVertex3f((j+1)*kqDelta, (i+1)*kqDelta, -.2);
glVertex3f(j*kqDelta, (i+1)*kqDelta, -.2);
}
}
glEnd();
glFlush();
}
124
b. Tambahkan GLUT_DEPTH pada glutInitDisplayMode();
Awal glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
Menjadi glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB |
GLUT_DEPTH);
c. Kemudian ubahlah fungsi initialize()
void Initialize() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, 0.0, 1.0, -3.0, 3.0);
// Lighting set up
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
d. Setelah itu kita gambar dua buah sphere pada fungsi draw()
void Draw() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
125
// Set material properties
GLfloat qaBlack[] = {0.0, 0.0, 0.0, 1.0};
GLfloat qaGreen[] = {0.0, 1.0, 0.0, 1.0};
GLfloat qaRed[] = {1.0, 0.0, 0.0, 1.0};
GLfloat qaBlue[] = {0.0, 0.0, 1.0, 1.0};
GLfloat qaWhite[] = {1.0, 1.0, 1.0, 1.0};
GLfloat qaLowAmbient[] = {0.2, 0.2, 0.2, 1.0};
GLfloat qaFullAmbient[] = {1.0, 1.0, 1.0, 1.0};
126
e. Pada fungsi draw dibuat sphere sebanyak 2 buah dengan menggunakan looping.
Untuk sphere pertama menggunakan shade model flat. Yang kedua menggunakan
smooth shading.
f. Ketika di running hasilnya adalah seperti berikut:
E. TUGAS
Implementasikan Flat Shading dan Smooth Shading pada obyek 3D anda sendiri!
Ubahlah posisi sumber cahaya sesuai keinginan anda!
F. LAPORAN RESMI
Demo dan kumpulkan listing program beserta penjelasan tugas implementasi flat shading
dan smooth shading pada obyek 3D yang anda buat!
127
PRAKTIKUM 12
PROYEK 2
A. TUJUAN
Setelah mempelajari dan mempraktekkan materi dalam praktikum ini mahasiswa
diharapkan mampu:
1. Membuat animasi obyek 3D
2. Menggabungkan beberapa obyek 3D
3. Melakukan kamera view
4. Menggunakan fungsi callback keyboard
Obyek 3D yang akan digambar dinosaurus dengan menggabungkan beberapa obyek
dan bisa melakukan camera view menggunakan keyboard. Animasi ini dibuat dengan
lebih luwes seperti gambar 12.1 berikut. Perubahan saat menggerakkan mouse adalah
mengubah sudut 3D dari obyek tersebut. Gambar 12.2 menunjukkan perubahan saat
drag-drop mouse.
Gambar 12.1. [Kiri] Gerakan kepala dan badan dari dinosaurus dengan menoleh ke kanan
dan ke kiri.
128
B. DASAR TEORI
B.1. Membuat Obyek
Obyek dibentuk dari beberapa obyek dasar yang digabungkan menjadi satu obyek.
Ada beberapa bagian obyek sebagai berikut:
(3) Obyek kepala yang bergerak ke kanan dan kekiri. Obyek ini termasuk pipi,
hitung, mata dan mulut.
(4) Obyek badan hampir seolah bergerak mengikuti sudut gerakan kepala namun
dengan sudut yang jauh lebih kecil.
(5) Obyek sepasang tangan yang gerakannya menyesuaikan gerakan badan.
(6) Obyek sepasang sepatu yang mempunyai sepasang yaitu sepatu di sisi kiri dan
sisi kanan.
Adapun teknik pembuatannya bisa menggunakan polygon dan pewarnaan polygon baik
satu warna maupun warna yang bergradiasi.
129
mouse. Gambar 13 menyatakan model gerakan 3D dari gerakan mouse merupakan
konversi dari sistem koordinat (x,y,z) menjadi (r,a,b) seperti ditunjukkan oleh gambar
12.4 berikut ini.
y
x
C. TUGAS PENDAHULUAN
Mengumpulkan obyek-obyek pembentuk dari kepala, badan, tangan dan kaki dari
dinosaurus.
D. PERCOBAAN
1. Membuat obyek dinosaurus
2. Membuat animasi dari obyek dinosaurus
3. Membuat sistem kendali dengan mouse untuk camera view.
E. LAPORAN RESMI
Laporan resmi berupa demonstrasi dari proyek ini.
130
DAFTAR PUSTAKA
131