Grafika Komputer
Paket Keahlian
Rekayasa Perangkat Lunak
Kelompok Kompetensi G
i
Penulis:
1. Eko Subiyantoro, S.Pd., S.T., MT.
Email: ekovedc@gmail.com
Penelaah:
1. Siarra Maulida Asrin, S.T [081562783394],
Email: abdulmuism@gmail.com
2. Abdul Haliq, S.Pd., M.Pd., [085341259862]
Email : abdulhaliq88@gmail.com
3. Dyah Darma Andayani, S.T, M.Tel.Eng (081355721216)
Email : dydarma@gmail.com
Ilustrator :
1. Faizal Reza Nurzeha., A.Md
Copyright ©2017
Lembaga Pengembangan dan Pemberdayaan Pendidikan Tenaga
Kependidikan Bidang Kelautan Perikanan Teknologi Informasi dan
Komunikasi.
ii
KATA SAMBUTAN
iii
iv
KATA PENGANTAR
Profesi guru dan tenaga kependidikan harus dihargai dan dikembangkan sebagai
profesi yang bermartabat sebagaimana diamanatkan Undang-Undang Nomor 14
Tahun 2005 tentang Guru dan Dosen. Hal ini dikarenakan guru dan tenaga
kependidikan merupakan tenaga profesional yang mempunyai fungsi, peran, dan
kedudukan yang sangat penting dalam mencapai visi pendidikan 2025 yaitu
“Menciptakan Insan Indonesia Cerdas dan Kompetitif”. Untuk itu guru dan tenaga
kependidikan yang profesional wajib melakukan pengembangan keprofesian
berkelanjutan.
Buku Pedoman Penyusunan Modul Diklat Program Keahlian Ganda Bagi Guru
dan Tenaga Kependidikan untuk institusi penyelenggara program pembinaan
karir merupakan petunjuk bagi penyelenggara pelatihan di dalam melaksakan
pengembangan modul yang merupakan salah satu sumber belajar bagi guru dan
tenaga kependidikan. Buku ini disajikan untuk memberikan informasi tentang
penyusunan modul sebagai salah satu bentuk bahan dalam kegiatan
pembinaan karir bagi guru dan tenaga kependidikan.
Pada kesempatan ini disampaikan ucapan terima kasih dan penghargaan
kepada berbagai pihak yang telah memberikan kontribusi secara maksimal
dalam mewujudkan buku ini, mudah-mudahan buku ini dapat menjadi acuan dan
sumber inspirasi bagi guru dan semua pihak yang terlibat dalam pelaksanaan
penyusunan modul untuk pembinaan karir. Kritik dan saran yang membangun
sangat diharapkan untuk menyempurnakan buku ini di masa mendatang.
Makassar, Desember 2015
Kepala LPPPTK KPTK Gowa
Sulawesi Selatan,
v
DAFTAR ISI
vi
KEGIATAN BELAJAR 3 PRIMITIF OBJEK ....................................................... 35
A.Tujuan Pembelajaran .................................................................................... 35
B.Indikator Pencapaian Kompetensi ................................................................. 35
C.Uraian Materi ................................................................................................ 35
D.Aktivitas Pembelajaran ................................................................................. 38
E.Latihan/Tugas ............................................................................................... 43
F.Rangkuman................................................................................................... 43
G. Umpan Balik………………………………………………………………………. 44
H.Kunci Jawaban ............................................................................................. 44
KEGIATAN BELAJAR 4 PEMODELAN OBJEK 2 DIMENSI ............................. 51
A.Tujuan Pembelajaran .................................................................................... 51
B.Indikator Pencapaian Kompetensi ................................................................. 51
C.Uraian Materi ................................................................................................ 51
D.Aktivitas Pembelajaran ................................................................................. 55
E.Latihan/Tugas ............................................................................................... 62
F.Rangkuman................................................................................................... 63
G. Umpan Balik………………………………………………………………………. 63
H.Kunci Jawaban ............................................................................................. 64
KEGIATAN BELAJAR 5 PEMBUATAN OBJEK 3 DIMENSI .............................. 71
A.Tujuan Pembelajaran .................................................................................... 71
B.Indikator Pencapaian Kompetensi ................................................................. 71
C.Uraian Materi ................................................................................................ 71
D.Aktivitas Pembelajaran ................................................................................. 73
E.Latihan/Tugas ............................................................................................... 78
F.Rangkuman................................................................................................... 79
G. Umpan Balik……………………………………………………………………..... 80
H.Kunci Jawaban ............................................................................................. 80
KEGIATAN BELAJAR 6 PEMBUATAN TEKSTURE .......................................... 85
A.Tujuan Pembelajaran .................................................................................... 85
B.Indikator Pencapaian Kompetensi ................................................................. 85
C.Uraian Materi ................................................................................................ 85
D.Aktivitas Pembelajaran ................................................................................. 89
vii
E.Latihan/Tugas ............................................................................................... 96
F.Rangkuman................................................................................................... 97
G. Umpan Balik………………………………………………………………………. 98
H. Kunci Jawaban……………………………………………………………………. 98
KEGIATAN BELAJAR 7 TRANSFORMASI PROYEKSI.................................. 105
A.Tujuan Pembelajaran .................................................................................. 105
B.Indikator Pencapaian Kompetensi ............................................................... 105
C.Uraian Materi .............................................................................................. 105
D.Aktivitas Pembelajaran ............................................................................... 109
E.Latihan/Tugas ............................................................................................. 114
F.Rangkuman................................................................................................. 115
G.Umpan Balik……………………………………………………………………. . 116
H.Kunci Jawaban ........................................................................................... 116
KEGIATAN BELAJAR 8 RENDERING ........................................................... 121
A.Tujuan Pembelajaran .................................................................................. 121
B.Indikator Pencapaian Kompetensi ............................................................... 121
C.Uraian Materi .............................................................................................. 121
D.Aktivitas Pembelajaran ............................................................................... 124
E.Latihan/Tugas ............................................................................................. 134
F.Rangkuman................................................................................................. 136
G. Umpan Balik………………………………………………………………………137
H. Kunci Jawaban………………………………………………………………. 138
PENUTUP ....................................................................................................... 139
EVALUASI ....................................................................................................... 141
GLOSARIUM ................................................................................................... 145
DAFTAR PUSTAKA ......................................................................................... 149
viii
DAFTAR GAMBAR
ix
x
DAFTAR TABEL
xi
…
xii
PENDAHULUAN
A. Latar Belakang
1
B. Tujuan
Tujuan disusunnya modul diklat PKG Guru RPL Level 7 ini adalah memberikan
pengetahuan, ketrampilan dan sikap kepada guru atau peserta diklat dalam
membangun objek 2D dan 3D dengan konsep grafika komputer dengan terampil
melalui aktifitas observasi dan praktikum. Setelah mempelajari modul ini
diharapkan guru dapat :
“Membangun objek 3D menggunakan konsep pemrograman grafik”.
Sedangkan indikator pencapaian kompetensinya yang disusun dalam Standar
Kompetensi Guru secara umum adalah :
1. Menganalisis Integrated Development Environment (IDE) pemrograman
grafik
2. Membuat instruksi dasar OPENGL
3. Membuat pemodelan objek 3D menggunakan OPENGL
4. Membuat pergerakan objek 3D menggunakan OPENGL
C. Peta Kompetensi
Modul ini merupakan modul ke-7 dari 10 modul yang dikembangkan.
Berdasarkan struktur jenjang diklat PKG Modul desain sIstem basis data ini
termasuk dalam jenjang lanjut. Modul ini akan digunakan untuk Program
Keahlian Ganda (PKG) bagi guru-guru produktif Sekolah menengah Kejuruan
pada paket keahlian Rekayasa Perangkat Lunak.
2
Proyek Sistem Informasi Proyek Sistem Informasi Proyek Sistem Informasi
Berbasis Dekstop Berbasis Web Berbasis Perangkat Bergerak
8 (50 JP) 9 (50 JP) 10 (50 JP)
3
D. Ruang Lingkup Penggunaan Modul
Modul ini disusun dengan empat pembahasan utama (materi pokok). Setiap
materi pokok terdapat beberapa kegiatan pembelajaran untuk mencapai
kompetensi yang telah ditentukan. Setiap kegiatan pembelajaran terdiri dari
tujuan pembelajaran, indikator essential, uraian materi, aktifitas pembelajaran,
latihan/tugas/kasus, rangkuman dan umpan balik. Materi dalam modul ini
mencakup empat topik utama yaitu: 1) Dasar-Dasar Grafika Komputer, 2)
Pemodelan Objek 2 Dimensi , 3) Pemodelan Objek 3 Dimensi dan, 4)Rendering
Kegiatan Belajar 4
Kegiatan Belajar 2 Kegiatan Belajar 6 Kegiatan Belajar 8
Pembuatan Objek 2
OpenGL dan LWJGL Pembuatan Teksture Lighting dan Shading
Dimensi
Modul grafika komputer ini terdiri dari empat topik utama. Peserta diklat dapat
mempalajari sesui dengan urutan topik mulai topik 1 sampai topik 4. Keempat
topik tersebut tidak memiliki ketergantungan secara penuh, sehingga peserta
diklat dapat mempelajari tidak secara berurutan. Akan tetapi untuk masing-
masing topik setiap kegiatan belajar mempunyai keterkaitan secara penuh. Ini
berarti untuk setiap topik materi yang dipelajari harus secara berurutan sesuai
urutan kegiatan pembelajaran.
Untuk setiap kegiatan pembelajaran, uruatan yang harus dilakukan oleh peserta
diklat dalam mempelajari modul ini adalah :
4
1. Membaca tujuan pembelajaran sehingga memahami target atau tujuan
dari kegiatan belajar tersebut.
2. Membaca indikator pencapaian kompetensi sehingga memahami obyek
yang akan dijadikan kriteria pengukuran untuk mencapai tujuan
pembelajaran.
3. Membaca uraian materi pembelajaran sehingga memiliki pengetahuan,
ketrampilan dan sikap terhadap kompetensi yang akan dicapai
4. Melakukan aktifitas pembelajaran dengan urutan atau kasus
permasalahan sesuai dengan contoh.
5. Mengerjakan latihan/soal atau tugas dengan mengisi lembar kerja yang
telah disediakan.
6. Menjawab pertanyaan dalam umpan balik yang akan mengukur tingkat
pencapaian kompetensi melalui penilaian diri.
5
6
7
8
DASAR-DASAR GRAFIKA KOMPUTER
Pengantar Grafika Komputer
A. Tujuan Pembelajaran
Setelah mengikuti kegiatan belajar 1 ini peserta diklat diharapkan dapat :
1. Melalui studi literatur peserta diklat dapat menganalisis komponen-
komponen penting dalam grafika komputer.
2. Melalui diskusi peserta diklat dapat menggambarkan peranan grafika
komputer dalam berbagai bidang.
C. Uraian Materi
9
Format komputer grafis umum termasuk GIF dan JPEG, untuk gambar
tunggal, dan MPEG dan Quicktime, untuk gambar multiframe.
Pada dasarnya desain grafis dibedakan atas dua, yaitu desain bitmap dan
desain vector. Grafis desain bitmap dibentuk dengan raster/pixel/dot/titik/point
koordinat. Pembuatan citra (images) sebagai koleksi dari dots (pixels) yang
kecil, independent dan dapat diatur dalam bentuk baris dan kolom. Raster
grafika juga dikenal sebagai pixel graphics. Hampir semua perangkat output
komputer menggunakan konsep raster seperti CRTs, LCDs, LEDs, dan
plasma screens.
10
macam bentuk grafis, seperti lingkaran, segitiga, bujur sangkar dan poligon.
Dengan demikian , pemakaian grafis vektor akan lebih irit dari segi volume
file, tetapi dari segi pemakaian prosessor akan memakan banyak memori.
Program aplikasi grafis yang berbasis vektor antara lain CorelDraw ,
Macromedia Free hand, Adobe Illustrator dan Micrografx Designer.
11
keseluruhan bentuk, dengan bentuk internal dari objek tersebut.
Penggunaan wireframe bermanfaat bagi designer untuk melihat isi
dari objek tersebut.
Contoh perangkat lunak yang digunakan yaitu AutoCAD, 3D Studio
Max, dan Maya.
2) Grafika Presentasi
Bidang lain yang berhubungan dengan grafika komputer adalah grafik
presentasi yang dapat berupa cetakan, slide, dan transparansi.
Grafik presentasi biasanya digunakan untuk melengkapi laporan
keuangan, sains, data ekonomi, dan lain-lain. Bentuk grafik
presentasi tersebut adalah chart, bar chart, pie chart, dan lain-lain.
3) Computer Art
Metode grafika komputer digunakan dalam aplikasi commercial art
dan fine art. Seniman menggunakan bermacam-macam perangkat
lunak grafik, dan kadang dilengkapi dengan perangkat keras khusus.
Contoh perangkat lunak yang digunakan yaitu Corel Draw, Adobe
Photoshop, Adobe Ilustrator, Macromedia, dan sebagainya.
4) Film
Pada pembuatan film layar lebar, grafika komputer banyak digunakan
untuk menunjang proses pemodelan, visualisasi, dan editing.
Misalnya dalam proses special effect, film animasi.
5) Televisi
Grafika komputer dalam tayangan televisi juga dapat berupa iklan,
tampilan tiap acara, dan lainnya.
6) Video Musik
Produksi video musik tidak terlepas dari grafika komputer,
diantaranya pembuatan promosi, cover atau kemasan video, serta
animasi yang mengiringi setiap lagu. Proses editing video dan audio
dilakukan dengan menggunakan komputer.
7) Game
Berbagai game dapat dijalankan pada komputer PC, video player
dengan monitor TV, dan ada yang menggunakan perangkat keras
12
khusus. Alat input interaktif seperti mouse dan joystick diperlukan
untuk aplikasi game.
8) Pendidikan
Komputer sebagai alat bantu pendidikan (Computer Assisted
Instruction) sudah cukup dikenal.
Aplikasi bidang pengajaran dengan komputer sebagai alat bantunya,
diantaranya:
Drill and Practice (latih dan praktek)
Computer Assisted Instruction (CAI) menggantikan pengajar untuk
memberikan latihan kepada siswa.
Tutorial (penjelasan)
Sistem komputer digunakan untuk menyampaikan materi ajaran.
Simulasi
Digunakan untuk mengkaji permasalahan yang rumit pada bidang
biologi, transportasi, ekonomi, dan lain-lain.
Aplikasi bidang bukan pengajaran dengan alat bantu komputer,
diantaranya :
a. Computer Assisted Testing (Ujian Berbantuan Komputer)
Komputer digunakan untuk sarana ujian.
b. Computer Assisted Guidance (Pengarahan Berbantuan
Komputer)
Komputer digunakan sebagai sarana untuk mencari informasi
yang diperlukan.
c. Computer Managed Instruction
Komputer digunakan untuk merencanakan pelajaran, evaluasi
belajar, serta memantau prestasi siswa.
9) Visualisasi
Ilmuwan, ahli kedokteran, analis bisnis, dan lain-lain sering
menggunakan banyak informasi suatu masalah dalam mempelajari
perilaku proses tertentu. Informasi tersebut berisi ribuan data untuk
memberikan gambaran hasil suatu evaluasi. Data tersebut diproses
sehingga mendapatkan hasil dalam bentuk visual.
10) Image Processing
13
Image processing (pengolahan citra) merupakan teknik untuk
memodifikasi atau menginterpretasi gambar yang ada, seperti foto
dan rangkaian gambar film. Dua macam prinsip pengolahan citra
adalah :
Meningkatkan kualitas gambar.
Memberikan persepsi dari informasi visual, seperti pada robotik.
Untuk melakukan pengolahan citra, pertama-tama membuat digitasi
dari foto atau membuat foto menjadi file image. Selanjutnya metode
digital dapat digunakan untuk memodifikasi gambar sehingga
mendapatkan kualitas yang baik.
11) Graphical User Interface (GUI)
Graphical interface (antarmuka grafik) banyak digunakan dalam
setiap aplikasi. Komponen utamanya adalah window manager,
dimana pengguna dapat mengatur tampilan dari window. Interface
juga menampilkan menu dan icon untuk mempercepat pemilihan
yang dilakukan oleh pengguna.
D. Aktivitas Pembelajaran
Peserta diklat dibagi menjadi beberapa kelompok untuk mendiskusikan materi
tentang grafika komputer dan penerapan dalam berbagai bidang, kemudian
membuat presentasi.
E. Latihan Soal
1. Suatu bidang ilmu yang mempelajari bagaimana membangun grafik
(gambar) baik 2D maupun 3D yang kelihatan nyata menggunakan komputer
adalah …
14
2. Berikut ini adalah implementasi dari grafika komputer, adalah ...
a. Simulators ,CAD (Computer Aided Design) , Architectural visualization
b. Simulators ,CAD (Computer Aided Design) , Artificial Intillegence
c. Simulators , Artificial Intillegence, Architectural visualization
d. CAD (Computer Aided Design) , Architectural visualization,Artificial
Intillegence
F. Rangkuman
Grafika komputer (computer graphics) merupakan salah satu ilmu informatika
yang mempelajari pembuatan dan manipulasi gambar dengan komputer atau
secara digital. Grafis adalah gambar yang tersusun dari koordinat-koordinat.
Dengan demikian sumber gambar yang muncul pada layar monitor komputer
terdiri atas titik-titik yang mempunyai nilai koordinat. Layar Monitor berfungsi
sebagai sumbu koordinat x dan y. Dengan kata lain maka grafika komputer
adalah proses konversi informasi digital ke dalam format visual untuk ditampilkan
pada terminal atau output pada printer. Dalam pembuatan komputer grafis
diperlukan komputer digital untuk menyimpan dan memanipulasi gambar,
tampilan layar, input / output, dan perangkat lunak khusus yang memungkinkan
komputer digunakan untuk menggambar, warna, dan memanipulasi gambar
sehingga dapat disimpan dalam memori.
Pada dasarnya desain grafis dibedakan atas dua, yaitu desain bitmap dan desain
vector. Grafis desain bitmap dibentuk dengan raster/pixel/dot/titik/point koordinat.
Pembuatan citra (images) sebagai koleksi dari dots (pixels) yang kecil,
independent dan dapat diatur dalam bentuk baris dan kolom. Raster grafika juga
dikenal sebagai pixel graphics. Hampir semua perangkat output komputer
menggunakan konsep raster seperti CRTs, LCDs, LEDs, dan plasma screens.
Grafis jenis vektor merupakan perkembangan dari sistem grafis bitmap (digital).
Grafis ini tidak tergantung pada banyaknya pixel penyusunnya dan kondisi
monitor karena tampilan vektor tersusun atas garis-garis. Tampilan akan terlihat
jelas meskipun dilakukan pembesaran (zooming). Penggunaan titik-titik koordinat
dan rumus-rumus tertentu dapat menciptakan bermacam-macam bentuk grafis,
seperti lingkaran, segitiga, bujur sangkar dan poligon. Dengan demikian ,
15
pemakaian grafis vektor akan lebih irit dari segi volume file, tetapi dari segi
pemakaian prosessor akan memakan banyak memori.
Pada saat ini grafika komputer digunakan secara rutin dibidang ilmu
pengetahuan, teknik, kedokteran, bisnis, industri, pemerintahan, seni, hiburan,
pendidikan, periklanan, dan lain sebagainya.
G. Umpan Balik
H. Kunci Jawaban
1. Grafika Komputer
2. a
16
17
18
OpenGL dan LWJGL
A. Tujuan Pembelajaran
C. Uraian Materi
1. OpenGL
OpenGL (Open Graphics Library) adalah sebuah program aplikasi antar
muka yang digunakan untuk mendefinisikan komputer grafis 2D dan 3D.
Program lintas-platform API ini umumnya dianggap ketetapan standar dalam
industri komputer dalam interaksi dengan komputer grafis 2D dan juga telah
menjadi alat yang biasa untuk digunakan dengan grafis 3D. Singkatnya,
OpenGL menghilangkan kebutuhan pemrograman untuk menulis ulang
bagian grafis dari sistem operasi setiap kali sebuah bisnis akan diupgrade ke
versi baru dari sistem. Fungsi dasar dari OpenGL adalah untuk
19
mengeluarkan koleksi perintah khusus atau executable ke sistem operasi.
Dengan demikian, program ini bekerja dengan perangkat keras grafis yang
ada yang berada pada hard drive atau sumber tertentu lainnya. Setiap
perintah dirancang untuk melakukan tindakan tertentu, atau memulai efek
khusus tertentu yang terkait dengan grafis.
OpenGL adalah suatu spefikasi grafik pada level rendah yang menyediakan
fungsi untuk pembuatan grafik dasar termasuk titik, garis, dan lingkaran.
OpenGL digunakan untuk keperluan-keperluan pemrograman grafis.OpenGL
bersifat Open-Source, multi-platform dan multi-language serta digunakan
mendefinisikan suatu objek, baik objek 2 dimensi maupun objek 3 dimensi.
OpenGL juga merupakan suatu antarmuka pemrograman aplikasi
(application programming interface (API) yang tidak tergantung pada piranti
dan platform yang digunakan, sehingga OpenGL dapat berjalan pada sistem
operasi Windows, UNIX dan sistem operasi lainnya.
OpenGL pada awalnya didesain untuk digunakan pada bahasa pemrograman
C/C++, namun dalam perkembangannya OpenGL dapat juga digunakan
dalam bahasa pemrograman yang lain seperti Java, Tcl, Ada, Visual Basic,
Delphi, maupun Fortran. Namun OpenGL di-package secara berbeda-beda
sesuai dengan bahasa pemrograman yang digunakan. Oleh karena itu,
package OpenGL tersebut dapat di-download pada situs
http://www.opengl.org sesuai dengan bahasa pemrograman yang akan
digunakan.
OpenGl melayani dua tujuan :
Untuk menyembunyikan kompleksitas dari interfacing dengan
menggunakan berbagai 3D accelerators dan menggunakan satu
standar API.
Untuk menyembunyikan kemampuan yang berbeda dari hardware
platform yang mendukung implementasi penuh fitur opengl
(menggunakan software emulation jika diperlukan).
LWJGL
Lightweight Java Game Library (LWJGL) merupakan salah satu jenis game
engine yang berjalan dengan dasar bahasa java (open source dan free).
Game engine sendiri merupakan perangkat lunak yang digunakan khusus
20
dalam pembuatan video game. Inti LWJGL adalah untuk menyisipkan
tampilan level yang lebih rendah dan tidak perlu memasukkan kode.
Sintax Perintah OpenGL
Sintaks perintah OpenGL mengikuti aturan penulisan dari library dimana
fungsi tersebut berasal, format penulisan fungsi OpenGL adalah :
<awalan library><perintah><optional jumlah argumen><optional tipe
argumen>
Semua perintah OpenGL menggunakan awalan gl diikuti dengan huruf
kapital pada setiap kata membentuk nama perintah (sebagai contoh
glClearColor). Untuk mendefinisikan konstanta diawali dengan GL_, dengan
menggunakan huruf kapital dan garis bawah untuk memisahkan kata
(seperti GL_POLY_STIPPLE). Terkadang beberapa huruf dan angka
ditambahkan pada akhir perintah (seperti 3f pada glVertex3f). Dalam hal ini
angka 3 menunjukkan berapa banyak argumen yang harus ada pada
perintah tersebut dan akhiran huruf f menunjukkan jenis datanya yaitu
floating. Sebagai contoh pada dua perintah berikut ini :
glVertex3i(1,0,-2);
glVertex3f(1.0, 0.0, -2.0);
adalah sama yaitu meletakkan titik di layar pada koordinat x = 1, y = 0 dan z
= -2, perbedaannya yaitu pada perintah pertama menspesifikasikan titik
dengan tipe data integer 32-bit, sedangkan yang kedua dengan tipe data
single precision floating point.
Beberapa perintah OpenGL menambahkan perintah huruf akhir v yang
menunjukkan bahwa perintah tersebut menggunakan pointer ke
array/vektor. Di bawah ini contoh perbedaannya.
float color_array[]={1.0,0.0,0.0}
glColor3f (1.0,0.0,0.0);
glColor3fv(color_array);
21
D. Aktivitas Pembelajaran
Kegiatan Praktikum 2.1
22
3. Klik Tombol New Library
23
5. Pastikan Library sudah dipilih. Sekarang pilih tab Classpath untuk
menambahkan library terbaru dan kemudian klik tombol Add
JAR/Folder.
24
8. Pilih Tab Javadoc dan klik Add JAR/Folder. Kemudian pilih file
Lwjgl-docs-X.X.zip
25
3. Pilih LWJGL > Klik Add Library.
26
Kemudian Pilih Run, dan tambahkan script berikut ke dalam kolom
VM Options:
-Djava.library.path="Directory\lwjgl-2.9.1\native\windows"
5. Selesai.
27
Kegiatan Praktikum 2.3
28
glColor3d(1, 0, 0);
draw();
glFlush();
}
public void create() throws LWJGLException {
Display.setDisplayMode(new DisplayMode(800, 600));
Display.setFullscreen(false);
Display.setTitle("GAMBAR Primitives-Geometric :
POLYGON");
Display.create();
initGL();
resizeGL();
}
void initGL() {
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
public void resizeGL() {
//2D Scene
glViewport(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, DISPLAY_WIDTH, 0.0f, DISPLAY_HEIGHT);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
}
public void run() {
while (!Display.isCloseRequested() &&
!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
if (Display.isVisible()) {
update();
render();
} else {
if (Display.isDirty()) {
29
render();
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
Display.update();
Display.sync(60);
}
}
Logger.getLogger(Belajar1.class.getName()).log(Level.SEVERE,
null, ex);
}
}
}
30
E. Latihan / Tugas
Latihan
F. Rangkuman
OpenGL (Open Graphics Library) adalah sebuah program aplikasi interface yang
digunakan untuk mendefinisikan komputer grafis 2D dan 3D. Program lintas-
platform API ini umumnya dianggap ketetapan standar dalam industri komputer
dalam interaksi dengan komputer grafis 2D dan juga telah menjadi alat yang
biasa untuk digunakan dengan grafis 3D.OpenGL adalah suatu spefikasi grafik
yang low-level yang menyediakan fungsi untuk pembuatan grafik primitif
termasuk titik, garis, dan lingkaran. OpenGL digunakan untuk keperluan-
keperluan pemrograman grfis.OpenGL bersifat Open-Source, multi-platform dan
multi-language serta digunakan mendefinisikan suatu objek, baik objek 2 dimensi
maupun objek 3 dimensi.
Lightweight Java Game Library (LWJGL) merupakan salah satu jenis game
engine yang berjalan dengan dasar bahasa java (open source dan free). Game
engine sendiri merupakan perangkat lunak yang digunakan khusus dalam
pembuatan video game.
Sintaks perintah OpenGL mengikuti aturan penulisan dari library dimana fungsi
tersebut berasal, format penulisan fungsi OpenGL adalah :
<awalan library><perintah><optional jumlah argumen><optional tipe
argumen>
Semua perintah OpenGL menggunakan awalan gl diikuti dengan huruf kapital
pada setiap kata membentuk nama perintah (sebagai contoh glClearColor).
31
G. Umpan Balik
IPK Hasil Yang Dicapai Rencana Tindak Lanjut
Peserta diklat mampu
menggunakan fungsi-fungsi
dasar OpenGL untuk membuat
objek dan berapa proses
pencapaian kompetensinya
Peserta diklat mampu
memodifikasikan fungsi-fungsi
dasar OpenGL untuk membuat
objek dan berapa besar proses
pencapaian kompetensinya
Peserta diklat mampu
menerapkan LWJGL ke dalam
IDE NetBeans dan berapa
besar proses pencapaian
kompetensinya
Peserta diklat mampu membuat
kode program dengan perintah-
perintah OpenGL dan berapa
besar proses pencapaian
kompetensinya
H. Kunci Jawaban
32
33
34
PEMODELAN OBJEK 2 DIMENSI
Primitif Objek
A. Tujuan Pembelajaran
C. Uraian Materi
1. Primitif Objek
Objek primitif merupakan bentuk geometri sederhana seperti titik (points), garis
(lines) dan bangunan dua dimensi. Dalam grafika computer, representasi citra
menggunakan primitive grafik dasar memudahkan untur dirender atau digambar
pada layar monitor sebagaimana penggunaan persamaan geometri sederhana.
Contoh objek primitif grafika dasar antara lain : titik, garis, kurva, fill area dan
text. Objek kompleks dapat dibuat dengan menggunakan kombinasi dari objek
primitif ini. Misalkan, Poligaris atau yang dapat didefinisikan sebagai urutan garis
lurus yang saling terhubung. Secara umum algoritma grafis memiliki persamaan
35
tujuan yaitu bagaimana menampilkan hasil citra yang diinginkan berdasarkan
koordinat yang telah ditentukan.
36
bila tidak maka step = |Δx|.
5) Hitung penambahan koordinat pixel yaitu x_increment = Δx / step dan
y_increment = Δy / step.
6) Koordinat selanjutnya (x+x_incerement, y+y_increment).
7) Posisi pixel pada layer ditentukan dengan pembulatan nilai koordinasi
tersebut.
8) Ulangi step 6 dan 7 untuk menentukan posisi pixel selanjutnya, sampai x=
x1 dan y = y1
Contoh:
Untuk menggambarkan algoritma DDA dalam pembentukan suatu garis yang
menghubungkan titik (5,5) dan (10,9), pertama-tama ditentukan dx dan dy,
kemudian dicari step untuk mendapatkan x_increment dan y_increment.
Δx = x1 – x 0 = 10-5 = 5
Δy = y1 – y0 = 9 -5 = 4
selanjutnya hitung dan bandingkan nilai absolutnya.
|Δx| = 5
|Δy| = 4
karena |Δx| > |Δy|, maka step = |Δx| = 5, maka diperoleh :
x_inc = 5/5 = 1
y_inc = 4/5 = 0.8
Tabel 2 Data algoritma DDA
K X Y Round(x), round(y)
(5,5)
0 6 5.8 (6,6)
1 7 6.6 (7,7)
2 8 7.4 (8,7)
3 9 8.2 (9,8)
4 10 9 (10,9)
10
9
8
7
37
6
5
5 6 7 8 9 10
Algoritma Bressenham
Prosedur untuk menggambar kembali garis dengan membulatkan nilai x atau y
ke bilangan integer membutuhkan waktu, serta variable x,y dan m merupakan
bilangan real karena kemiringan merupakan nilai pecahan. Bressenham
mengembangkan algoritma klasik yang lebih menarik, karena hanya
menggunakan perhitungan matematika dengan bilangan integer. Dengan
demikian tidak perlu membulatkan nilai posisi setiap pixel setiap waktu.
Algoritma garis Bressenhem disebut juga midpoint line algorithm adalah
algoritma konversi penambahan nilai integer yang juga dapat diadaptasi untuk
menggambar sebuah lingkaran.
Langkah-langkah untuk membentuk garis menurut algoritma ini adalah:
1) Tentukan dua titik yang akan dihubungkan dalam pembentukan garis.
2) Tetukan salah satu titik disebelah kiri sebagai titik awal (x0, y0) dan titik
lainnya sebagai titik akhir (x1, y1 ).
3) Hitung Δx, Δy, Δ2x, dan 2Δy – 2Δx.
4) Hitung parameter p0 = 2Δy – Δx.
5) Untuk setiap xk sepanjang jalur garis, dimulai dengan k = 0
bila pk <0 maka titik selanjutnya (xk+1, yk) dan pk+1 = pk +2Δy
bila tidak maka titik selanjutnya adalah (xk+1, yk+1) dan pk+1=pk+2Δ-y2Δx.
6) Ulangi langkah nomor 5 untuk menentukan posisi pixel selanjutnya, sampai
x=xn.
D. Aktivitas Pembelajaran
Membuat Titik
Create_Point.java
38
public class Create_Point {
39
if (Display.isVisible()) {
render();
} else {
if (Display.isDirty()) {
render();
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
Display.update();
Display.sync(60);
}
}
private void destroy() {
Mouse.destroy();
Keyboard.destroy();
Display.destroy();
}
private void initGL() {
//2D Initialization
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
private void resizeGL() {
//2D Scene
glViewport(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, DISPLAY_WIDTH, 0.0f, DISPLAY_HEIGHT);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
}
}
Keluaran Program
40
Kegiatan Praktikum 3.2
Membuat Garis
Create_Line.java
41
} finally {
if (main != null) {
main.destroy();
}
}
}
42
E. Latihan Soal
F. Rangkuman
Objek primitif merupakan bentuk geometri sederhana seperti titik (points), garis
(lines) dan bangunan dua dimensi. Dalam grafika computer, representasi citra
menggunakan primitive grafik dasar memudahkan untur dirender atau digambar
pada layar monitor sebagaimana penggunaan persamaan geometri sederhana.
Contoh objek primitif grafika dasar antara lain : titik, garis, kurva, fill area dan
text. Objek kompleks dapat dibuat dengan menggunakan kombinasi dari objek
primitif ini. Pembentukan titik dilakukan dengan mengkonversi suatu posisi titik
koordinat dengan program aplikasi ke dalam suatu operasi tertentu
menggunakan output. Garis dibuat dengan menentukan posisi titik diantara titik
awal dan akhir dari suatu garis. Untuk menggambar titik (point) digunakan
perintah point(x,y) dimana nilai x dan y adalah koordinat pada layar.
43
Untuk menggambar titik (point) digunakan perintah point(x,y) dimana nilai x dan
y adalah koordinat pada layar. Sedangkan untuk membuat garis digunakan
perintah lines(x1,y1,x2,y2).
Terdapat dua algoritma pembentukan titik dan garis yaitu Algoritma DDA (Digital
Differential Analyzer) dan Algoritma Bressenham
G. Umpan Balik
H. Kunci Jawaban
PrimitiveGaris.java
import java.util.logging.Level;
44
import java.util.logging.Logger;
import static komgraf01.KomGraf01.DISPLAY_HEIGHT;
import static komgraf01.KomGraf01.DISPLAY_WIDTH;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.gluOrtho2D;
45
//OpenGL
initGL();
resizeGL();
}
void initGL() {
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
public void resizeGL() {
//2D Scene
glViewport(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, DISPLAY_WIDTH, 0.0f, DISPLAY_HEIGHT);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
46
}
}
Display.update();
Display.sync(60);
}
}
private void update() {
//
}
Logger.getLogger(PrimitiveGaris.class.getName()).log(Level
.SEVERE, null, ex);
}
47
48
49
50
Pemodelan Objek 2 Dimensi
A. Tujuan Pembelajaran
C. Uraian Materi
Grafika komputer merupakan bidang yang menarik minat banyak orang.
Salah satu sub bagian dari grafika komputer adalah pemodelan objek (object
modelling). Dalam pemodelan objek dua dimensi (2D), berbagai objek dapat
dimodelkan menurut kondisi tertentu. Objek yang dimodelkan itu perlu
dimodifikasi. Pemodifikasian objek ini dapat dilakukan dengan melakukan
berbagai operasi fungsi atau operasi transformasi geometri. Transformasi yang
dibuat dapat berupa transformasi dasar ataupun gabungan dari berbagai
transformasi geometri. Contoh transformasi geometri adalah translasi,
penskalaan, putaran (rotasi), potongan dan gabungan. Transformasi ini dikenal
51
dengan istilah transformasi affine. Pada dasarnya proses transformasi ini
adalah proses memindahkan objek tanpa merusak bentuk dari objek itu sendiri.
1. Definisi Objek Grafik 2 Dimensi
Pada sub topik ini peserta akan mempelajari objek grafik 2 dimensi dan
penerapannya dalam aplikasi sederhana.
Titik 2D
Titik 2D mempunyai 2 nilai, yaitu x dan y yang menyatakan jarak horizontal
dan vertikal dari titik pusat sumbu koordinat (0,0).
Polyline
Polyline adalah suatu fungsi yang digunakan untuk menggambarkan objek
2D dimana setiap titik pada objek mulai titik ke 0, 1, 2,3,..., n dihubungkan
dengan garis lurus sehingga membentuk kurva terbuka.
52
Translasi adalah transformasi dengan bentuk yang tetap, memindahkan
objek apa adanya. Setiap titik dari objek akan ditranslasikan dengan besaran
yang sama.Dalam operasi translasi, setiap titik pada suatu entitas yang
ditranslasi bergerak dengan jarak yang sama. Pergerakan tersebut dapat
berlaku dalam arah sumbu X saja, atau dalam arah sumbu Y saja atau
keduanya.
53
glRotatef (angle, x, y, z) digunakan untuk memutar suatu bidang pada
sudut tertentu (angle).
54
D. Aktivitas Pembelajaran
Translasi
Membuat persegi panjang dengan warna merah. Kemudian hasil
translasi(geser) sebesar 90 terhadap sumbu Y adalah persegi panjang
dengan warna kuning dan ditranslasi(geser) sebesar 180 terhadap sumbu X
dan 90 terhadap sumbu Y adalah persegi panjang warna biru.
Translasi.java
import java.util.logging.Level;
import java.util.logging.Logger;
import static komgraf01.KomGraf01.DISPLAY_HEIGHT;
import static komgraf01.KomGraf01.DISPLAY_WIDTH;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.gluOrtho2D;
55
glColor3d(1, 0, 0);
buatKotak();
glTranslated(0,90, 0);
glColor3f(1, 1, 0);
buatKotak();
glTranslated(90,180, 0);
glColor3f(0, 0, 1);
buatKotak();
glFlush();
}
public void buatKotak() {
//membuat kotak
glBegin(GL_POLYGON);
glVertex2f(250, 120); //titik kiri bawah
glVertex2f(450, 120); //titik kanan bawah
glVertex2f(450, 200); //titik kanan atas
glVertex2f(250, 200); //titik kiri atas
glEnd();
}
public void create() throws LWJGLException {
Display.setDisplayMode(new DisplayMode(800, 600));
Display.setFullscreen(false);
Display.setTitle("Proses Rotasi");
Display.create();
initGL();
resizeGL();
}
void initGL() {
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
56
} catch (InterruptedException ex) {
}
}
Display.update();
Display.sync(60);
}
}
private void update() {
}
public void destroy() {
Mouse.destroy();
Keyboard.destroy();
Display.destroy();
}
public static void main(String[] args) {
Rotasi b1 = new Rotasi();
try {
b1.create();
b1.run();
} catch (LWJGLException ex) {
Logger.getLogger(Rotasi.class.getName()).log(Level.SEVERE,
null, ex);
}
}
}
Rotasi
Membuat persegi panjang dengan warna merah. Kemudian hasil
rotasi(diputar) sebesar 15 derajat adalah persegi panjang dengan warna
kuning dan di rotasi(diputar) kembali sebesar -45 derajat adalah persegi
panjang warna biru.
57
Rotasi.java
import java.util.logging.Level;
import java.util.logging.Logger;
import static komgraf01.KomGraf01.DISPLAY_HEIGHT;
import static komgraf01.KomGraf01.DISPLAY_WIDTH;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.gluOrtho2D;
58
glVertex2f(300, 300); //titik kiri bawah
glVertex2f(500, 300); //titik kanan bawah
glVertex2f(500, 360); //titik kanan atas
glVertex2f(300, 360); //titik kiri atas
glEnd();
}
public void create() throws LWJGLException {
Display.setDisplayMode(new DisplayMode(800, 600));
Display.setFullscreen(false);
Display.setTitle("Proses Rotasi");
Display.create();
//OpenGL
initGL();
resizeGL();
}
void initGL() {
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
public void resizeGL() {
glViewport(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, DISPLAY_WIDTH, 0.0f, DISPLAY_HEIGHT);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
}
public void run() {
while (!Display.isCloseRequested() &&
!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
if (Display.isVisible()) {
update();
render();
} else {
if (Display.isDirty()) {
render();
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
Display.update();
Display.sync(60);
}
}
private void update() {
}
public void destroy() {
Mouse.destroy();
Keyboard.destroy();
Display.destroy();
59
}
public static void main(String[] args) {
Rotasi b1 = new Rotasi();
try {
b1.create();
b1.run();
} catch (LWJGLException ex) {
Logger.getLogger(Rotasi.class.getName()).log(Level.SEVERE,
null, ex);
}
}
}
Skala
Membuat persegi panjang dengan warna merah. Kemudian hasil di skala
sebesar x = 2, dan y=2 adalah menjadi persegi panjang dengan warna biru.
Skala.java
import java.util.logging.Level;
import java.util.logging.Logger;
import static komgraf01.KomGraf01.DISPLAY_HEIGHT;
import static komgraf01.KomGraf01.DISPLAY_WIDTH;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.opengl.GL11.*;
60
import static org.lwjgl.util.glu.GLU.gluOrtho2D;
glScaled(2, 2, 0);
glColor3d(0, 0, 1);
buatKotak();
glFlush();
}
public void buatKotak() {
//membuat kotak
glBegin(GL_POLYGON);
glVertex2f(250, 120); //titik kiri bawah
glVertex2f(450, 120); //titik kanan bawah
glVertex2f(450, 200); //titik kanan atas
glVertex2f(250, 200); //titik kiri atas
glEnd();
}
public void create() throws LWJGLException {
Display.setDisplayMode(new DisplayMode(800, 600));
Display.setFullscreen(false);
Display.setTitle("Proses SKALA");
Display.create();
//OpenGL
initGL();
resizeGL();
}
void initGL() {
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
public void resizeGL() {
glViewport(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, DISPLAY_WIDTH, 0.0f, DISPLAY_HEIGHT);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
}
public void run() {
while (!Display.isCloseRequested() &&
61
!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
if (Display.isVisible()) {
update();
render();
} else {
if (Display.isDirty()) {
render();
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
Display.update();
Display.sync(60);
}
}
private void update() {
}
public void destroy() {
Mouse.destroy();
Keyboard.destroy();
Display.destroy();
}
public static void main(String[] args) {
Skala b1 = new Skala();
try {
b1.create();
b1.run();
} catch (LWJGLException ex) {
Logger.getLogger(Skala.class.getName()).log(Level.SEVERE,
null, ex);
}
}
}
E. Latihan Soal
62
F. Rangkuman
G. Umpan Balik
63
objek 2 dimensi melalui proses
translasi, penskalaan, dan rotasi
dan berapa besar proses
pencapaian kompetensinya
H. Kunci Jawaban
Jawaban No 1:
Tugas2D.java
import java.util.logging.Level;
import java.util.logging.Logger;
import static komgraf01.KomGraf01.DISPLAY_HEIGHT;
import static komgraf01.KomGraf01.DISPLAY_WIDTH;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.gluOrtho2D;
64
buatSegitiga();
glFlush();
}
public void buatSegitiga() {
//membuat triangle
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(width / 4.0f, height * 3.0f / 4.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(width / 4.0f, height / 4.0f);
// Set color to violet
glColor3f(1.0f, 0.0f, 1.0f);
glVertex2f(width * 3.0f / 4.0f, height / 4.0f);
// Set color to blue
glColor3f(0.0f, 0.0f, 1.0f);
// Top triangle
glVertex2f(width / 4.0f, height * 3.0f / 4.0f);
glVertex2f(width * 3.0f / 4.0f, height * 3.0f / 4.0f);
glVertex2f(width * 3.0f / 4.0f, height / 4.0f);
glEnd();
}
public void create() throws LWJGLException {
Display.setDisplayMode(new DisplayMode(600, 600));
Display.setFullscreen(false);
Display.setTitle("Tugas 2 Dimensi");
Display.create();
//OpenGL
initGL();
resizeGL();
}
void initGL() {
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
public void resizeGL() {
glViewport(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
65
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, DISPLAY_WIDTH, 0.0f, DISPLAY_HEIGHT);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
}
public void run() {
while (!Display.isCloseRequested() &&
!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
if (Display.isVisible()) {
update();
render();
} else {
if (Display.isDirty()) {
render();
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
Display.update();
Display.sync(60);
}
}
private void update() {
}
public void destroy() {
Mouse.destroy();
Keyboard.destroy();
Display.destroy();
}
public static void main(String[] args) {
Tugas2D b1 = new Tugas2D();
try {
66
b1.create();
b1.run();
} catch (LWJGLException ex) {
Logger.getLogger(Tugas2D.class.getName()).log(Level.SEVERE,
null, ex);
}
}
}
67
68
69
70
PEMODELAN OBJEK 3 DIMENSI
Pembuatan Objek 3 Dimensi
A. Tujuan Pembelajaran
C. Uraian Materi
71
sistem koordinat kartesian 3 dimensi.Dalam sistem koordinat 3 dimensi
terdapat satu sumbu lain selain sumbu x dan sumbu y, yaitu sumbu z yang
arahnya tegak lurus terhadap sumbu x dan sumbu y. Hadirnya sumbu z
menyebabkan sistem koordinat ini menjadi lebih hidup karena memunculkan
efek jauh dekat. Untuk lebih jelasnya, lihat pada gambar di bawah ini :
Gambar 6 Koordinat
Gambar 7 Surface
Permukaan objek atau surface dapat dibuat dari rangkaian Polygon. Polygon
adalah bentuk yang disusun dari serangkaian garis yang terhubung satu
dengan yang lain dan berbentuk kurva tertutup sehingga membentuk
sebuah objek gambar. Titik sudut dari Polygon disebut vertex
sedangkan garis penyusun Polygon disebut edge.
72
Gambar 8 Vertex dan Edge
D. Aktivitas Pembelajaran
Pembuatan kode program untuk pembuatan objek 3 dimensi dirancang dengan
melibatkan beberapa file java untuk memudahkan dalam pengaturan dan operasi
transformasi geometri.
Ketikkan script program java berikut untuk mendapatkan keluaran 3 dimensi
yang diharapkan.
73
Buat laporan berdasarkan script program dengan menjelaskan fungsi-fungsi dari
masing-masing perintah dan argument yang terdapat dalam script yang
dibutuhkan untuk membangun objek 3 dimensi sesuai keluaran yang tampak.
74
lwjgl.OpenGL
CGApplication
PrimitiveDrawing3D
-x : int
-y : int
-z : int
+glTriangle() : void
+main() : void
CfgApplication.java
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import java.awt.Font;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
75
createWindow();
init();
while (!Display.isCloseRequested()
&& !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
{
render();
Display.update();
}
deinit();
Display.destroy();
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
public abstract void render();
public abstract void deinit();
private void createWindow() throws LWJGLException {
Display.setTitle(windowTitle);
Display.setFullscreen(fullscreen);
Display.setVSyncEnabled(vsync);
DisplayMode displayMode = null;
DisplayMode d[] = Display.getAvailableDisplayModes();
for (int i = 0; i < d.length; i++) {
if (d[i].getWidth() == width && d[i].getHeight() ==
height && d[i].getBitsPerPixel() == 32) {
displayMode = d[i];
break;
}
}
Display.setDisplayMode(displayMode);
Display.create();
}
private void setOrthoMode() {
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, width, height, 0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
}
private void unsetOrthoMode() {
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
public abstract void init();
}
PrimitiveDrawing3D.java
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import org.lwjgl.input.Keyboard;
76
import setting.CGApplication;
if (wireframe) {
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
} else {
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
glBegin(GL_TRIANGLES);
// 4-side of pyramid
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-2, -2, -10);
glVertex3f(2, -2, -10);
glVertex3f(0, 4, -12);
77
glVertex3f(-2, -2, -10);
glVertex3f(-2, -2, -14);
glVertex3f(0, 4, -12);
// Bottom of pyramid
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-2, -2, -10);
glVertex3f(2, -2, -10);
glVertex3f(-2, -2, -14);
E. Latihan Soal
1. Untuk menggambarkan translasi suatu objek berupa segitiga dengan
koordinat A(3,4) B(2,1) dan C(4,1) dengan tx,ty(2,5), tentukan koordinat yang
barunya ?
78
2. Untuk menggambarkan skala suatu objek berupa segempat dengan
koordinat A(5,2) B(2,2) C(2,4) dan D(5,4) dengan skala faktor (1,2) tentukan
koordinat yang barunya ?
F. Rangkuman
Pembeda objek 2 dimensi dan 3 dimensi adalah kedalaman. Kedalaman
didefinisikan sebagai jarak antara viewer terhadap benda yang dilihat. Ini
berarti berbeda dengan objek 2 dimensi yang hanya menggunakan 2
ukuran, yaitu panjang dan lebar, maka objek 3 dimensi menggunakan 3
ukuran, yaitu panjang, lebar dan kedalaman. Secara geometri ketiga ukuran
tersebut disimbolkan dengan sumbu x, y, dan z.
Sebuah benda tiga dimensi dapat disusun dengan menghubungkan sejumlah
vertex. Kumpulan vertex yang saling terhubung tersebut disebut sebagai
wireframe atau kerangka, sedangkan benda yang disusun dari kumpulan titik
dan permukaan tersebut disebut sebagai mesh.
Transformasi pada dunia 3 dimensi, pada dasarnya sama dengan transformasi
pada 2 dimensi, hanya pada 3 dimensi kita juga memperhitungkan sumbu
79
Z. Sama seperti pada 2 dimensi, ada tiga transformasi dasar yang dapat
dilakukan yaitu translasi, penskalaan, rotasi. Perbedaannya adalah pada
objek 3 dimensi proses transformasinya dilakukan dengan
mempertimbangkan koordinat yang merupakan besarnya kedalaman dari
objek.
G. Umpan Balik
H. Kunci Jawaban
Jawaban no 1
A = (3,4)
B = (2,1)
C = (2,5)
Vektor (V) = (2,5)
Rumus : x’ = x + tx
ta y’ = y + ty
80
A = (3,4) V = (2,5)
X’ = x + tx
=3+2=5
Y’ = y + ty
=4+5=9
A’ = (5,9)
B = (2,1) V = (2,5)
X’ = x + tx
=2+2=4
Y’ = y + ty
=1+5=6
B’ = (4,6) Dengan demikian hasil translasi
segitiga dengan koordinat
C = (4,1) V = (2,5)
X’ = x + tx A’(5,9) B’(4,6) C’(6,6). Segitiga
= 4+2=6
yang baru sama bentuknya dengan
Y’ = y + ty
=1+5=6 segitiga yang lama. Berikut gambar
C’ = (6,6)
translasi setelah perhitungan
Jawaban no 2
A = (5,2)
B = (2,2)
C = (2,4)
D = (5,4)
Skala faktor = (1,2)
Rumus: x’ = x . sx
y’ = y . sy
81
Y’ = Y. Sy Y’ = Y. Sy
=2.2=4 =4.2=8
B’ = (2,4) D’ = (5,8)
82
83
84
embuatan Teksture
A. Tujuan Pembelajaran
C. Uraian Materi
1. Pengantar Texture
Pemetaan Tekstur menurut Chua Hock-Chuan (2012) didefinisikan sebagai
berikut : “Pemetaan Tekstur adalah salah satu langkah pengembangan pertama
dalam membuat gambar benda tiga dimensi yang lebih menarik dan lebih
kompleks.”
Secara umum, pemetaan tekstur adalah proses “melukis” sebuah gambar ke
permukaan dalam sebuah model. Gambar yang telah diberi texture itu bisa
menjadi sangat kompleks – tetapi proses pemetaan teksture pada gambar
kompleks persis sama dengan proses pemetaan teksture pada gambar
sederhana. Penggunaan pemetaan tekstur pada bentuk yang cukup sederhana
dapat membuat objek yang sederhana menjadi lebih realistis. Misalnya, dinding
planar yang diberi tekstur batu dan dipetakan ke model untuk gambar yang
sangat meyakinkan dari tiga-dimensi dinding batu (Contohnya, game check out
3D merupakan contoh permainan komputer yang menggunakan texture
mapping).
85
Gambar 9 Penggunaan teksture dalam game check out 3D
Dengan memanfaatkan proses pemetaan tekstur memungkinkan kita untuk
memberikan fitur tekstur yang ada pada aplikasi grafika computer pada
permukaan gambar yang kita pilih dan kemudian memungkinkan kita melihat
hasil dari perspektif yang berbeda. Gambar dengan resolusi yang lebih tinggi
akan menghasilkan hasil yang lebih baik bila dilihat dari jarak kecil (karena
daerah permukaan yang dilihat tidak berubah, gambar resolusi tinggi
menyediakan lebih banyak data untuk pemetaan pada model tersebut). Untuk
melihat contoh penurunan kualitas gambar, dapat dilihat dalam berbagai contoh
permainan 3D terutama dengan mengamati bagian datar yang memiliki
texturenya untuk mendapatkan efek realistis nyata (dengan asumsi tidak memiliki
kartu video/VGA yang memiliki texture mapping pada hardware).
2. Konsep Texture mapping
Texturing merupakan proses mewarnai, memberi tekstur, atau memberi efek
material pada sebuah model 3D. Texture mapping adalah teknik shading untuk
pengolahan gambar dengan memetakan sebuah fungsi pada permukaan tiga
dimensi dalam scene. Texture mapping merupakan teknik pemetaan sebuah
tekstur pada pola gambar wireframe, dimana wireframe yang telah dibuat akan
ditampilkan memiliki kulit luar seperti tekstur yang diinginkan. Fungsi yang
dipetakan mencakup satu dimensi, dua dimensi, dan tiga dimensi dan dapat
digambarkan sebagai array atau fungsi matematika atau gambar. Beberapa
contoh teknik dalam texture mapping adalah sebagai berikut :
Bump mapping umumnya digunakan untuk memperjelas karakteristik
permukaan yang bergelombang. Bump mapping merupakan suatu proses
86
dimana tekstur diaplikasikan pada suatu permukaan dalam sebuah program
grafis komputer tiga dimensi (3D) untuk membuat detail yang lebih baik pada
permukaan tersebut. Bump map biasanya digunakan untuk menambahkan
detail pada suatu permukaan, seperti benjolan, bubungan, goresan dan detail
lainnya yang mempengaruhi kemulusan suatu permukaan. Penggunaan
pemetaan (mapping) ini memungkinkan objek yang dibuat oleh program
komputer grafis biasanya dibentuk melalui penggunaan tardisional bump
map, normal, atau parallax map.
Transparency mapping untuk mengatur intensitas cahaya permukaan
tembus pandang. Pemetaan Transparansi adalah metode lain
menggunakan Bitmap untuk membuat bahan. Perbedaannya adalah
metode ini adalah menggunakan alpha channel untuk menyingkirkan
bagian yang tidak diinginkan dari Bitmap, hanya menyimpan bagian yang
tertutup oleh alpha channel. Proses ini disebut masking.
Specularity mapping untuk mengubah kehalusan permukaan
Illumination maaping untuk memodelkan distribusi cahaya yang datang
dari berbagai arah
Geometrical Mapping adalah salah satu bagian penting dari texture
mapping. Geometrical mapping secara keseluruhan ditentukan dengan
dengan transformasi tiga dimensi terhadap kamera, Transformasi model
yang menggambarkan geometri scene dan pemberian parameter pada
permukaan dengan tujuan memetakan tekstur ke permukaan.
87
3. Jenis - Jenis Texture pada OpenGl
GL_TEXTURE_1D : Gambar pada texture ini semuanya 1
dimensi.Mempunyai lebar tetapi tidak memiliki tinggi atau kedalaman
GL_TEXTURE_2D : Gambar pada texture ini semuanya 2
dimensi.Mempunyai lebar dan tinggi tetapi tidak memiliki kedalaman
GL_TEXTURE_3D : Gambar pada texture ini semuanya 3
dimensi.Mempunyai lebar, tinggi dan kedalaman.
GL_TEXTURE_RECTANGLE : Gambar dalam teksture ini 2 dimensi
(hanya satu gambar,tidak memiliki multimapping).Koordinat teksture
digunakan untuk teksture yang tidak dengan titik yang sebenarnya.
GL_TEXTURE_BUFFER: Gambar dalam teksture ini 1 dimensi (hanya
satu gambar,tidak memiliki multimapping).Penyimpanan untuk data ini
dating dari sebuah buffer object.
GL_TEXTURE_CUBE_MAP : Terdapat 6 sisi dari gambar 2D ,dan
semua memiliki ukuran yang sama
GL_TEXTURE_1D_ARRAY : Gambar di teksture ini semuanya 1
dimensi.Bagaimanapun terdiri dari banyak set dari 1 gambar dimensi,
semuanya dengan satu teksture. Panjang array adalah bagian dari
ukuran teksture
GL_TEXTURE_2D_ARRAY : Gambar di teksture ini semuanya 2
dimensi.Bagaimanapun terdiri dari banyak set dari 2 gambar dimensi,
semuanya dengan satu teksture. Panjang array adalah bagian dari
ukuran teksture.
GL_TEXTURE_CUBE_MAP_ARRAY : Gambar di teksture ini semuanya
peta kubus. Terdiri dari banyak set peta kubus,semuanya dengan satu
teksture.Panjang array * 6 (angka dari sisi kubus) adalah bagian dari
ukuran teksture
GL_TEXTURE_2D_MULTISAMPLE : Gambar di teksture ini 2 dimensi
(hanya satu gambar,tidak ada multimapping).Kebanyakan pixel di gambar
ini terdiri dari banyak contoh di dalamnya hanya satu nilai
GL_TEXTURE_2D_MULTISAMPLE_ARRAY : Kombinasi 2D array dan
jenis 2D multisample.tidak ada multimapping
88
D. Aktivitas Pembelajaran
Keluaran Program
89
lwjgl.OpenGL
CGApplication
Texture
-width : int
-height : int
+getWidth() : int
+getHight() : int
TextureMappingTransformasi
-Camera : CGApplication = cmr
-Texture : CGApplication = textr
+loadImage() : void
+main() : void
Texture.java
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import java.awt.Font;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
90
createWindow();
init();
while (!Display.isCloseRequested()
&& !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
{
render();
Display.update();
}
deinit();
Display.destroy();
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
public abstract void render();
public abstract void deinit();
private void createWindow() throws LWJGLException {
Display.setTitle(windowTitle);
Display.setFullscreen(fullscreen);
Display.setVSyncEnabled(vsync);
DisplayMode displayMode = null;
DisplayMode d[] = Display.getAvailableDisplayModes();
for (int i = 0; i < d.length; i++) {
if (d[i].getWidth() == width && d[i].getHeight() ==
height && d[i].getBitsPerPixel() == 32) {
displayMode = d[i];
break;
}
}
Display.setDisplayMode(displayMode);
Display.create();
}
private void setOrthoMode() {
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, width, height, 0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
}
private void unsetOrthoMode() {
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
public abstract void init();
}
GCApplication.java
import java.awt.Color;
import java.awt.Graphics;
91
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.IOException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import org.newdawn.slick.util.ResourceLoader;
DataBuffer.TYPE_BYTE,texWidth,texHeight,3,null);
texImage= new BufferedImage(glColorModel,
raster, false,new Hashtable<String, Object>());
92
}
AffineTransform tx =
AffineTransform.getScaleInstance(1, -1);
tx.translate(0, -bufferedImage.getHeight(null));
AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
bufferedImage = op.filter(bufferedImage, null);
Graphics g = texImage.getGraphics();
g.setColor(new Color(0f, 0f, 0f, 0f));
g.fillRect(0, 0, texWidth, texHeight);
g.drawImage(bufferedImage, 0, 0, null);
this.width = texWidth;
this.height = texHeight;
byte[] data=((DataBufferByte)
texImage.getRaster().getDataBuffer()).getData();
imageBuffer = ByteBuffer.allocateDirect(data.length);
imageBuffer.order(ByteOrder.nativeOrder());
imageBuffer.put(data, 0, data.length);
imageBuffer.flip();
return imageBuffer;
}
public boolean load(String ref) {
URL url = ResourceLoader.getResource(ref);
if (url == null) {
return false;
}
try {
BufferedImage bufferedImage =
ImageIO.read(url);
imageData = convertImageData(bufferedImage);
} catch (IOException e) {
return false;
}
return true;
}
public ByteBuffer getImageData() {
return imageData;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
}
TextureMappingTranformasi.java
import org.lwjgl.BufferUtils;
import setting.CGApplication;
import setting.Texture;
93
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
public class TextureMappingTransformasi extends CGApplication {
private Texture m_texture;
private int m_texID;
private float angle;
@Override
public void init() {
// Generate ID m_texID
IntBuffer textureIDBuffer =
BufferUtils.createIntBuffer(1);
glGenTextures(textureIDBuffer);
m_texID = textureIDBuffer.get(0);
// Activate texture m_texID
glBindTexture(GL_TEXTURE_2D, m_texID);
// Copy image data into texture memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
m_texture.getWidth(),m_texture.getHeight(), 0,
GL_RGBA, GL_UNSIGNED_BYTE,m_texture.getImageData());
@Override
public void update(int delta) {
angle += 0.05f;
}
94
}
@Override
public void render() {
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (width) / (height), 1.0f,
100.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Transformasi
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Zoom-out
glTranslatef(0.0f, 0.0f, -7.0f);
// Rotasi
glRotatef(angle, 0, 1, 0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Texturing
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_texID);
drawTexturedQuads();
glRotatef(90, 0, 1, 0);
drawTexturedQuads();
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
renderText();
}
private void renderText() {
drawString(0, height –
getDefaultFont().getLineHeight(),"Tekxture dengan
Transformasi.");
}
public void deinit() {
glDeleteTextures(m_texID);
}
public static void main(String[] args) {
TextureMappingTransformasi app = new
TextureMappingTransformasi();
app.start(800, 600, false, false, true,"Mapping
Teksturing");
}
}
95
E. Latihan Soal
Buatlah ilustrasi teksture mapping pada sebuah gedung seperti dalam keluaran
program di bawah ini :
96
gedungA.png gedungB.png
F. Rangkuman
97
G. Umpan Balik
H. Kunci Jawaban
lwjgl.OpenGL
CGApplication
TextureGedung Texture
-Texture : CGApplication = txture -width : int
+loadImage() : void -height : int
+main() : void +getWidth() : int
+getHight() : int
CGApplication.java
Sama dengan kode program pada kegiatan praktikum 6.1
98
Texture.java
Sama dengan kode program pada kegiatan praktikum 6.1
TextureGedung.java
import setting.CfgApplication;
import setting.Texture;
import java.awt.geom.Point2D;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import java.io.IOException;
import java.nio.IntBuffer;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import static org.lwjgl.opengl.Display.update;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE;
import org.lwjgl.util.glu.GLU;
99
glTranslatef(-50, 0, 25);
for (int row = 0; row < 2; row++) {
glPushMatrix();
for (int col = 0; col < 6; col++) {
drawBuilding(4, 6, 10);
glTranslatef(6, 0, 0);
drawBuilding(4, 12, 11);
glTranslatef(6, 0, 0);
drawBuilding(4, 10, 10);
glTranslatef(4, 0, 0);
}
glPopMatrix();
glTranslatef(0, 0, 12);
}
glPopMatrix();
glPushMatrix();
glTranslatef(-50, 0, -50);
for (int row = 0; row < 2; row++) {
glPushMatrix();
for (int col = 0; col < 6; col++) {
drawBuilding(4, 6, 10);
glTranslatef(6, 0, 0);
drawBuilding(4, 12, 11);
glTranslatef(6, 0, 0);
drawBuilding(4, 10, 10);
glTranslatef(4, 0, 0);
}
glPopMatrix();
glTranslatef(0, 0, 12);
}
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}
private void update() {
}
public void destroy() {
Mouse.destroy();
Keyboard.destroy();
Display.destroy();
}
public void deinit() {
}
public void init() {
IntBuffer textureIDBuffer =
BufferUtils.createIntBuffer(14);
glGenTextures(textureIDBuffer);
m_texID[0] = textureIDBuffer.get(0);
m_texID[1] = textureIDBuffer.get(1);
m_texID[2] = textureIDBuffer.get(2);
m_texID[3] = textureIDBuffer.get(3);
m_texID[4] = textureIDBuffer.get(4);
m_texID[5] = textureIDBuffer.get(5);
m_texID[6] = textureIDBuffer.get(6);
100
m_texID[7] = textureIDBuffer.get(7);
m_texID[8] = textureIDBuffer.get(8);
m_texID[9] = textureIDBuffer.get(9);
m_texID[10] = textureIDBuffer.get(10);
m_texID[11] = textureIDBuffer.get(11);
m_texID[12] = textureIDBuffer.get(12);
m_texID[12] = textureIDBuffer.get(12);
loadTexture(m_texID[10], "pic/gedungA.png", false,
GL_LINEAR, NO_WRAP);
loadTexture(m_texID[11], "pic/gedungB.png", false,
GL_LINEAR, NO_WRAP);
}
private void drawBuilding(float width, float height, int
texID) {
width = width / 2;
glBindTexture(GL_TEXTURE_2D, m_texID[texID]);
glBegin(GL_QUADS);
// front side
glTexCoord2d(0, 0);
glVertex3f(-width, 0, width);
glTexCoord2d(1, 0);
glVertex3f(width, 0, width);
glTexCoord2d(1, 1);
glVertex3f(width, height, width);
glTexCoord2d(0, 1);
glVertex3f(-width, height, width);
// right side
glTexCoord2d(0, 0);
glVertex3f(width, 0, width);
glTexCoord2d(1, 0);
glVertex3f(width, 0, -width);
glTexCoord2d(1, 1);
glVertex3f(width, height, -width);
glTexCoord2d(0, 1);
glVertex3f(width, height, width);
// back side
glTexCoord2d(0, 0);
glVertex3f(width, 0, -width);
glTexCoord2d(1, 0);
glVertex3f(-width, 0, -width);
glTexCoord2d(1, 1);
glVertex3f(-width, height, -width);
glTexCoord2d(0, 1);
glVertex3f(width, height, -width);
// left side
glTexCoord2d(0, 0);
glVertex3f(-width, 0, -width);
glTexCoord2d(1, 0);
glVertex3f(-width, 0, width);
glTexCoord2d(1, 1);
glVertex3f(-width, height, width);
glTexCoord2d(0, 1);
glVertex3f(-width, height, -width);
// top side
glVertex3f(-width, height, width);
101
glVertex3f(width, height, width);
glVertex3f(width, height, -width);
glVertex3f(-width, height, -width);
glEnd();
}
private void loadTexture(int texID, String path, boolean
transparent,int filter, int wrap) {
m_texture = new Texture();
if (!m_texture.load(path)) {
System.out.println("Failed to load texture\n");
return;
}
glBindTexture(GL_TEXTURE_2D, texID);
if (transparent) {
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,
m_texture.getWidth(),
m_texture.getHeight(), 0, GL_RGBA,
GL_UNSIGNED_BYTE,
m_texture.getImageData());
} else {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
m_texture.getWidth(),
m_texture.getHeight(), 0, GL_RGB
, GL_UNSIGNED_BYTE,
m_texture.getImageData());
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
filter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
filter);
if (wrap == -1) {
return;
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
wrap);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
wrap);
}
}
102
103
104
Transformasi Proyeksi
A. Tujuan Pembelajaran
C. Uraian Materi
1. Kamera
Dalam grafika 3D, sudut pandang (point of view) adalah bagian dari kamera.
Kamera dalam grafika 3D biasanya tidak didefinisikan secara fisik, namun hanya
untuk menentukan sudut pandang kita pada sebuah lingkungan kerja, sehingga
sering disebut virtual camera.
Sebuah kamera dipengaruhi oleh dua buah faktor penting.
Faktor pertama adalah lokasi (camera location). Lokasi sebuah kamera
ditentukan dengan sebuah titik (x,y,z).
Faktor kedua adalah arah pandang kamera. Arah pandang kamera
ditunjukkan dengan sebuah sistem yang disebut sistem koordinat acuan
pandang atau sistem (U,N,V).
105
Arah pandang kamera sangat penting dalam membuat sebuah citra, karena letak
dan arah pandang kamera menentukan apa yang terlihat oleh sebuah kamera.
Penentuan apa yang dilihat oleh kamera biasanya ditentukan dengan sebuah titik
(x,y,z) yang disebut camera interest.
Pada kamera, dikenal istilah field of view yaitu daerah yang terlihat oleh sebuah
kamera. Field of view pada grafika 3D berbentuk piramid, karena layar monitor
sebuah komputer berbentuk segiempat. Objek-objek yang berada dalam field of
view ini akan terlihat dari layar monitor, sedang objek-objek yang berada di luar
field of view ini tidak terlihat pada layar monitor. Field of view ini sangat penting
dalam pemilihan objek yang akan diproses dalam rendering. Objek-objek diluar
field of view biasanya tidak akan diperhitungkan, sehingga perhitungan dalam
proses rendering, tidak perlu dilakukan pada seluruh objek.
106
2. Transformasi Proyeksi
Lensa kamera dan mata manusia memiliki daerah penglihatan (viewing
volume) yang berbentuk kerucut, namun karena bentuk display yang
biasanya berbentuk segiempat membuat OpenGL (dan hampir semua API
grafika komputer lain) lebih efisien memodelkan daerah penglihatan sebagai
volume berbentuk piramida.
Tipe transformasi proyeksi ada dua macam, bergantung pada parameter dan
bentuk piramidanya. Dua tipe transformasi tersebut adalah Transformasi
Ortogonal/Paralel (Orthogonal Transformation) dan Transformasi
Perspektif(Perspective Transformation).
107
menggunakan perintah glOrtho() dengan didahului proses merubah status
OpenGL ke mode proyeksi dengan perintah
glMatrixMode(GL_PROJECTION).
glMatrixMode(GL_PROJECTION);
glLoadIdentity( );
gluPerspective(fovy, aspect, near, far);
fovy adalah sudut antara bidang bottom dan up.Dalam gambar berikut ini
ditunjukkan ilustrasi dari implementasi kode program di atas.
108
Gambar 23 Ilustrasi transformasi ortogonal dari kode program
3. Transformasi Viewing
Untuk menghasilkan gambar, kamera perlu diletakkan pada posisi yang
tepat di depan pemandangan yang diinginkan. Secara default, dalam
OpenGL kemera akan berada pada posisi (0,0,0) dengan menghadap ke
arah z = -1 dengan sumbu y mengarah ke atas kamera. Hal ini dapat dilakukan
dengan menggunakan perintah gluLookAt() dengan didahului proses merubah
status OpenGL ke mode proyeksi dengan perintah
glMatrixMode(GL_MODELVIEW).
4. Transformasi Modeling
Selain posisi dan orientasi kamera yang dapat dirubah-rubah, secara natural
obyek juga dapat berpindah posisi dan orientasi relatif terhadap yang lain.
Transformasi obyek dapat direpresentasikan dengan dua cara, yaitu:
menggunakan matriks transformasi (glLoadMatrix)
menggunakan operasi transformasi (glRotate , glTranslate )
dengan didahului proses merubah status OpenGL ke mode proyeksi
dengan perintah glMatrixMode(GL_MODELVIEW).
D. Aktivitas Pembelajaran
Pembuatan kode program untuk mentransformasi 3 dimensi melalui
pemanfaatan seperti pada teknik kamera untuk melihat dan menggerakkan objek
3 dimensi.
109
Kegiatan Praktikum 7.1
Keluaran Program
lwjgl.OpenGL
Block
-x : int
-y : int
-z : int
-width : int
-height : int
-dept : int
-shape : int
+getWidth() : int TextureMapping
+getHight() : int -camera_x : float
+render() : void -camera_y : float
-camera_z : float
-camera_rot : float
+kontrolKeyboard() : void
+main() : void
Block.java
import java.util.Random;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
110
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class Block {
public float x, y, z, width, height, depth, shade;
public Random rand;
public Block(float xx, float yy, float zz, float ww, float hh,
float dd) {
x = xx;
y = yy;
z = zz;
width = ww;
height = hh;
depth = dd;
rand = new Random();
shade = (rand.nextFloat() + 0.2f);
}
public void tick() {
}
public void render() {
glBegin(GL_QUADS);
glColor3f(0, shade, 1);
//Front
glTexCoord2f(0, 0);
glVertex3f(x, y, z);
glTexCoord2f(1, 0);
glVertex3f(x + width, y, z);
glTexCoord2f(1, 1);
glVertex3f(x + width, y + height, z);
glTexCoord2f(0, 1);
glVertex3f(x, y + height, z);
//Back
glVertex3f(x, y, z + depth);
glVertex3f(x + width, y, z + depth);
glVertex3f(x + width, y + height, z + depth);
glVertex3f(x, y + height, z + depth);
//Left
glVertex3f(x, y, z);
glVertex3f(x, y, z + depth);
glVertex3f(x, y + height, z + depth);
glVertex3f(x, y + height, z);
//Right
glVertex3f(x + width, y, z);
glVertex3f(x + width, y, z + depth);
glVertex3f(x + width, y + height, z + depth);
glVertex3f(x + width, y + height, z);
//Top
glVertex3f(x, y, z);
glVertex3f(x + width, y, z);
glVertex3f(x + width, y, z + depth);
glVertex3f(x, y, z + depth);
//Bottom
glVertex3f(x, y + height, z);
111
glVertex3f(x + width, y + height, z);
glVertex3f(x + width, y + height, z + depth);
glVertex3f(x, y + height, z + depth);
glEnd();
}
}
UjiCamera.java
import java.util.Random;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public UjiCamera() {
try {
Display.setDisplayMode(new DisplayMode(800, 600));
Display.setTitle("Transformai Proyeksi dengan
Kamera");
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective((float) 45, 800f / 600f, 0.1f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
generateWorld();
glTranslatef(0, 15, 0);
float dt, time, lastTime = 0;
Mouse.setGrabbed(true);
while (!Display.isCloseRequested() &&
!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
time = Sys.getTime();
dt = (time - lastTime) / 1000.0f;
112
lastTime = time;
render();
tick();
Display.update();
Display.sync(60);
}
Display.destroy();
System.exit(0);
}
public void tick() {
camera_x = 0;
camera_y = 0;
camera_z = 0;
camera_rot = 0;
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
camera_z = +1;
} else if (Keyboard.isKeyDown(Keyboard.KEY_MINUS)) {
camera_z = -1;
}
if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
camera_x = +1;
} else if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
camera_x = -1;
}
if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
camera_y = -1;
} else if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
camera_y = +1;
}
while (Keyboard.next()) {
if (Keyboard.isKeyDown(Keyboard.KEY_R)) {
generateWorld();
}
}
for (int i = 0; i < blocks.size(); i++) {
blocks.get(i).tick();
}
camera_rot += Mouse.getDX();
}
public void render() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(camera_x, camera_y, camera_z);
glRotatef(camera_rot, 0, 1, 0);
113
if (r.nextBoolean() == false) {
heightlevel -= 4;
} else {
heightlevel += 4;
}
blocks.add(new Block((i * 4)-64,
-8+heightlevel,(j*4)-64,4,4,4));
float y = -8 + heightlevel;
for (int k = 0; k < 10; k++) {
blocks.add(new Block((i * 4)-64,y-(k * 4),
(j * 4)-64,4,4,4));
}
}
}
}
public static void main(String[] arguments) {
new UjiCamera();
}
}
Keterangan
Tombol keyboard Panah Atas(Pg Up)-> Pergerakkan ke atas
Tombol keyboard Panah Bawah(Pg Dn)-> Pergerakkan ke bawah
Tombol keyboard Panah Kanan(End)-> Pergerakkan ke kanan
Tombol keyboard Panah Kiri(Home)-> Pergerakkan ke kiri
Tombol keyboard Spasi-> Pergerakkan ke maju
Tombol keyboard Minus-> Pergerakkan ke mundur
E. Latihan Soal
1. Perhatikan gambar dibawah ini sebuah titik Pref berada dalam Word
Coordinates system dilihat menggunakan kamera di posisi Peye. Dalam hal ini
kamera bertindak sebagai Viewer Coordinates System.
Jelaskan ilustrasi gambar di bawah ini :
114
2. Perhatikan gambar di bawah ini, Gambar (a) Obyek grafik yang berada di
dunia dinyatakan dalam ruang koordinat 3D. (b) Gambar obyek tersebut
ditampilkan di layar yang dinyatakan sebagai koordinat bidang 2D setelah
melalui proses proyeksi.
F. Rangkuman
Kamera dalam grafika 3D biasanya tidak didefinisikan secara fisik, namun hanya
untuk menentukan sudut pandang kita pada sebuah world, sehingga sering
disebut virtual camera.Lensa kamera dan mata manusia memiliki daerah
penglihatan (viewing volume) yang berbentuk kerucut, namun karena bentuk
display yang biasanya berbentuk segiempat membuat OpenGL (dan hampir
semua API grafika komputer lain) lebih efisien memodelkan daerah penglihatan
115
sebagai volume berbentuk piramida. Tipe transformasi proyeksi ada dua
macam, bergantung pada parameter dan bentuk piramidanya. Dua tipe
transformasi tersebut adalah Transformasi Ortogonal/Paralel (Orthogonal
Transformation) dan Transformasi Perspektif(Perspective Transformation).
G. Umpan Balik
H. Kunci Jawaban
Jawaban no 1
Gambar pada soal no 1 menunjukkan : (a) Sebuah titik dengan posisi Pref pada
obyek silinder dilihat (menggunakan kamera) pada posisi Peye. (b) Sistem
koordinat dunia yang digunakan untuk mengukur posisi titik Pref dan posisi mata
Peye.
116
Untuk menyatakan titik-titik dalam Word Coordinates system menjadi titik-titik
dalam Viewer Coordinates System maka diperlukan beberapa parameter berikut:
Posisi mata pengamat Peye.
Posisi titik referensi Pref.
vektor arah pandang atas Vup
Jawaban no 2
Titik-titik dalam Viewer Coordinates system tersimpan dalam koordinat ruang 3D.
Titik-titik ini akan ditampilkan di layar yang dinyatakan sebagai koordinat bidang
2D. Untuk itu kita perlu mentransformasi titik-titik dalam koordinat ruang 3D
menjadi titik-titik dalam koordinat bidang 2D. Yang menjadi permasalahan adalah
bagaimana mentransformasi titik-titik dalam ruang 3D kedalam bidang 2D.
Jawabannya adalah proyeksi. Proyeksi digunakan untuk mentransformasi titik
dalam ruang 3D kedalam bidang 2D.
117
118
119
120
Rendering
A. Tujuan Pembelajaran
C. Uraian Materi
121
2. Pencahayaan (Lighting)
Salah satu tujuan dari grafika komputer adalah menghasilkan tampilan yang
senyata mungkin, dan karena pengaruh cahaya sangat besar terhadap hasil
nyata maka dalam membuat tampilan akhir faktor pencahayaan harus
diperhitungkan pula. Tetapi mengingat bahwa grafika komputer adalah
model matematika dari kehidupan nyata maka pencahayaan juga harus
diubah menjadi model matematika. Model matematika itu harus memenuhi
persyaratan sebagai berikut :
Menghasilkan efek seperti cahaya sungguhan
Dapat dihitung dengan cepat
Model pencahayaan tiga dimensi menyangkut yang realistik menyangkut dua
elemen penting yang sangat berkaitan erat dengan shading model, yaitu :
Keakuratan dalam menggambarkan objek.
Teknik pencahayaan yang baik.
Saat cahaya menimpa permukaan benda maka sebagian cahaya akan
dipantulkan dan sebagian lain diserap. Bergantung kepada frekuensi
atau panjang gelombang yang dipantulkan dan diserap maka kita akan
melihat warna. Mata kita selain sensitif terhadap warna juga sensitif
terhadap intensitas cahaya (brightness). Secara awam kita menyebut
intensitas cahaya sebagai kecerahan.
Bergantung kepada materi penyusun benda maka ada tiga kemungkinan
arah pantulan cahaya ketika cahaya menimpa permukaan benda :
diffuse, specular, translucent.
a) Cahaya Tersebar (Diffuse)
Suatu objek yang mempunyai permukaan yang kasar maka cahaya yang
dipantulkan cenderung akan menyebar ke segala arah, cahaya yang
menyebar ini disebut cahaya tersebar. Beberapa cahaya menembus
permukaan dan diradiasi kembali secara seragam ke dalam semua arah.
Penghitungan cahaya tersebar menggunakan m, v dan s.
Sebagaimana cahaya tersebar disebarkan secara seragam dalam semua
arah, lokasi mata, v, tidak penting kecuali kalau v.m < 0 jika
diinginkan intensitas cahaya I = 0
122
Hubungan antara kecerahan permukaan dan orientasinya cahaya
didasarkan pada cos(θ).
Keterangan :
= kuat cahaya tersebar (diffuse)
= kuat cahaya di sumber cahaya
= koefisien pantulan tersebar (diffuse)
Flat shading adalah salah satu teknik shading dimana satu face
mempunyai warna yang sama. Pada metode ini sebuah intensitas tunggal
dihitung untuk masing-masing Polygon, semua titik pada permukaan Polygon
dipaparkan dengan nilai intensitas yang sama.
Karakteristik flat shading diantaranya :
Pemberian tone yang sama untuk setiap Polygon
Penghitungan jumlah cahaya mulai dari titik tunggal pada permukaan.
Penggunaan satu normal untuk seluruhnya.
Secara umum flat shading dapat menghasilkan shading yang akurat dengan
ketentuan sebagi berikut :
Objek berbentuk polihendra (segi banyak), yaitu jaring yang mempunyai
ruang terhingga dan tertutup.
Semua sumber cahaya jauh dari permukaan objek, maka adalah tetap
untuk semua permukaan Polygon.
Posisi penglihatan yang cukup jauh dari permukaan sehingga adalah
tetap untuk semua permukaan Polygon.
Definisi matematik :
̅ : Vektor sumber cahaya (arah) membentur permukaan (yang disingkat untuk '
L', tetapi ingat ini adalah suatu garis vektor).
̅ : Vektor sudut pandang (eyepoint) pemandangan di permukaan (yang
disingkat untuk ' V', tetapi ingat ini adalah suatu garis vektor).
123
̅ : Vektor normal (tegak lurus) pada permukaan (yang disingkat untuk '
N', tetapi ingat ini adalah suatu garis vektor).
Sekalipun semua kondisi-kondisi ini tidak benar, kita masih bisa memperkirakan
efek cahaya permukaan dengan menggunakan permukaan Polygon kecil
dengan menggunakan flat shading dan menghitung intensitas untuk setiap
permukaan, khususnya pada pusat Polygon.
D. Aktivitas Pembelajaran
Pembuatan kode program untuk rendering terhadapa objek 3 dimensi dirancang
dengan melibatkan beberapa file java untuk memudahkan dalam pengaturan dan
operasi transformasi geometri.
124
Kegiatan Praktikum 8.1
Keluaran Program
125
lwjgl.OpenGL
CGApplication
Texture
-width : int
-height : int
+getWidth() : int
+getHight() : int
LightingShading Camera
-Camera : CGApplication = cmr -viewCamX : int
-Texture : CGApplication = textr -viewCamY : int
+loadImage() : void -viewCamZ : int
+main() : void -upCamX : int
-upCamY : int
-upCamZ : int
-posCamX : int
-posCamY : int
-posCamZ : int
-camaera_speed : int
+moveCamera() : void
+rotateCamera() : void
+strafeCamera() : void
+render() : void
CGApplication.java
Texture.java
Camera.java
import static org.lwjgl.util.glu.GLU.*;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
public class Camera {
private float viewCamX, viewCamY, viewCamZ, upCamX, upCamY,
upCamZ,posCamX, posCamY, posCamZ, CAMERA_SPEED;
private void moveCamera(float speed) {
126
float x = viewCamX - posCamX;
float z = viewCamZ - posCamZ;
posCamX = posCamX + x * speed;
posCamZ = posCamZ + z * speed;
viewCamX = viewCamX + x * speed;
viewCamZ = viewCamZ + z * speed;
}
private void rotateCamera(float speed) {
float x = viewCamX - posCamX;
float z = viewCamZ - posCamZ;
viewCamZ =(float)(posCamZ+Math.sin(speed)*x+
Math.cos(speed) * z);
viewCamX = (float) (posCamX + Math.cos(speed) * x –
Math.sin(speed) * z);
}
private void strafeCamera(float speed) {
float x = viewCamX - posCamX;
float z = viewCamZ - posCamZ;
float orthoX = -z;
float orthoZ = x;
posCamX = posCamX + orthoX * speed;
posCamZ = posCamZ + orthoZ * speed;
viewCamX = viewCamX + orthoX * speed;
viewCamZ = viewCamZ + orthoZ * speed;
}
private void mouseMove() {
int width, height, mouseX, mouseY;
width = Display.getWidth();
height = Display.getHeight();
127
posCamX = 0.0f;
posCamY = 1.0f;
posCamZ = 8.0f;
viewCamX = 0.0f;
viewCamY = 1.0f;
viewCamZ = 0.0f;
upCamX = 0.0f;
upCamY = 1.0f;
upCamZ = 0.0f;
CAMERA_SPEED = 0.01f;
Mouse.setGrabbed(true);
}
public void setCameraSpeed(float speed) {
CAMERA_SPEED = speed;
}
public void update() {
if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
moveCamera(CAMERA_SPEED);
}
if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
moveCamera(-CAMERA_SPEED);
}
if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
strafeCamera(-CAMERA_SPEED);
}
if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
strafeCamera(CAMERA_SPEED);
}
mouseMove();
}
public void render() {
gluLookAt(posCamX, posCamY, posCamZ, viewCamX,
viewCamY, viewCamZ,upCamX, upCamY, upCamZ);
}
}
LightingShading.java
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.input.Keyboard;
import setting.CGApplication;
import setting.Camera;
import setting.Texture;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
128
private Camera camera;
@Override
public void init() {
camera = new Camera();
camera.init();
camera.setCameraSpeed(0.005f);
KEY_0_pressed = KEY_1_pressed = KEY_2_pressed = false;
light0_ON = light1_ON = light2_ON = false;
IntBuffer textureIDBuffer =
BufferUtils.createIntBuffer(2);
glGenTextures(textureIDBuffer);
textureIDBuffer.get(m_texID);
loadTexture(m_texID[0], "pic/marble.png", false,
GL_LINEAR, GL_REPEAT);
loadTexture(m_texID[1], "pic/crate.png", false,
GL_LINEAR, NO_WRAP);
129
1.0f, 1.0f, 1.0f, 1.0f }).flip();
FloatBuffer matSpecular = (FloatBuffer) BufferUtils
.createFloatBuffer(4).put(new float[] {
1.0f, 1.0f, 1.0f, 1.0f }).flip();
if (Keyboard.isKeyDown(Keyboard.KEY_1)) {
if (!KEY_1_pressed) {
light1_ON = !light1_ON;
KEY_1_pressed = true;
}
} else {
KEY_1_pressed = false;
}
if (Keyboard.isKeyDown(Keyboard.KEY_2)) {
if (!KEY_2_pressed) {
light2_ON = !light2_ON;
KEY_2_pressed = true;
}
} else {
130
KEY_2_pressed = false;
}
}
void drawCube(int texID, float width, float height) {
width = width / 2;
glBindTexture(GL_TEXTURE_2D, texID);
glBegin(GL_QUADS);
glNormal3f(0, 0, 1);
glTexCoord2d(0, 0);
glVertex3f(-width, 0, width);
glTexCoord2d(1, 0);
glVertex3f(width, 0, width);
glTexCoord2d(1, 1);
glVertex3f(width, height, width);
glTexCoord2d(0, 1);
glVertex3f(-width, height, width);
// right side
glNormal3f(1, 0, 0);
glTexCoord2d(0, 0);
glVertex3f(width, 0, width);
glTexCoord2d(1, 0);
glVertex3f(width, 0, -width);
glTexCoord2d(1, 1);
glVertex3f(width, height, -width);
glTexCoord2d(0, 1);
glVertex3f(width, height, width);
// back side
glNormal3f(0, 0, -1);
glTexCoord2d(0, 0);
glVertex3f(width, 0, -width);
glTexCoord2d(1, 0);
glVertex3f(-width, 0, -width);
glTexCoord2d(1, 1);
glVertex3f(-width, height, -width);
glTexCoord2d(0, 1);
glVertex3f(width, height, -width);
// left side
glNormal3f(-1, 0, 0);
glTexCoord2d(0, 0);
glVertex3f(-width, 0, -width);
glTexCoord2d(1, 0);
glVertex3f(-width, 0, width);
glTexCoord2d(1, 1);
glVertex3f(-width, height, width);
glTexCoord2d(0, 1);
glVertex3f(-width, height, -width);
// top side
glNormal3f(0, 1, 0);
glTexCoord2d(0, 0);
glVertex3f(-width, height, width);
glTexCoord2d(1, 0);
glVertex3f(width, height, width);
glTexCoord2d(1, 1);
glVertex3f(width, height, -width);
glTexCoord2d(0, 1);
131
glVertex3f(-width, height, -width);
// bottom side
glNormal3f(0, -1, 0);
glTexCoord2d(0, 0);
glVertex3f(-width, 0, width);
glTexCoord2d(1, 0);
glVertex3f(width, 0, width);
glTexCoord2d(1, 1);
glVertex3f(width, 0, -width);
glTexCoord2d(0, 1);
glVertex3f(-width, 0, -width);
glEnd();
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,filter);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, filter);
if (wrap == NO_WRAP) {
132
return;
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap);
}
private void toggleLighting(int lightID, boolean on) {
if (on) {
glEnable(lightID);
} else {
glDisable(lightID);
}
}
public void render() {
// Setting up default viewport
glViewport(0, 0, width, height);
// Set perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (width) / (height), 1.0f, 100.0f);
// Transformation
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Clear color buffer to black
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Set background color to black
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
camera.render();
// Zoom out
glTranslatef(0.0f, -3.0f, -10.0f);
// Enable lighting
glEnable(GL_LIGHTING);
// toggle lighting
toggleLighting(GL_LIGHT0, light0_ON);
toggleLighting(GL_LIGHT1, light1_ON);
toggleLighting(GL_LIGHT2, light2_ON);
// Enable Depth Testing for correct z-ordering
glEnable(GL_DEPTH_TEST);
// Enable texture 2D
glEnable(GL_TEXTURE_2D);
drawFloor(m_texID[0], 10);
// Draw cube
drawCube(m_texID[1], 2, 2);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
renderText();
}
private void renderText() {
drawString(300, height - 25 ,"Lighting & Shading");
drawString(100, height - 42 * getDefaultFont().getLineHeight(),
"Tekan 0, 1, 2, Untuk ON-OFF point light, directional
light, spot light");
}
@Override
public void deinit() {
133
glDeleteTextures(m_texID[0]);
glDeleteTextures(m_texID[1]);
}
public static void main(String[] args) {
LightingShading app = new LightingShading();
app.start(800, 600, false, false, true,"Lighting & Shading");
}
}
E. Latihan Soal
1. Rancang dan buatlah Virtual Kota seperti dalam gambar di bawah ini dengan
menggunakan file gambar yang sudah disediakan class yang harus dibuat
antara lain :
CGApplication.java bisa disalin dari kode program pada Kegiatan
Belajar 6-7
Camera.java bisa disalin dari kode program Kegiatan Belajar 6 -7
Texture.java bisa disalin dari kode program Kegiatan Belajar 6 -7
Class baru yang harus dibuat adalah VirtualGedungKota.java yang
merupakan implementasi dari kode program
134
File gambar sebagai berikut (berekstensi .jpg atau ,png) :
135
F. Rangkuman
Rendering merupakan salah satu teknik pencitraan objek 3 dimensi untuk
mendapatkan image yang realistis dengan penambahan beberapa efek, seperti
pencahayaan dan shading.
Model pencahayaan tiga dimensi menyangkut yang realistik menyangkut dua
elemen penting yang sangat berkaitan erat dengan shading model keakuratan
dalam menggambarkan objek dan teknik pencahayaan yang baik.
Saat cahaya menimpa permukaan benda maka sebagian cahaya akan
dipantulkan dan sebagian lain diserap. Bergantung kepada frekuensi atau
panjang gelombang yang dipantulkan dan diserap maka kita akan melihat
warna. Mata kita selain sensitif terhadap warna juga sensitif terhadap
intensitas cahaya (brightness). Secara awam kita menyebut intensitas cahaya
sebagai kecerahan.
Flat shading adalah salah satu teknik shading dimana satu face
mempunyai warna yang sama. Pada metode ini sebuah intensitas tunggal
dihitung untuk masing-masing Polygon, semua titik pada permukaan Polygon
136
dipaparkan dengan nilai intensitas yang sama. Karakteristik flat shading
diantaranya pemberian tone yang sama untuk setiap Polygon,penghitungan
jumlah cahaya mulai dari titik tunggal pada permukaan dan penggunaan satu
normal untuk seluruhnya.
G. Umpan Balik
137
H. Kunci Jawaban
Perancangan class diagram
lwjgl.OpenGL
CGApplication
Texture
-width : int
-height : int
+getWidth() : int
+getHight() : int
VirtualGedungKota Camera
-Camera : CGApplication = cmr -viewCamX : int
-Texture : CGApplication = textr -viewCamY : int
+loadImage() : void -viewCamZ : int
+main() : void -upCamX : int
-upCamY : int
-upCamZ : int
-posCamX : int
-posCamY : int
-posCamZ : int
-camaera_speed : int
+moveCamera() : void
+rotateCamera() : void
+strafeCamera() : void
+render() : void
138
PENUTUP
Modul diklat PKB Guru RPL level 7 ini merupakan bagian dari Standar
Kompetensi Guru (SKG) pada empat kompetensi utama yaitu pada kompetensi
profesional. Kompetensi Inti Guru (KIG) sesuai permendiknas 16 tahun 2007
pada kompetensi profesional pada poin 20 menyebutkan guru harus “Menguasai
materi, struktur, konsep dan pola pikir keilmuan yang mendukung mata pelajaran
yang diampu”. Modul ini dibuat sesuai dengan Indikator Pencapaian
Kompetensi(IPK), dimana setiap IPK dituangkan ke dalam Kegiatan Belajar(KB)
1- sampai KB 8 yang berisikan pengembangan pengetahuan dalam uraian materi
dan praktikum yang tertuang dalam kegiatan praktikum. Latihan atau tugas
berisikan permasalahan-permasalan yang nyata dalam kehidupan sehari-hari.
Solusi yang ditawarkan dalam setiap penyelesaian masalah dalam bentuk UML
class diagram dan kode program dalam bahasa C++ dan java sehingga
pengguna dapat memilih sesuai dengan bahasa pemrograman yang sering
digunakan.
Grafik komputer 3D (dimensi) merupakan bentuk dari benda yang memiliki
panjang, lebar, dan tinggi. perbedaan dengan grafik 2D pada pemodelan 3D
memiliki 3 titik kordinat yakni titik x, y, dan z. Representasi dari data geometrik 3
dimensi sebagai hasil dari pemrosesan dan pemberian efek cahaya terhadap
grafika komputer 2D. Tiga Dimensi, biasanya digunakan dalam penanganan
grafis. 3D secara umum merujuk pada kemampuan dari sebuah video card (link).
pemodelan ini juga berfungsi untuk menampilkan efek realistis pada video
maupun game. Grafik 3D merupakan perkembangan dari grafik 2D. Di dalam
grafika komputer, 3D merupakan bentuk grafik yang menggunakan representasi
data geometri tiga dimensi. Suatu objek rangka 3D apabila disinari dari arah
tertentu akan membentuk bayangan pada permukaan gambar. Proses
pembuatan grafik komputer 3D dapat dibagi ke dalam tiga fase, yaitu 3D
139
modeling yang mendeskripsikan bentuk dari sebuah objek, layout dan animation
yang mendeskripsikan gerakan dan tata letak sebuah objek, dan 3D rendering
yang memproduksi image dari objek tersebut
Pengguna modul ini terutama guru-guru Rekayasa Perangkat Lunak (RPL) dapat
memperkaya dengan memberi latihan-latihan atau tugas yang lebih variatif untuk
siswa-siswa SMK sesuai permasalahan di sekolah masing-masing. Pada
perkembangan saat ini, pemanfaatan teknologi grafika komputer sangat
dibutuhkan untuk memvisualisasikan objek-objek dunia nyata menjadi objek
grafis, dan implementasi yang real yaitu digunakannya teknologi grafika
komputer pada fraktal untuk pembuatan aplikasi desain suatu benda. Dengan
menguasai grafika komputer diharapkan guru dan siswa bisa bersama-sama
membuat projek-projek yang dapat digunakan oleh sekolah dan masyarakat.
140
EVALUASI
141
a. Satu pixel didefinisikan pada posisi (3,4)
b. Satu pixel didefinisikan pada posisi (4,3)
c. Satu pixel pada posisi(3,4) dapat membentuk gambar
d. Satu pixel pada posisi(4,3) dapat membentuk gambar
5. Perintah glClear(GL_COLOR_BUFFER_BIT); adalah perintah untuk…
a. memberikan fungsi warna
b. mendefinisikan sebuah objek
c. memberi nilai koordinat pada sebuah objek
d. menghapus layar
6. Bidang tertutup yang dibentuk minimal 3 simpul (titik) yang terhubung oleh
garis (sisi) dan garis-garis tersebut tidak saling memotong merupakan
bidang…
a. Poligon
b. Polyline
c. Multigon
d. Oktogonal
7. File-file berikut diperlukan dalam pengintegrasian LWJGL ke dalam ide
netbeans kecuali...
a. Lwjgl-idenetbeans-X.X.zipLwj
b. gl-docs-X.X.zip
c.Lwjgl-source-X.X.zip
d.Lwjgl-applet-X.X.zip
8. Garis a arah horisontal mempunyai panjang 400, dan garis b arah vertikal
mempunyai tinggi 320. Tentukan pasangan titik koordinat untuk menggambar
garis a dan garis b ... .
142
Mengambar Garis
(0,480) (320,100)
a
(100,240)
(0,0) (640,0)
a. Translasi
b. Transformasi
c. Rotasi
d. Skala
10. Translasi dilakukan dengan penambahan translasi pada suatu titik koordinat
dengan translation vector, yaitu (tx,ty), dimana tx adalah translasi menurut
sumbu x dan ty adalah translasi menurut sumbu y. Koordinat baru titik
yang ditranslasi adalah ...
a. x’=x + tx dan y’=y + ty sehingga titik setelah translasi adalah (x’,y’)
143
b. x’=x-tx dan y’=y - ty sehingga titik setelah translasi adalah (x’,y’)
c. x’=x * tx dan y’=y * ty sehingga titik setelah translasi adalah (x’,y’)
d. x’=x +(2 tx) dan y’=y +(2 ty) sehingga titik setelah translasi adalah (x’,y’)
11. Tiga elemen dasar dalam sistem koordinat 3D yang diperlukan dalam grafika
komputer adalah ...
a. Titik 3D, vektor 3D, dan matrik 3D
b. Translasi 3D, rotasi 3D, dan skala 3D
c. Titik 3D, translasi 3D, dan rotasi 3D
d. Vektor 3D, translasi 3D, dan rotasi 3D
12. Algoritma yang digunakan untuk menentukan titik-titik dalam dimensi dengan
menggunakan pendekatan garis lurus adalah…
e. Algoritma DDA
f. Algoritma Bessenham
g. Algoritma differential analyzer
h. Algoritma K-Cluster
13. Perintah berikut ini digunakan untuk menampilkan ....
void mydisplay(){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
144
a. 8 titik, 6 face , dan setiap face terdiri dari 4 vertex
b. 8 titik, 6 face , dan setiap face terdiri dari 2 vertex
c. 8 titik, 6 face , dan setiap face terdiri dari 6 vertex
d. 8 titik, 6 face , dan setiap face terdiri dari 8 vertex
16. Jika diketahui nilai s adalah 2 Tentukan koordinat baru titik (3,4) setalah
melalui operasi penskalaan adalah ...
a.(5,6)
b.(9,12)
c.(5,12)
d.(9,6)
17. Di bawah ini adalah perintah-perintah untuk memberikan tekstur pada objek 1
dimensi, kecuali…
a. GL_TEXTURE_1D
b. GL_TEXTURE_RECTANGLE
c. GL_TEXTURE_BUFFER
d. GL_TEXTURE_1D_ARRAY
18. Penentuan apa yang dilihat oleh kamera biasanya ditentukan dengan sebuah
titik (x,y,z) yang disebut...
a. camera interest
b. field of view
c. virtual camera
d. camera setting
19. Melakukan pengesetan kamera dalam bentuk setting lensa kamera disebut…
a. trnasformasi viewing
b. transformasi viewport
c. transformasi modeling
d. transformasi proyeksi
145
20. Secara umum flat shading dapat menghasilkan shading yang akurat jika
objek berbentuk….
a. polyhendra
b. polygon
c. oktogonal
d. polyline
146
GLOSARIUM
3 dimensi biasa disebut 3D atau adalah bentuk dari benda yang memiliki
panjang, lebar, dan tinggi. Grafik 3 Dimensi merupakan teknik penggambaran yg
berpatokan pada titik koordinat sumbu x(datar), sumbu y(tegak), dan sumbu
z(miring).
Flat shading adalah salah satu teknik shading dimana satu face
mempunyai warna yang sama. Pada metode ini sebuah intensitas tunggal
dihitung untuk masing-masing Polygon, semua titik pada permukaan Polygon
dipaparkan dengan nilai intensitas yang sama.
Garis dibuat dengan menentukan posisi titik diantara titik awal dan akhir dari
suatu garis. Untuk menggambar titik (point) digunakan perintah point(x,y) dimana
nilai x dan y adalah koordinat pada layar.
Kamera dalam grafika 3D biasanya tidak didefinisikan secara fisik, namun hanya
untuk menentukan sudut pandang kita pada sebuah world, sehingga sering
disebut virtual camera.
147
Lightweight Java Game Library (LWJGL) merupakan salah satu jenis game
engine yang berjalan dengan dasar bahasa java (open source dan free). Game
engine sendiri merupakan perangkat lunak yang digunakan khusus dalam
pembuatan video game.
OpenGL (Open Graphics Library) adalah sebuah program aplikasi interface yang
digunakan untuk mendefinisikan komputer grafis 2D dan 3D. Semua perintah
OpenGL menggunakan awalan gl diikuti dengan huruf kapital pada setiap kata
membentuk nama perintah (sebagai contoh glClearColor).
Rotasi artinya berputar. Ketika suatu bentuk benda sengaja diputar maka
perlu di tentukan pusat dan besar sudut putar. sedangkan translasi adalah
pergeseran. Benda yang telah berpindah dari pusatnya berarti mengalami
148
pergeseran, yaitu apakah dia bergerak maju mundur ataupun menuju ke atas
bawah.
Skala adalah suatu operasi yang membuat suatu objek berubah ukurannya baik
menjadi mengecil ataupun membesar secara seragam atau tidak seragam
tergantung pada faktor penskalaan (scalling factor) yaitu (sx,sy) yang diberikan.
sx adalah faktor penskalaan menurut sumbu x dan sy faktor penskalaan menurut
sumbu y.
Titik (Point) atau dalam istilah komputer dikenal dengan Pixel (Picture Element)
adalah elemen terkecil dari sebuah gambar atau pola dalam tampilan komputer.
Kumpulan dari pixel membentuk sebuah gambar atau pola yang dapat dikenali
dalam variasi warna dan jumlah yang banyak. Kumpulan pixel dalam jumlah
panjang dan lebar tertentu disebut dengan resolusi.
149
150
DAFTAR PUSTAKA
151