MODUL PROGRAM KEAHLIAN GANDA Grafika Komputer Paket Keahlian Rekayasa Perangkat Lunak Kelompok Kompetensi G Penulis: EKO SUBIYANTORO,S.Pd.,S.ST.,MT. Direktorat Jenderal Guru dan Tenaga Kependidikan Kementrian Pendidikan dan Kebudayaan Tahun 2017 i Penulis: 1. Eko Subiyantoro, S.Pd., S.T., MT. Email: [email protected] Penelaah: 1. Siarra Maulida Asrin, S.T [081562783394], Email: [email protected] 2. Abdul Haliq, S.Pd., M.Pd., [085341259862] Email : [email protected] 3. Dyah Darma Andayani, S.T, M.Tel.Eng (081355721216) Email : [email protected] Ilustrator : 1. Faizal Reza Nurzeha., A.Md Copyright ©2017 Lembaga Pengembangan dan Pemberdayaan Pendidikan Tenaga Kependidikan Bidang Kelautan Perikanan Teknologi Informasi dan Komunikasi. Hak Cipta Dilindungi Undang-Undang Dilarang mengkopi sebagian atau keseluruhan isi buku ini untuk kepentingan komersial tanpa izin tertulis dari Kementerian Pendidikan Kebudayaan. ii KATA SAMBUTAN Peran guru profesional dalam proses pembelajaran sangat penting sebagai kunci keberhasilan belajar siswa. Guru profesional adalah guru yang kompeten membangun proses pembelajaran yang baik sehingga dapat menghasilkan pendidikan yang berkualitas. Hal ini tersebut menjadikan guru sebagai komponen yang menjadi fokus perhatian pemerintah pusat maupun pemerintah daerah dalam peningkatan mutu pendidikan terutama menyangkut kompetensi guru. Pengembangan profesionalitas guru melalui program Keahlian Ganda (PKG) merupakan upaya peningkatan kompetensi untuk semua guru. Sejalan dengan hal tersebut, pemetaan kopetensi guru telah dilakukan melalui uji kompetensi guru (UKG) untuk kompetensi pedagogik dan profesional pada akhir tahun 2015. Hasil UKG menunjukan peta kekuatan dan kelemahan kompetensi guru dalam penguasaan pengetahuan. Peta kompetensi guru tersebut dikelompokan menjadi 10 (sepuluh) kelompok kompetensi. Tindak lanjut pelaksanaan UKG diwujudkan dalam bentuk pelatihan guru paska UKG melalui program Keahlian Ganda. Tujuannya untuk meningkatkan kompetensi guru sebagai agen perubahan dan sumber belajar utama bagi peserta didik. Program Keahlian Ganda dilaksanakan melalui pola tatap muka, daring (online) dan campuran (blended) tatap muka dengan online. Pusat Pengembangan dan Pemberdayaan Pendidik dan Tenaga Kependidikan (PPPPTK), Lembaga Pengembangan dan Pemberdayaan Pendidik dan Tenaga Kependidikan Kelautan Perikanan Teknologi Informasi dan Komunikasi (LP3TK KPTK) dan Lembaga Pengembangan dan Pemberdayaan Kepala Sekolah (LP2KS) merupakan Unit Pelaksana Teknis di lingkungan Direktorat Jendral Guru dan Tenaga Kependidikan yang bertanggung jawab dalam mengembangkan perangkat dan melaksanakan peningkaan kompetensi guru sesuai dengan bidangnya. Adapun perangkat pembelajaran yang dikembangkan tersebut adalah modul untuk program Keahlian Ganda tatap muka dan PKG online untuk semua mata pelajaran dan kelompok kompetensi. Dengan modul ini diharapkan program PKG memberikan sumbangan yang sangat besar dalam peningkatan kualitas kompetensi guru. Mari kita sukseskan program PKG ini untuk mewujudkan Guru Mulia Karena Karya. Jakarta, Februari 2016 Direktur Jendral Guru dan Tenaga Kependidikan Sumarna Surapranata, Ph.D NIP. 195908011985031002 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, Dr. H. Rusdi, M.Pd, NIP 19650430 199103 1 004 v DAFTAR ISI KATA SAMBUTAN .............................................................................................. iii KATA PENGANTAR ............................................................................................ v DAFTAR ISI ........................................................................................................ vi DAFTAR GAMBAR ............................................................................................. ix DAFTAR TABEL ................................................................................................. xi PENDAHULUAN………………………………………………………………………. 1 A.Latar Belakang………………………………………………………………………. 1 B.Tujuan……………………………………………………………………………….. 2 C.Peta Kompetensi……………………………………………………………………. 2 D.Ruang Lingkup Penggunaan Modul……………………………………………… 4 E.Saran Cara Penggunaan Modul………………………………………………… . 4 KEGIATAN BELAJAR 1 PENGANTAR GRAFIKA KOMPUTER .......................... 9 A.Tujuan Pembelajaran ...................................................................................... 9 B.Indikator Pencapaian Kompetensi ................................................................... 9 C.Uraian Materi .................................................................................................. 9 D.Aktivitas Pembelajaran ................................................................................. 14 E.Latihan/Tugas ............................................................................................... 14 F.Rangkuman .................................................................................................. 15 G.Umpan Balik……………………………………………………………………… 16 H.Kunci Jawaban............................................................................................. 16 KEGIATAN BELAJAR 2 OPENGL DAN LWJGL ................................................ 19 A.Tujuan Pembelajaran .................................................................................... 19 B.Indikator Pencapaian Kompetensi ................................................................. 19 C.Uraian Materi ................................................................................................ 19 D.Aktivitas Pembelajaran ................................................................................. 22 E.Latihan/Tugas ............................................................................................... 31 F.Rangkuman................................................................................................... 31 G. Umpan Balik…………………………………………………………………….. .. 32 H.Kunci Jawaban ............................................................................................. 32 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 Gambar 1 Peta Kedudukan Modul Grafika Komputer .......................................... 3 Gambar 2 Struktur Modul Grafika Komputer ........................................................ 4 Gambar 3 Translasi ........................................................................................... 52 Gambar 4 Rotasi................................................................................................ 52 Gambar 5 Skala ................................................................................................. 53 Gambar 6 Koordinat .......................................................................................... 68 Gambar 7 Surface ............................................................................................. 68 Gambar 8 Vertex dan Edge ............................................................................... 68 Gambar 9 Penggunaan Teksture dalam Game Chect Out 3D ........................... 82 Gambar 10 Analogi Pengambilan Gambar oleh Kamera.................................. 102 Gambar 11 Transformasi Ortogonal dan Proyeksi ........................................... 103 Gambar 12 Transformasi Ortogonal................................................................. 104 Gambar 13 Ilustrasi Transformasi Ortogonal dari Kode Program ..................... 104 ix x DAFTAR TABEL Tabel 1 Peta Kompetensi..................................................................................... 3 Tabel 2 Data Algoritma DDA(Digital Differential Analyzer) ................................. 38 Tabel 4 Vertex Penyusun Kubus........................................................................ 93 Tabel 5 Permukaan Kubus ................................................................................ 93 xi … xii PENDAHULUAN A. Latar Belakang Guru dan tenaga kependidikan wajib melaksanakan kegiatan pengembangan keprofesian secara berkelanjutan agar dapat melaksanakan tugas profesionalnya. Program Keahlian Ganda (PKG) adalah pengembangan kompetensi Guru dan Tenaga Kependidikan yang dilaksanakan sesuai kebutuhan, bertahap, dan berkelanjutan untuk meningkatkan profesionalitasnya. PKG sebagai salah satu strategi pembinaan guru dan tenaga kependidikan diharapkan dapat menjamin guru dan tenaga kependidikan mampu secara terus menerus memelihara, meningkatkan, dan mengembangkan kompetensi sesuai dengan standar yang telah ditetapkan. Pelaksanaan kegiatan PKG akan mengurangi kesenjangan antara kompetensi yang dimiliki guru dan tenaga kependidikan dengan tuntutan profesional yang dipersyaratkan. Di dalam pelaksanaan diklat yang dilaksanakan oleh PPPPTK/LPPPTK KPTK diperlukan suatu modul yang berfungsi sebagai salah satu sumber belajar guru. Modul Diklat PKG Guru Rekayasa Perangkat Lunak (RPL) Level 7 “Grafika Komputer” ini dapat digunakan oleh guru dan tenaga kependidikan dan sebagai acuan untuk memenuhi tuntutan kompetensinya, sehingga guru dapat melaksanakan tugasnya secara professional sesuai dengan standar yang telah ditetapkan. Modul Diklat PKG Guru RPL Level 7 grafika komputer ini mempelajari tentang teori dan praktik tentang konsep dasar grafika komputer, penggunaan library OpenGL dan LWJGL ke dalam perangkat lunak yang dapat di integrasikan ke dalam Integrated Development Environment(IDE) , pemodelan 2 dimensi yang diawali dengan sistem koordinat dan pembuatan primitif objek, pemodelan 3 dimensi dengan pembuatan objek 3 dimensi dan ,pemanfaatan teknik lighting,shading, texture untuk menciptakan objek 3 yang nyata. 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 Berbasis Dekstop (50 JP) 8 Grafika Komputer (50 JP) 7 Proyek Sistem Informasi Berbasis Web (50 JP) 9 Pemrograman Berbasis Dekstop (50 JP) 5 Pemrograman Berbasis Perangkat Bergerak (50 JP) Pemrograman Berorientasi Objek (50 JP) 3 1 Pemrograman Web Dinamis (50 JP) 6 4 Proyek Sistem Informasi Berbasis Perangkat Bergerak (50 JP) 10 Desain Sistem Basis Data (50 JP) 2 Sistem Manajemen Basis Data (50 JP) Gambar 1 Peta kedudukan Modul Grafika Komputer Tabel 1 Peta kompetensi Grafika Komputer : Standar Kompetensi Guru Kompetensi Utama Profesional Kompetensi Inti Guru (KIG) 1. Menguasai Kompetensi Guru Keahlian (KGK) 20.13 Membangun Indikator pencapaian Kompetensi 20.13.1 Menganalisis Integrated materi, objek 3D Development struktur, menggunakan Environment konsep dan konsep pemrograman grafik pola pikir pemrograman keilmuan grafik (IDE) 20.13.2 Membuat instruksi dasar yang OPENGL mendukung mata 20.13.3 Membuat pemodelan pelajaran objek 3D menggunakan yang diampu OPENGL 20.13.4 Membuat pergerakan objek 3D menggunakan OPENGL 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 2 OpenGL dan LWJGL Kegiatan Belajar 4 Pembuatan Objek 2 Dimensi Kegiatan Belajar 6 Pembuatan Teksture Kegiatan Belajar 8 Lighting dan Shading Kegiatan Belajar 1 Pengantar Grafika Komputer Kegiatan Belajar 3 Primitif Drawing Kegiatan Belajar 5 Pembuatan objek 3 Dimensi Kegiatan Belajar 7 Transformasi Proyeksi Topik 1 Dasar-Dasar Grafika Komputer Topik 2 Pemodelan Objek 2 Dimensi Topik 3 Pemodelan Objek 3 Dimensi Topik 4 Rendering Gambar 2 Struktur modul PKB Guru RPL Grade 7 Grafika Komputer E. Saran Cara Penggunaan Modul 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 masingmasing 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 komponenkomponen penting dalam grafika komputer. 2. Melalui diskusi peserta diklat dapat menggambarkan peranan grafika komputer dalam berbagai bidang. B. Indikator Pencapaian Kompetensi 1. Peserta diklat mampu menganalisis konsep grafis dalam grafika komputer 2. Peserta diklat mampu membedakan desain grafis bitmap dan vektor 3. Peserta diklat mampu menjelaskan penerapan grafika komputer dalam berbagai bidang C. Uraian Materi 1. Pengertian Grafika Komputer 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. 9 Format komputer grafis umum termasuk GIF dan JPEG, untuk gambar tunggal, dan MPEG dan Quicktime, untuk gambar multiframe. Aplikasi grafika komputer telah digunakan secara luas dalam bisnis, penelitian ilmiah, dan hiburan. Salah satu bidang grafika komputer yang sangat terkenal adalah Desain Grafis. Bentuk sederhana dari grafika komputer yaitu titik, garis dan bidang 2 Dimensi (2D), yang kemudian dikembangkan menjadi bidang 3 Dimensi (3D), pengolahan citra (image processing) dan pengenalan pola (pattern recognation). Salah satu manfaat utama dari grafis komputer adalah bahwa gambar dapat dimanipulasi dengan relatif mudah dan banyak efek visual yang mungkin karena gambar dapat dimainkan dengan lebih baik sampai pada efek yang diinginkan tercapai. 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. Pixel merupakan singkatan dari picture element, kadang-kadang juga disebut pel. Pixel merupakan satu titik dalam satu grid berbentuk persegi atau juga beribu titik secara individual “dilukis” menjadi suatu bentuk image yang dihasilkan pada layar komputer atau pada kertas oleh sebuah Printer. Semakin banyak jumlah titik yang membentuk suatu grafis bitmap berarti semakin tinggi tingkat kerapatannya. Hal ini menyebabkan semakin halus citra grafis, tetapi kapasitas filenya semakin besar. Program aplikasi grafis yang berbasis bitmap, antara lain : Adobe Photoshop, Corel Photopaint, Microsoft Photo Editor dan Macromedia Fireworks. 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- 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. Dalam grafika komputer memiliki tiga tema utama, yaitu : Modeling, yaitu cara mempresentasikan sebuah objek atau lingkungan di sekitar. Animasi, yaitu mempelajari tentang penggambaran dan manipulasi gerakan objek secara otomatis atau manual. Rendering, yaitu mempelajari algoritma untuk membuat dan menampilkan struktur/detail suatu objek. 2. Peran dan Penggunaan Grafika Komputer Grafika komputer telah menunjukkan kemajuan yang pesat dalam pengembangan berbagai aplikasi untuk menghasilkan gambar. Walaupun pada awalnya aplikasi dalam sains dan engineering memerlukan peralatan yang mahal, perkembangan teknologi komputer memberikan kemudahan penggunaan komputer sebagai alat bantu aplikasi grafik komputer interaktif. Pada saat ini grafika komputer digunakan secara rutin di bidang ilmu pengetahuan, teknik, kedokteran, bisnis, industri, pemerintahan, seni, hiburan, pendidikan, periklanan, dan lain sebagainya. Berikut contoh peranan grafika komputer dalam berbagai bidang: 1) Desain Proses desain grafika komputer terutama digunakan pada sistem engineering dan arsitektur. Salah satu contoh penerapan grafika computer yaitu Computer Aided Design (CAD) digunakan untuk pembuatan desain mobil, bangunan, pesawat terbang, kapal, komputer, tekstil, dan lain-lain. Pada beberapa aplikasi desain, objek ditampilkan dalam bentuk wireframe yaitu bagian gambar yang memperlihatkan keseluruhan bentuk dan fitur internal dari sebuah objek, dimana diperlihatkan 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. Kegiatan Praktikum 1.1 1. Topik diskusi 1 : Teknik dan Teknologi dalam Grafika Komputer 2. Topik diskusi 2 : Penerapan Grafika Komputer 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 IPK Hasil Yang Dicapai Peserta diklat menganalisis mampu konsep grafis dalam grafika komputer dan berapa proses pencapaian kompetensinya Peserta diklat membedakan mampu desain grafis bitmap dan vector dan berapa besar proses pencapaian kompetensinya Peserta diklat mampu menjelaskan penerapan grafika komputer bidang dalam dan proses berbagai berapa pencapaian kompetensinya H. Kunci Jawaban 1. Grafika Komputer 2. a 16 besar Rencana Tindak Lanjut 17 18 OpenGL dan LWJGL A. Tujuan Pembelajaran Setelah mengikuti kegiatan belajar 2 ini peserta diklat diharapkan dapat : 1. Melalui diskusi peserta diklat dapat menggambarkan fungsi-fungsi OpenGL yang digunakan untuk membuat objek 2. Melalui praktikum peserta diklat dapat mengintegrasikan LWJGL ke dalam Integrated Development Environment IDE NetBeans 3. Melalui praktikum peserta diklat dapat menulis kode program dengan perintah-perintah dasar OpenGL B. Indikator Pencapaian Kompetensi 1. Peserta diklat mampu menggunakan fungsi-fungsi dasar OpenGL untuk membuat objek 2. Peserta diklat mampu memodifikasikan fungsi-fungsi dasar OpenGL untuk membuat objek 3. Peserta diklat mampu menerapkan LWJGL ke dalam IDE NetBeans 4. Peserta diklat mampu membuat kode program dengan perintah-perintah OpenGL 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 Langkah-langkah instalasi LWJGL ke dalam IDE NetBeans 1. Pilih Lwjgl-X.X.zip yang tersedia dengan men-download file LWJGL http://lwjgl.org/download.php 2. Unduh Lwjgl-docs-X.X.zip, Javadoc lwjgl untuk di Netbeans (Direkomendasikan) 3. Unduh Lwjgl-source-X.X.zip, source code lwjgl untuk di Netbeans (Direkomendasikan) 4. Unduh Lwjgl-applet-X.X.zip jika ingin menggunakan Java Applet dengan Lwjgl 5. Ekstrak File Lwjgl-X.X.zip dan Lwjgl-source-X.X.zip kecuali Lwjgl-docsX.X.zip. a) Cara Instalasi LWJGL di NetBeans Berikut tahap-tahap instalasi LWJGL di NetBeans: 1. Buka Netbeans 2. Klik New Project, pilih Java Application > Next Tulis Project Name dengan nama “TutorialLWJGL” Klik Tools > Libraries di main menu 22 3. Klik Tombol New Library 4. Berikan nama library dengan LWJGL atau LWJGL-X.X 23 5. Pastikan Library sudah dipilih. Sekarang pilih tab Classpath untuk menambahkan library terbaru dan kemudian klik tombol Add JAR/Folder. 6. Pergi ke folder ekstrak LWJGL-X.X.zip dan folder Jar. lwjgl.jar, lwjgl_util.jar, dan jinput.jar merupakan file jar yang harus Anda pilih. Anda dapat memilih lebih dari 1 file dengan menahan tombol Ctrl pada Keyboard. 7. Pilih Tab Sources, kemudian klik Add JAR/Folder. Pergi ke folder ekstrak Lwjgl-source-X.X.zip dan klik folder src, kemudian pilih folder generated dan java. 24 8. Pilih Tab Javadoc dan klik Add JAR/Folder. Kemudian pilih file Lwjgl-docs-X.X.zip 9. Klik OK. Selesai. Library sudah ditambahkan ke dalam Netbeans. b) Menambahkan library LWJGL ke dalam library di aplikasi Berikut ini tahap-tahap menambah library LWJGL: 1. Buka Netbeans. 2. Klik kanan pada Libraries aplikasi kemudian pilih Add Library… 25 3. Pilih LWJGL > Klik Add Library. 4. Konfigurasi VM dengan cara klik kanan pada Tutorial lwjgl dan pilih Properties 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 Kegiatan Praktikum ini adalah kegiatan praktikum menggunakan struktur dasar OpenGL dan LWJGL dalam IDE NetBeans. 1. Bagian awal dari program adalah bagian untuk mengimport library-library yang diperlukan untuk mengintegrasikan LWJGL ke dalam IDE Netbeans 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; 2. Bagian kedua dari program adalah bagian yang digunakan untuk menentukan koordinat dari bidang dua dimensi dalam bentuk garis dimana nilai satuan berupa double. public class OpenGL1 { public void draw() { glBegin(GL_LINE_LOOP);//Objek garis glVertex2d(200, 200); // koordinat x dan y glVertex2d(600, 200); glVertex2d(200, 325); glVertex2d(600, 325); glVertex2d(200, 450); glVertex2d(600, 450); glEnd(); } 3. Bagian ketiga dari program adalah bagian yang digunakan untuk inisialisasi OpenGL public void render() { glClear(GL_COLOR_BUFFER_BIT);//menghapus layar glLoadIdentity(); 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); } } private void update() { } public void destroy() { Mouse.destroy(); Keyboard.destroy(); Display.destroy(); } public static void main(String[] args) { OpenGL1 b1 = new OpenGL1(); try { b1.create(); b1.run(); } catch (LWJGLException ex) { Logger.getLogger(Belajar1.class.getName()).log(Level.SEVERE, null, ex); } } } 30 E. Latihan / Tugas Latihan 1. OpenGL (Open Graphics Library) bersifat Open-Source, multi-platform dan multi-language adalah sebuah program aplikasi interface untuk mendifinisikan suatu objek yaitu .... 2. Fungsi dasar dari OpenGL adalah .... F. Rangkuman OpenGL (Open Graphics Library) adalah sebuah program aplikasi interface yang digunakan untuk mendefinisikan komputer grafis 2D dan 3D. Program lintasplatform 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 keperluankeperluan 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 Peserta diklat menggunakan Rencana Tindak Lanjut mampu fungsi-fungsi dasar OpenGL untuk membuat objek dan berapa proses pencapaian kompetensinya Peserta diklat memodifikasikan mampu fungsi-fungsi dasar OpenGL untuk membuat objek dan berapa besar proses pencapaian kompetensinya Peserta diklat mampu menerapkan LWJGL ke dalam IDE NetBeans besar proses dan berapa pencapaian kompetensinya Peserta diklat mampu membuat kode program dengan perintahperintah OpenGL dan berapa besar proses pencapaian kompetensinya H. Kunci Jawaban 1. Objek 2 dimensi dan objek 3 dimensi 2. Mengeluarkan koleksi perintah khusus(grafik) atau executable ke sistem operasi 32 33 34 PEMODELAN OBJEK 2 DIMENSI Primitif Objek A. Tujuan Pembelajaran Setelah mengikuti kegiatan belajar 3 ini peserta diklat diharapkan dapat : 1. Melalui diskusi peserta diklat mengemukakan output primitif grafika komputer untuk membuat objek. 2. Melalui praktikum peserta diklat membuat kode program berdasarkan algoritma pembentukan garis dan lingkaran. B. Indikator Pencapaian Kompetensi 1. Peserta diklat mampu menerapkan konsep konsep dasar grafika computer untuk menggambar primitif objek 2. Peserta diklat mampu menggunakan perintah-perintah dasar OpenGL untuk menggambar primiif objek 3. Peserta diklat mampu menulis kode program sesuai algoritma pembentukan garis dan lingkaran 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. 2. Titik dan Garis Pembentukan titik dilakukan dengan mengkonversi posisi titik koordinat dengan program aplikasi ke dalam suatu operasi tertentu menggunakan output. Randomscan (vektor). Sistem menyimpan instruksi pembentukan titik pada display list dan nilai koordinat untuk menentukan posisi pancaran electron ke arah lapisan fosfor pada layer. 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 dua dimensi pada layar. 3. Membuat Titik dan Garis 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). Persamaan garis menurut koordinat Cartesian adalah: y = m.x + b dimana m adalah slope (kemiringan) dari garis yang dibentuk oleh dua titik yaitu (x1,y1) dan (x2, y2). Untuk penambahan x sepanjang garis yaitu dx akan mendapatkan penambahan y sebesar Δy = m. Δx Algoritma DDA (Digital Differential Analyzer) DDA adalah algoritma pembentukan garis berdasarkan perhitungan Δx dan Δy, menggunakan rumus y = m. Δ x. Garis dibuat dengan menentukan dua endpoint yaitu titik awal dan titik akhir. Setiap koordinat titik yang membentuk garis diperoleh dari perhitungan, kemudian dikonversikan menjadi nilai integer. Langkah-langkah pembentukan menurut algoritma DDA, yaitu : 1) Tentukan dua titik yang akan dihubungkan. 2) Tentukan salah satu titik sebagai titik awal (x0, y0) dan titik akhir (x1, y1). 3) Hitung Δx = x1 – x0 dan Δ y = y1 – y0. 4) Tentukan step, yaitu jarak maksimum jumlah penambahan nilai x maupun nilai y dengan cara : bila nilai |Δy| > |Δx| maka step = nilai |Δy|. 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 0 6 5.8 Round(x), round(y) (5,5) (6,6) 1 2 3 4 7 8 9 10 6.6 7.4 8.2 9 (7,7) (8,7) (9,8) (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. mengembangkan algoritma klasik yang Bressenham 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 Kegiatan Praktikum 3.1 Membuat Titik Create_Point.java 38 public class Create_Point { public void render() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glColor3f(0.0f, 1.0f, 0.0f); glPointSize(10); glBegin(GL_POINTS); glVertex2f(100, 100); glVertex2f(200, 100); glVertex2f(200, 300); glVertex2f(100, 300); glVertex2f(150, 375); glVertex2f(375, 375); glVertex2f(425, 300); glVertex2f(425, 100); glEnd(); } public static void main(String[] args) { Create_Point main = null; try { System.out.println("Keys:"); System.out.println("esc - Exit"); main = new Create_Point(); main.create(); main.run(); } catch (Exception ex) { LOGGER.log(Level.SEVERE, ex.toString(), ex); } finally { if (main != null) { main.destroy(); } } } private void create() throws LWJGLException { Display.setDisplayMode(new DisplayMode(DISPLAY_WIDTH, DISPLAY_HEIGHT)); Display.setFullscreen(false); Display.setTitle("Create Point"); Display.create(); //Keyboard Keyboard.create(); //Mouse Mouse.setGrabbed(false); Mouse.create(); //OpenGL initGL(); resizeGL(); //To change body of generated methods, choose Tools | Templates. } private void run() { while (!Display.isCloseRequested() !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { && 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 public class Create_Line { public void render() { glColor3f(1.0f, 0.0f, 1.0f); glLineWidth(5); glBegin(GL_LINES); glVertex2f(100, 100); glVertex2f(100, 350); glVertex2f(200, 100); glVertex2f(300, 350); glVertex2f(350, 225); glVertex2f(550, 225); glEnd(); glFlush(); } public static void main(String[] args) { Create_Line main = null; try { System.out.println("Keys:"); System.out.println("esc - Exit"); main = new Create_Line(); main.create(); main.run(); } catch (Exception ex) { LOGGER.log(Level.SEVERE, ex.toString(), ex); 41 } finally { if (main != null) { main.destroy(); } } } private void create() throws LWJGLException { Display.setDisplayMode(new DisplayMode(DISPLAY_WIDTH, DISPLAY_HEIGHT)); } private void run() { .... } private void destroy() { .... } private void initGL() { .... } private void resizeGL() { .... } } Keluaran Program 42 E. Latihan Soal Buatlah kode program agar dapat menampilkan seperti sreenshoot di atas dengan menggunakan fungsi-fungsi primitive drawing dengan ketentuan sebagai berikut : Ukuran Window :DisplayMode(800, 600) Fungsi :glBegin(GL_LINE_LOOP); Titik awal :glVertex2d(200, 200); 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 IPK Hasil Yang Dicapai Peserta diklat mampu Peserta diklat mampu menerapkan konsep konsep dasar grafika computer untuk menggambar primitif objek dan berapa proses pencapaian kompetensinya Peserta diklat mampu menggunakan perintah-perintah dasar OpenGL menggambar untuk satu bentuk gabungan dari beberapa primiif objek dan berapa besar proses pencapaian kompetensinya Peserta diklat mampu menulis kode program sesuai algoritma pembentukan lingkaran garis dan berapa proses dan besar pencapaian kompetensinya H. Kunci Jawaban PrimitiveGaris.java import java.util.logging.Level; 44 Rencana Tindak Lanjut 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; public class PrimitiveGaris { public void draw() { glBegin(GL_LINE_LOOP); glVertex2d(200, 200); glVertex2d(600, 200); glVertex2d(200, 325); glVertex2d(600, 325); glVertex2d(200, 450); glVertex2d(600, 450); glEnd(); } public void render() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); 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 : GARIS"); Display.create(); 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(); } 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) { 46 } } Display.update(); Display.sync(60); } } private void update() { // } public void destroy() { Mouse.destroy(); Keyboard.destroy(); Display.destroy(); } public static void main(String[] args) { PrimitiveGaris b1 = new PrimitiveGaris(); try { b1.create(); b1.run(); } catch (LWJGLException ex) { Logger.getLogger(PrimitiveGaris.class.getName()).log(Level .SEVERE, null, ex); } 47 48 49 50 Pemodelan Objek 2 Dimensi A. Tujuan Pembelajaran Setelah mengikuti kegiatan belajar 4 ini peserta diklat diharapkan dapat : 1. Melalui diskusi peserta diklat dapat menganalisa pemodelan objek 2 Dimensi melalui transformasi geometri. 2. Melalui praktikum peserta diklat dapat membuat kode program dengan menggunakan operasi transformasi geomentri translasi, penskalaan,dan rotasi. B. Indikator Pencapaian Kompetensi 1. Peserta diklat mampu menerapkan operasi transformasi geometri translasi, penskalaan, dan rotasi 2. Peserta diklat mampu menerapkan operasi-operasi dasar OpenGL untuk membangun objek 2 dimensi 3. Peserta diklat mampu menulis kode program untuk memodelkan objek 2 dimensi melalui proses translasi, penskalaan, dan rotasi 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. 2. Pengenalan Operasi Transformasi Geometri Pada sub topik ini akan dipelajari Operasi Transformasi Geometri dan penerapannya dalam aplikasi sederhana. 3.1 Operasi Translasi Transformasi translasi merupakan suatu operasi yang menyebabkan perpindahan objek 2D dari satu tempat ke tempat yang lain. Perubahan ini berlaku dalam arah yang sejajar dengan sumbu X dan sumbu Y. Gambar 3 Proses translasi suatu objek Translasi dilakukan dengan penambahan translasi pada suatu titik koordinat dengan translasi vector, yaitu (tx,ty), dimana tx adalah translasi menurut sumbu x dan ty adalah translasi menurut sumbu y. Koordinat baru titik yang ditranslasi dapat diperoleh dengan menggunakan rumus : 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. 3.2 Operasi Rotasi Rotasi artinya berputar. Ketika suatu bentuk benda sengaja diputar maka perlu ditentukan pusat dan besar sudut putar, sedangkan translasi adalah pergeseran. Benda yang telah berpindah dari pusatnya berarti mengalami pergeseran, yaitu apakah dia bergerak maju mundur ataupun menuju ke atas bawah. Rotasi berbeda dengan translasi karena perubahan posisi pada translasi tidak mengacu pada suatu titik tertentu. Keistimewaan dari rotasi adalah jarak antara titik pusat dengan masing-masing bagian dari obyek yang diputar akan selalu tetap, seberapa jauh pun obyek itu diputar. Gambar 4 Proses rotasi dari sutu objek Pada sebuah aplikasi yang menggunakan grafik vektor dan grafik bitmap, rotasi dan translasi sangat di butuhkan. Untuk melakukan kedua proses ini bisa menggunakan source code yang tersedia yaitu: glTranslatef (x, y, z) digunakan untuk merubah titik posisi awal sumbu koordinat menuju posisi yang ditentukan sesuai koordinat x,y, dan z. 53 glRotatef (angle, x, y, z) digunakan untuk memutar suatu bidang pada sudut tertentu (angle). 3.3 Operasi Skala Penskalaan adalah suatu operasi yang membuat suatu objek berubah ukurannya baik 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. Koordinat baru diperoleh dengan x‟ = x + sx y„= y + sy (x,y) = titik asal sebelum diskala (x‟,y‟) = titik setelah diskala Nilai lebih dari 1 menyebabkan objek diperbesar, sebaliknya bila nilai lebih kecil dari 1, maka objek akan diperkecil. Bila (sx,sy) mempunyai nilai yang sama, maka skala disebut dengan uniform scalling. Gambar 5 Proses skala dari sutu objek Perintah yang terakhir yaitu glScale{f,d}(TYPEx,TYPEy,TYPEz) digunakan untuk mengalikan martiks yang sedang aktif dengan matriks yang memperbesar, objek. memperkecil atau merefleksikan Masing-masing koordinat x, y, z dari setiap titik pada objek dikalikan dengan argumen x, y, z. Perintah glScale merupakan satu-satunya perintah transformasi modelling yang mengubah ukuran objek. Jika nilai yang diberikan lebih besar dari 1.0 maka objek akan diperbesar, jika nilai yang diberikan kurang dari 1.0 maka objek akan diperkecil, dan jika nilai yang diberikan negatif, maka objek akan direfleksikan (dicerminkan). 54 D. Aktivitas Pembelajaran Kegiatan Praktikum 4.1 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 import import import import import import import import import import java.util.logging.Level; java.util.logging.Logger; static komgraf01.KomGraf01.DISPLAY_HEIGHT; static komgraf01.KomGraf01.DISPLAY_WIDTH; org.lwjgl.LWJGLException; org.lwjgl.input.Keyboard; org.lwjgl.input.Mouse; org.lwjgl.opengl.Display; org.lwjgl.opengl.DisplayMode; static org.lwjgl.opengl.GL11.*; static org.lwjgl.util.glu.GLU.gluOrtho2D; public class Translasi { public void draw(){ } public void render() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); 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); } 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); 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); } } } Kegiatan Praktikum 4.2 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 import import import import import import import import import import java.util.logging.Level; java.util.logging.Logger; static komgraf01.KomGraf01.DISPLAY_HEIGHT; static komgraf01.KomGraf01.DISPLAY_WIDTH; org.lwjgl.LWJGLException; org.lwjgl.input.Keyboard; org.lwjgl.input.Mouse; org.lwjgl.opengl.Display; org.lwjgl.opengl.DisplayMode; static org.lwjgl.opengl.GL11.*; static org.lwjgl.util.glu.GLU.gluOrtho2D; public class Rotasi { public void draw(){ //membuat titik } public void render() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glColor3d(1, 0, 0); buatKotak(); glRotated(15, 0, 0, 1.0); glColor3f(1, 1, 0); buatKotak(); glRotated(-45, 0, 0, 1.0); glColor3f(0, 0, 1); buatKotak(); glFlush(); } public void buatKotak() { //membuat kotak glBegin(GL_POLYGON); 58 glVertex2f(300, glVertex2f(500, glVertex2f(500, glVertex2f(300, glEnd(); 300); 300); 360); 360); //titik //titik //titik //titik kiri bawah kanan bawah kanan atas kiri atas } 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); } } } Kegiatan Praktikum 4.3 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 import import import import import import import import import 60 java.util.logging.Level; java.util.logging.Logger; static komgraf01.KomGraf01.DISPLAY_HEIGHT; static komgraf01.KomGraf01.DISPLAY_WIDTH; org.lwjgl.LWJGLException; org.lwjgl.input.Keyboard; org.lwjgl.input.Mouse; org.lwjgl.opengl.Display; org.lwjgl.opengl.DisplayMode; static org.lwjgl.opengl.GL11.*; import static org.lwjgl.util.glu.GLU.gluOrtho2D; public class Skala { public void draw(){ //membuat titik } public void render() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glColor3d(1, 0, 0); buatKotak(); 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 1. Buatlah aplikasi sederhana Objek 2 Dimensi seperti gambar dibawah ini 62 F. Rangkuman Translasi adalah proses 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 dalam jarak yang sama. Pergerakan tersebut dapat berlaku dalam arah sumbu X saja, atau dalam arah sumbu Y saja atau keduanya. Rotasi artinya berputar. Ketika suatu bentuk benda sengaja diputar maka perlu ditentukan pusat dan besar sudut putar. sedangkan translasi adalah pergeseran. Benda yang telah berpindah dari pusatnya berarti mengalami pergeseran, yaitu apakah dia bergerak maju mundur ataupun menuju ke atas bawah. Penskalaan 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. G. Umpan Balik IPK Hasil Yang Dicapai Rencana Tindak Lanjut Peserta diklat mampu menerapkan operasi transformasi geometri translasi, penskalaan, dan rotasi dan berapa proses pencapaian kompetensinya Peserta diklat mampu menerapkan operasi-operasi dasar OpenGL untuk membangun objek 2 dimensi dan berapa besar proses pencapaian kompetensinya Peserta diklat mampu menulis kode program untuk memodelkan 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; public class Tugas2D { private int width=600; private int height=600; public void draw(){ //membuat titik } public void render() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, width, 0, height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); 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 Setelah mengikuti kegiatan belajar 5 ini peserta diklat diharapkan dapat : 1. Melalui diskusi peserta diklat dapat menganalisis sistem koordinat 3 dimensi dan pembuatan objek 3 dimensi 2. Melalui praktikum peserta diklat dapat membuat kode program untuk melakukakan operasi transformasi pada objek 3 dimensi. B. Indikator Pencapaian Kompetensi 1. Peserta diklat mampu memahami sistem koordinat dan struktur objek 3 dimensi 2. Peserta diklat mampu menerapkan operasi-operasi dasar OpenGL untuk membangun objek 3 dimensi 3. Peserta diklat mampu menulis kode program untuk memodelkan objek 3 dimensi melalui proses translasi, penskalaan, dan rotasi C. Uraian Materi Pembeda objek 2 dimensi dan 3 dimensi adalah kedalaman. Kedalaman didefinisikan sebagai jarak antara viewer terhadap benda yang dia lihat. Ini berarti berbeda dengan objek 2 dimensi yang hanya menggunakan 2 ukuran, yaitu panjang dan lebar, maka 3 dimensi menggunakan 3 ukuran, yaitu panjang, lebar dan kedalaman. Secara geometri ketiga ukuran tersebut disimbolkan dengan sumbu x, y, dan z. 1. Sistem Koordinat Salah satu sistem koordinat yang dikenal adalah sistem koordinat kartesian yang digunakan untuk membedakan lokasi atau posisi sembarang titik atau objek dengan titik atau objek yang lain. Sistem koordinat kartesian terdiri atas sistem koordinat kartesian 2 dimensi dan 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 2. Pemodelan Objek 3 Dimensi Benda tiga dimensi disusun dari sekumpulan permukaan objek. Gambar di bawah memberikan contoh bagaimana permukaan objek digunakan untuk menyusun benda tiga dimensi. 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 sebuah objek gambar. Titik sudut dari sedangkan garis penyusun Polygon disebut edge. 72 Polygon membentuk disebut vertex Gambar 8 Vertex dan Edge Polygon digambar dengan menggambar masing-masing edge dengan – setiap edge merupakan pasangan dari kecuali untuk edge terakhir merupakan pasangan dari – Bentuk untuk polygon yang paling tepat digunakan . membuat permukaan benda tiga dimensii adalah polygon segitiga (triangle). Hal ini disebabkan polygon segitiga akan selalu berada dalam keadaan planar (datar) sementara polygon dengan vertex lebih dari 3 dapat berada dalam kondisi non-planar karena salah satu vertex tidak berada di lokasi yang sejajar. Satu hal yang harus diperhatikan pada saat menggunakan polygon segitiga adalah winding. Winding adalah urutan dan arah vertex-vertex penyusun polygon. Winding menganggap bahwa arah vertex berlawanan jarum jam sebagai tampak depan sedangkan arah vertex searah jarum jam dianggap sebagai bagian belakang benda. 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. Kegiatan Praktikum 5.1 Keluaran Program yang diharapkan Perancangan class diagram 74 lwjgl.OpenGL CGApplication PrimitiveDrawing3D -x : int -y : int -z : int +glTriangle() : void +main() : void CfgApplication.java import import import import import import import import static org.lwjgl.opengl.GL11.*; static org.lwjgl.util.glu.GLU.*; java.awt.Font; org.lwjgl.LWJGLException; org.lwjgl.Sys; org.lwjgl.input.Keyboard; org.lwjgl.opengl.Display; org.lwjgl.opengl.DisplayMode; public abstract class CfgApplication { protected long lastFrame; protected int fps; protected long last; protected String windowTitle = ""; protected int width; protected int height; protected boolean fullscreen; protected boolean vsync; public final int DEFAULT_FONT_SIZE = 14; protected boolean showFPS; protected int oldfps; protected int activeFontTextureId; public void start(int width, int height, boolean fullscreen, boolean vsync, boolean showFPS, String windowTitle) { this.windowTitle = windowTitle; this.height = height; this.width = width; this.fullscreen = fullscreen; this.vsync = vsync; this.showFPS = showFPS; try { 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; public class PrimitiveDrawing3D extends CGApplication { private boolean wireframe = false; private boolean pressed = false; @Override public void init() { } @Override public void update(int delta) { toggleWireframe(); } public void toggleWireframe() { if (Keyboard.isKeyDown(Keyboard.KEY_R)) { if (!pressed) { wireframe = !wireframe; pressed = true; } } else { pressed = false; } } @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, 0.0f); 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); glColor3f(0.0f, 1.0f, 1.0f); glVertex3f(2, -2, -10); glVertex3f(2, -2, -14); glVertex3f(0, 4, -12); glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(2, -2, -14); glVertex3f(-2, -2, -14); glVertex3f(0, 4, -12); glColor3f(0.0f, 0.0f, 1.0f); 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); glColor3f(1.0f, 0.0f, 0.5f); glVertex3f(2, -2, -10); glVertex3f(2, -2, -14); glVertex3f(-2, -2, -14); glEnd(); renderText(); } private void renderText() { drawString(180, height - 25 , "Primitive Drawing : 4-Sisi Piramid Triangles."); drawString(200,height-35* getDefaultFont().getLineHeight(), "Tekann 'R' untuk Gambar Rangka"); } @Override public void deinit() { } public static void main(String[] args) { PrimitiveDrawing3D app = new PrimitiveDrawing3D(); app.start(800, 600, false, false, true, "3D Primitives"); } } } 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 ukuran, dan lebar, maka objek 3 dimensi menggunakan 3 yaitu panjang hanya menggunakan 2 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 mempertimbangkan proses koordinat transformasinya yang dilakukan dengan merupakan besarnya kedalaman dari objek. G. Umpan Balik IPK Hasil Yang Dicapai Peserta diklat mampu memahami sistem koordinat dan struktur objek 3 dimensi dan berapa proses pencapaian kompetensinya Peserta diklat mampu menerapkan operasi-operasi dasar OpenGL untuk membangun objek 3 dimensi dan berapa besar proses pencapaian kompetensinya Peserta diklat mampu menulis kode program untuk memodelkan objek 3 dimensi melalui proses translasi, penskalaan, dan rotasi dan berapa besar proses pencapaian kompetensinya H. Kunci Jawaban Jawaban no 1 A = (3,4) B = (2,1) C = (2,5) Vektor (V) = (2,5) Rumus : ta 80 x’ = x + tx y’ = y + ty Rencana Tindak Lanjut A = (3,4) X’ = x + tx =3+2=5 Y’ = y + ty =4+5=9 A’ = (5,9) V = (2,5) B = (2,1) X’ = x + tx =2+2=4 Y’ = y + ty =1+5=6 B’ = (4,6) V = (2,5) C = (4,1) X’ = x + tx = 4+2=6 Y’ = y + ty =1+5=6 C’ = (6,6) V = (2,5) Dengan demikian hasil translasi segitiga dengan A’(5,9) B’(4,6) C’(6,6). koordinat Segitiga yang baru sama bentuknya dengan segitiga yang lama. Berikut gambar 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 A = (5,2) Skala faktor = (1,2) X’ = X . Sx =5.1=5 Y’ = Y. Sy =2.2=4 A’ = (5,4) C = (2,4) Skala faktor = (1,2) X’ = X . Sx =2.1=2 Y’ = Y. Sy =4.2=8 C’ = (2,8) B = (2,2) Skala faktor = (1,2) X’ = X . Sx =2.1=2 D = (5,4) Skala faktor = (1,2) X’ = X . Sx =5.1=5 81 Y’ = Y. Sy =2.2=4 B’ = (2,4) Y’ = Y. Sy =4.2=8 D’ = (5,8) Dengan demikian hasil skala persegi panjang dengan koordinat A’ = (5,4), B’ = (2,4), C = (2,8), D = (5,8). Persegi panjang yang baru sama bentuknya dengan persegi panjang yang lama.Berikut gambar koordinat setelah proses rotasi. 82 83 84 embuatan Teksture A. Tujuan Pembelajaran Setelah mengikuti kegiatan belajar 6 ini peserta diklat diharapkan dapat : 1. Melalui diskusi peserta diklat dapat menganalisis penggunaan teksture dalam objek 3 dimensi. 2. Melalui praktikum peserta diklat dapat menulis kode program pemasangan teksture dalam objel 3 dimensi B. Indikator Pencapaian Kompetensi 1. Peserta diklat dapat memahami jenis-jenis tekture dalam OpenGL 2. Peserta diklat mampu menulis kode program dengan memanfaatkan jenisjenis teksture yang dalam library OpenGL 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. Gambar 10 Teknik pemetaan teksture 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 Pembuatan kode program untuk texture terhadapa objek 3 dimensi dirancang dengan melibatkan beberapa file java untuk memudahkan dalam pengaturan dan operasi transformasi geometri. Kegiatan Praktikum 6.1 Keluaran Program Perancangan class diagram 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 import import import import import import import static org.lwjgl.opengl.GL11.*; static org.lwjgl.util.glu.GLU.*; java.awt.Font; org.lwjgl.LWJGLException; org.lwjgl.Sys; org.lwjgl.input.Keyboard; org.lwjgl.opengl.Display; org.lwjgl.opengl.DisplayMode; public abstract class CGApplication { protected long lastFrame; protected int fps; protected long last; protected String windowTitle = ""; protected int width; protected int height; protected boolean fullscreen; protected boolean vsync; public final int DEFAULT_FONT_SIZE = 14; protected boolean showFPS; protected int oldfps; protected int activeFontTextureId; public void start(int width, int height, boolean fullscreen, boolean vsync, boolean showFPS, String windowTitle) { this.windowTitle = windowTitle; this.height = height; this.width = width; this.fullscreen = fullscreen; this.vsync = vsync; this.showFPS = showFPS; try { 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 import import import import import import import import import import import import import import import java.awt.color.ColorSpace; java.awt.geom.AffineTransform; java.awt.image.AffineTransformOp; java.awt.image.BufferedImage; java.awt.image.ColorModel; java.awt.image.ComponentColorModel; java.awt.image.DataBuffer; java.awt.image.DataBufferByte; java.awt.image.Raster; java.awt.image.WritableRaster; java.io.IOException; java.net.URL; java.nio.ByteBuffer; java.nio.ByteOrder; java.util.Hashtable; javax.imageio.ImageIO; import org.newdawn.slick.util.ResourceLoader; public class Texture { private ColorModel glAlphaColorModel = new ComponentColorModel( ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[] { 8, 8, 8, 8 }, true, false, ComponentColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE); private ColorModel glColorModel = new ComponentColorModel( ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[] { 8, 8, 8, 0 }, false, false, ComponentColorModel.OPAQUE, DataBuffer.TYPE_BYTE); private ByteBuffer imageData; private int width; private int height; private ByteBuffer convertImageData(BufferedImage bufferedImage) { ByteBuffer imageBuffer; WritableRaster raster; BufferedImage texImage; int texWidth = bufferedImage.getWidth(); int texHeight = bufferedImage.getHeight(); if (bufferedImage.getColorModel().hasAlpha()) { raster= Raster.createInterleavedRaster( DataBuffer.TYPE_BYTE,texWidth, texHeight, 4, null); texImage = new BufferedImage(glAlphaColorModel, raster, false,new Hashtable<String, Object>()); } else { raster =Raster.createInterleavedRaster( 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() { // Load image data m_texture = new Texture(); if (!m_texture.load("pic/tree.png")) { System.out.println("Failed to load texture\n"); System.exit(1); return; } // 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()); // Set magnification and minification filter glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glDisable(GL_TEXTURE_2D); } @Override public void update(int delta) { angle += 0.05f; } private void drawTexturedQuads() { glBegin(GL_QUADS); glTexCoord2d(0, 0); glVertex3f(-2.0f, -2.0f, 0.0f); glTexCoord2d(1, 0); glVertex3f(2.0f, -2.0f, 0.0f); glTexCoord2d(1, 1); glVertex3f(2.0f, 2.0f, 0.0f); glTexCoord2d(0, 1); glVertex3f(-2.0f, 2.0f, 0.0f); glEnd(); 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 : Disediakan dua buah file gambar seperti berikut ini : 96 gedungA.png gedungB.png F. Rangkuman Texturing merupakan proses mewarnai, memberi tekstur, atau memberi efek material pada sebuah model 3D. Texture mapping adalah teknik shading untuk pengolahan gambar yang memetakan sebuah fungsi pada permukaan tiga dimensi dalam scene. Fungsi yang dipetakan mencakup satu dimensi, dua dimensi, dan tiga dimensi dan dapat digambarkan sebagai array atau fungsi matematika atau gambar. 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. OpenGl menyediakan banyak sekali jenis texture yang dapat digunakan untuk membuat objek 2 dimensi dan 3 dimensi menjadi sangat menarik. 97 G. Umpan Balik IPK Hasil Yang Dicapai Rencana Tindak Lanjut Peserta diklat dapat memahami jenis-jenis tekture dalam OpenGL dan berapa proses pencapaian kompetensinya Peserta diklat mampu menulis kode program dengan memanfaatkan jenis-jenis teksture yang dalam library OpenGL dan berapa besar proses pencapaian kompetensinya H. Kunci Jawaban Perancangan class diagram lwjgl.OpenGL CGApplication TextureGedung -Texture : CGApplication = txture +loadImage() : void +main() : void Texture -width : int -height : int +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 import import import import import import import import import import import import import import import import import import import setting.CfgApplication; setting.Texture; java.awt.geom.Point2D; static org.lwjgl.opengl.GL11.*; static org.lwjgl.util.glu.GLU.*; java.io.IOException; java.nio.IntBuffer; java.util.logging.FileHandler; java.util.logging.Level; java.util.logging.Logger; org.lwjgl.BufferUtils; org.lwjgl.LWJGLException; org.lwjgl.input.Keyboard; org.lwjgl.input.Mouse; org.lwjgl.opengl.Display; static org.lwjgl.opengl.Display.update; org.lwjgl.opengl.DisplayMode; org.lwjgl.opengl.GL11; static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; org.lwjgl.util.glu.GLU; public class TeksturGedung extends CGApplication { public static final int DISPLAY_HEIGHT = 480; public static final int DISPLAY_WIDTH = 640; private final int[] m_texID = new int[14]; public final static int NO_WRAP = -1; private Texture m_texture; public static void main(String[] args) { // TODO code application logic here TeksturGedung main = new TeksturGedung(); main.start(800,600,false,false,true,"Tekstur Gedung"); } public void render() { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(width)/(height), 1.0f, 700.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 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); glEnable(GL_TEXTURE_2D); glPushMatrix(); 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 Setelah mengikuti kegiatan belajar 7 ini peserta diklat diharapkan dapat : 1. Melalui diskusi peserta diklat dapat menganalisis pemanfaatan teknik kamera dengan transformasi proyeksi 2. Melalui praktikum peserta diklat dapat menulis kode program untuk melakukan pergerakkan objek 3 dimensi melalui transformasi proyeksi B. Indikator Pencapaian Kompetensi 1. Peserta diklat dapat memahami teknik pengambilan gambar dengan kamera 2. Peserta diklat dapat menerapkan transformasi proyeksi, transformasi viewing, dan transformasi modeling 3. Peserta diklat dapat menulis kode program untuk melakukan pengerakan objek 3 dimensi melalui transformasi proyeksi, transformasi viewing, dan transformasi modeling 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. Gambar 10. Analogi pengambilan gambar oleh kamera Untuk menghasilkan gambar dari obyek dengan skenario tertentu kita harus melakukan beberapa proses, yaitu: melakukan pengesetan kamera dalam bentuk setting lensa kamera (Transformasi Proyeksi ), mengarah kamera dengan mengatur letak tripod (Transformasi Viewing), mengatur letak obyek (Transformasi Modeling), dan mengatur skala dan layout dari foto (Transformasi Viewport) Transformasi Viewport dengan menggunakan perintah glViewport(). Pada bab ini, akan dipelajari transformasi-transformasi lainnya. 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 Ortogonal/Paralel (Orthogonal Transformation) dan Transformasi Transformasi Perspektif(Perspective Transformation). Gambar 11 Transformasi Ortogonal dan Transformasi Proyektif. Transformasi orthogonal dengan parameter default. Transformasi ini membuat jarak benda relatif terhadap kamera tidak berpengaruh pada citra benda tersebut. Biasanya transformasi ini digunakan pada aplikasi-aplikasi teknik seperti gambar teknik (cf. Gambar 6). Untuk merubah parameter transformasi ortogonal dapat 107 menggunakan perintah glOrtho() dengan didahului proses merubah status OpenGL mode ke proyeksi dengan perintah glMatrixMode(GL_PROJECTION). Gambar 12. Transformasi ortogonal Pada transformasi jenis ini jarak benda akan mempengaruhi gambar yang di buat. Parameter transformasi jenis ini dapat dirubah dengan menggunakan gluPerspective()/glFrustum() , juga 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 Perancangan class diagram lwjgl.OpenGL Block -x : int -y : int -z : int -width : int -height : int -dept : int -shape : int +getWidth() : int +getHight() : int +render() : void TextureMapping -camera_x : float -camera_y : float -camera_z : float -camera_rot : float +kontrolKeyboard() : void +main() : void Block.java import import import import import import import import import 110 java.util.Random; static org.lwjgl.opengl.GL11.*; static org.lwjgl.util.glu.GLU.*; java.io.IOException; java.util.logging.FileHandler; java.util.logging.Level; java.util.logging.Logger; org.lwjgl.LWJGLException; org.lwjgl.input.Keyboard; import import import public public public org.lwjgl.input.Mouse; org.lwjgl.opengl.Display; org.lwjgl.opengl.DisplayMode; class Block { float x, y, z, width, height, depth, shade; 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 import import import import import import import import import import import import import java.util.Random; static org.lwjgl.opengl.GL11.*; static org.lwjgl.util.glu.GLU.*; java.io.IOException; java.util.ArrayList; java.util.logging.FileHandler; java.util.logging.Level; java.util.logging.Logger; org.lwjgl.LWJGLException; org.lwjgl.Sys; org.lwjgl.input.Keyboard; org.lwjgl.input.Mouse; org.lwjgl.opengl.Display; org.lwjgl.opengl.DisplayMode; public class UjiCamera { public static float camera_x, camera_y, camera_z, camera_rot; public static ArrayList<Block> blocks = new ArrayList<Block>(); 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); for (int i = 0; i < blocks.size(); i++) { blocks.get(i).render(); } } public void generateWorld() { blocks.clear(); int heightlevel = 0; Random r = new Random(); for (int i = 0; i < 50; i++) { for (int j = 0; j < 50; j++) { 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. Jelaskan ilustrasi yang ditunjukkan dalam gambar di atas. 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 transformasi tersebut adalah Transformasi piramidanya. Dua tipe Ortogonal/Paralel (Orthogonal Transformation) dan Transformasi Perspektif(Perspective Transformation). G. Umpan Balik IPK Hasil Yang Dicapai Rencana Tindak Lanjut Peserta diklat dapat memahami teknik pengambilan gambar dengan kamera dan berapa proses pencapaian kompetensinya Peserta diklat dapat menerapkan transformasi proyeksi, transformasi viewing, dan transformasi modeling dan berapa besar proses pencapaian kompetensinya Peserta diklat dapat menulis kode program untuk melakukan pengerakan objek 3 dimensi melalui transformasi proyeksi, transformasi viewing, dan transformasi modeling dan berapa besar proses pencapaian kompetensinya 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 Setelah mengikuti kegiatan belajar 8 ini peserta diklat diharapkan dapat : 1. Melalui diskusi peserta diklat dapat menganalisis pemanfaatan rendering pada image melalui lighting dan shading. 2. Melalui praktikum peserta diklat dapat menulis kode program untuk melakukan rendering pada image melalui lighting dan shanding. B. Indikator Pencapaian Kompetensi 1. Peserta diklat mampu menggambarkan proses rendering pada sebuah image 2. Peserta diklat mampu menerapkan proses lighting dan shading 3. Peserta diklat mampu menulis kode program untuk melakukan rendering pada sebuah image melalui lighting dan shanding C. Uraian Materi Rendering merupakan salah satu teknik pencitraan objek 3 dimensi untuk mendapatkan image yang realistis dengan penambahan beberapa efek, seperti pencahayaan dan shading. Kebanyakan manusia menggemari sesuatu yang hidup, bukan yang kaku dan statik. 1. Warna Warna sebenarnya merupakan persepsi kita terhadap pantulan cahaya dari benda-benda di depan mata. Tidak ada ketentuan jumlah warna dasar tetapi dalam implementasi dengan komputer hanya dibutuhkan tiga warna dasar. Ada berbagai model untuk menyatakan warna dasar serta rentang warna yang dihasilkan, salah satu diantaranya adalah RGB. Model warna RGB dapat digambarkan sebagai sebuah kotak yang mempunyai tiga sumbu yaitu : R(red), G(green), B(blue), dimana nilai masing-masing sumbu berkisar dari 0 sampaii 1. Warna ditentukan berdasarkan lokasi warna tersebut terhadap Sumbu RGB. 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) 3. Metode Flat Shading Flat shading mempunyai adalah salah satu teknik shading dimana satu face 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. 4. Metode Gouraud Shading Metode ini merender sebuah permukaan Polygon dengan interpolasi linier yaitu nilai intensitas yang mengenai setiap permukaan berbeda. Warna yang dipantulkan dihitung tiap Membuat suatu vertex kemudian permukaan Polygon secara dengan halus diinterpolasikan. menginterpolasikan nilai intensitas secara linier ke seberang permukaan. Nilai intensitas untuk masingmasing Polygon dipasangkan sepanjang tepi (edges) dengan nilai dari Polygon yang bersebelahan yang umum, dengan begitu menghentikan penghapusan intensitas yang dapat terjadi di flat shading. Penggunaan diinterpolasikan menggunakan level abu-abu yang berbeda di antara titik. Masing-masing gouraud shading di sepanjang permukaan Polygon Polygon dibuat dengan melakukan perhitungan sebagai berikut : Tentukan satuan vektor normal rata-rata pada setiap titik ujung Polygon. Pakaikan model iluminasi untuk setiap titik untuk menghitung intensitas titik. Interpolasikan secara linier intensitas titik pada permukaan 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 Perancangan class diagram 125 lwjgl.OpenGL CGApplication Texture -width : int -height : int +getWidth() : int +getHight() : int LightingShading -Camera : CGApplication = cmr -Texture : CGApplication = textr +loadImage() : void +main() : void Camera -viewCamX : int -viewCamY : int -viewCamZ : int -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 Sama dengan kode program pada kegiatan praktikum 6.1 Texture.java Sama dengan kode program pada kegiatan praktikum 6.1 Camera.java import import import import public 126 static org.lwjgl.util.glu.GLU.*; org.lwjgl.input.Keyboard; org.lwjgl.input.Mouse; org.lwjgl.opengl.Display; class Camera { private float viewCamX, viewCamY, viewCamZ, upCamX, upCamY, upCamZ,posCamX, posCamY, posCamZ, CAMERA_SPEED; private void moveCamera(float speed) { 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(); int midX = width >> 1; int midY = height >> 1; float angleY = 0.0f; float angleZ = 0.0f; // Get mouse position mouseX = Mouse.getX(); mouseY = Mouse.getY(); if ((mouseX == midX) && (mouseY == midY)) { return; } Mouse.setCursorPosition(midX, midY); angleY = (float) ((midX - mouseX)) / 1000; angleZ = (float) ((midY - mouseY)) / 1000; viewCamY += angleZ * 2; if ((viewCamY - posCamY) > 8) { viewCamY = posCamY + 8; } if ((viewCamY - posCamY) < -8) { viewCamY = posCamY - 8; } rotateCamera(-angleY); } public void init() { 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 import import import import import import import import java.nio.FloatBuffer; java.nio.IntBuffer; org.lwjgl.BufferUtils; org.lwjgl.input.Keyboard; setting.CGApplication; setting.Camera; setting.Texture; static org.lwjgl.opengl.GL11.*; static org.lwjgl.util.glu.GLU.*; public class LightingShading extends CGApplication { private Texture m_texture; private final int[] m_texID = new int[2]; private boolean KEY_0_pressed, KEY_1_pressed, KEY_2_pressed, light0_ON,light1_ON, light2_ON; public final static int NO_WRAP = -1; 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); FloatBuffer ambientPointLight = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 0.5f, 0.5f, 0.5f, 1.0f }).flip(); FloatBuffer diffusePointLight = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 0.5f, 0.5f, 0.5f, 1.0f }).flip(); FloatBuffer specularPointLight = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 1.0f, 1.0f, 1.0f, 1.0f }).flip(); FloatBuffer ambientDirectionalLight = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 1.0f, 0.0f, 1.0f }).flip(); FloatBuffer diffuseDirectionalLight = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 1.0f, 0.0f, 1.0f }).flip(); FloatBuffer ambientSpotLight = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 1.0f, 0.0f, 0.0f, 1.0f }).flip(); FloatBuffer diffuseSpotLight = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 1.0f, 0.0f, 0.0f, 1.0f }).flip(); FloatBuffer directionallightPosition = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 6.0f, 0.5f, 0.0f, 0.0f }).flip(); FloatBuffer pointlightPosition = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 6.0f, 0.5f, 0.0f, 1.0f }).flip(); FloatBuffer spotlightPosition = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 10.0f, 3.0f, 0.0f, 1.0f }).flip(); FloatBuffer spotlightDirection = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { -1.0f, 0.0f, -1.0f, 1.0f }).flip(); FloatBuffer matAmbient = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 1.0f, 1.0f, 1.0f, 1.0f }).flip(); FloatBuffer matDiff = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 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(); glLight(GL_LIGHT0, GL_AMBIENT, ambientPointLight); glLight(GL_LIGHT0, GL_DIFFUSE, diffusePointLight); glLight(GL_LIGHT0, GL_SPECULAR, specularPointLight); glLight(GL_LIGHT0, GL_POSITION, pointlightPosition); glLight(GL_LIGHT1,GL_AMBIENT,ambientDirectionalLight); glLight(GL_LIGHT1, GL_DIFFUSE, diffuseDirectionalLight); glLight(GL_LIGHT1,GL_POSITION, directionallightPosition); glLight(GL_LIGHT2, GL_AMBIENT, ambientSpotLight); glLight(GL_LIGHT2, GL_DIFFUSE, diffuseSpotLight); glLight(GL_LIGHT2, GL_POSITION, spotlightPosition); glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 15.0f); glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 5.0f); glLight(GL_LIGHT2,GL_SPOT_DIRECTION, spotlightDirection); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glMaterial(GL_FRONT, GL_SPECULAR, matSpecular); glMaterial(GL_FRONT, GL_AMBIENT, matAmbient); glMaterial(GL_FRONT, GL_DIFFUSE, matDiff); glMaterialf(GL_FRONT, GL_SHININESS, 10.0f); } @Override public void update(int delta) { camera.update(); toggleKey(); } public void toggleKey() { if (Keyboard.isKeyDown(Keyboard.KEY_0)) { if (!KEY_0_pressed) { light0_ON = !light0_ON; KEY_0_pressed = true; } } else { KEY_0_pressed = false; } 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(); } void drawFloor(int texID, float width) { // floor glBindTexture(GL_TEXTURE_2D, texID); glBegin(GL_QUADS); glNormal3f(0, 1, 0); glTexCoord2d(0, 0); glVertex3f(-width, 0, width); glTexCoord2d(width, 0); glVertex3f(width, 0, width); glTexCoord2d(width, width); glVertex3f(width, 0, -width); glTexCoord2d(0, width); glVertex3f(-width, 0, -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_tex ture.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 == 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 mempunyai adalah salah satu teknik shading dimana satu face 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 IPK Hasil Yang Dicapai Rencana Tindak Lanjut Peserta diklat mampu menggambarkan proses rendering pada sebuah imagedan berapa proses pencapaian kompetensinya Peserta diklat mampu menerapkan proses lighting dan shading dan berapa besar proses pencapaian kompetensinya Peserta diklat mampu menulis kode program untuk melakukan rendering pada sebuah image melalui lighting dan shanding dan berapa besar proses pencapaian kompetensinya 137 H. Kunci Jawaban Perancangan class diagram lwjgl.OpenGL CGApplication Texture -width : int -height : int +getWidth() : int +getHight() : int VirtualGedungKota -Camera : CGApplication = cmr -Texture : CGApplication = textr +loadImage() : void +main() : void 138 Camera -viewCamX : int -viewCamY : int -viewCamZ : int -upCamX : int -upCamY : int -upCamZ : int -posCamX : int -posCamY : int -posCamZ : int -camaera_speed : int +moveCamera() : void +rotateCamera() : void +strafeCamera() : void +render() : void PENUTUP Kesimpulan dan Saran 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 1. Elemen-elemen yang menjadi konsentrasi utama pada grafika komputer adalah , kecuali….. a. Modeling b. Rendering c. Animation d. Transformation 2. Bagian gambar yang memperlihatkan keseluruhan bentuk dan fitur internal dari sebuah objek disebut…. a. Raster b. Pixel c. Wireframe d. Scene 3. Sintaks perintah OpenGL mengikuti aturan penulisan dari library dimana fungsi tersebut berasal, format penulisan fungsi OpenGL adalah ... a. Semua perintah OpenGL menggunakan awalan gl diikuti dengan huruf kapital pada setiap kata membentuk nama perintah contoh glClearColor. b. Semua perintah OpenGL menggunakan awalan GL diikuti dengan huruf kapital pada setiap kata membentuk nama perintah contoh GLClearColor. c. Semua perintah OpenGL menggunakan awalan _gl diikuti dengan huruf kapital pada setiap kata membentuk nama perintah contoh _glClearColor. d. Semua perintah OpenGL menggunakan awalan _GL diikuti dengan huruf kapital pada setiap kata membentuk nama perintah contoh _GLClearColor. 4. Perhatikan posisi titik dalam koordinat cartesian seperti dalam gambar di bawah, pernyataan yang benar adalah ... 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) b (0,0) (640,0) a. Garis a(100,240)(500,240) dan Garis b(320,100)(320,420) b. Garis a(100,240)(240,500) dan Garis b(320,100)(420,320) c. Garis a(100,240)(500,240) dan Garis b(320,100)(320,-220) d. Garis a(100,240)(240,400) dan Garis b(320,100)(320,320) 9. Gambar dibawah ini adalah proses .... pada bidang komputer grafik 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); a. segitiga dengan tiga titik dengan satuan float b. segitiga dengan tiga titik dengan satuan integer c. persegiempat dengan tiga titik dengan satuan integer d. persegiempat dengan tiga titik dengan satuan float 14. Jika diketahui nilai koordinat dua titik (4,5) dan (10,9) maka dengan menggunakan algoritma DDA diperoleh nilai step yang tepat adalah… i. 6 j. 5 k. 4 l. 3 15. Gambar di bawah ini adalah proses pembuatan objek 3D dari sebuah kubus, Hitunglah jumlah titik, sisi(face), dan jumlah titik setiap face .... 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). Algoritma DDA adalah algoritma pembentukan garis berdasarkan perhitungan Δx dan Δy, menggunakan rumus y = m. Δ x. Garis dibuat dengan menentukan dua endpoint yaitu titik awal dan titik akhir. Flat shading mempunyai adalah salah satu teknik shading dimana satu face 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. Grafika Komputer adalah proses untuk menciptakan suatu gambar berdasarkan deskripsi obyek maupun latar belakang yang terkandung pada suatu gambar. Grafis komputer adalah suatu bidang ilmu yang mempelajari bagaimana membangun grafik (gambar) baik 2D maupun 3D yang kelihatan nyata dengan menggunakan komputer. Salah satu bidang grafika komputer yang sangat terkenal adalah desain grafis 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. Lighting atau Pencahayaan pada grafik komputer bertujuan untuk memberikan efek nyata pada objek. Efek nyata disini berarti, cahaya yang disebarkan ke objek dapat memberikan efek cahaya yang sesungguhnya. Objek grafik 2 dimensi adalah sekumpulan titik-titik 2 dimensi yangdihubungkan dengan garis lurus, baik berupa polyline, polygon atau kurva. 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). Polyline adalah suatu fungsi yang digunakan untuk menggambarkan objek 2D yang sudah didefinisikan di depan, dimana setiap titik pada objek mulai titik ke 0, 1, 2,3,..., n dihubungkan dengan garis lurus sehingga membentuk kurva terbuka. Primitive Drawing merupakan cara mudah untuk menggambar pada layar monitor menggunakan teori geometri sederhana. Macam-macam primitive drawing seperti menggambar sebuah titik, garis, atau gabungan antar keduanya. Rendering merupakan salah satu teknik pencitraan objek 3 dimensi untuk mendapatkan image yang realistis dengan penambahan beberapa efek, seperti pencahayaan dan shading. 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. Texturing merupakan proses mewarnai, memberi tekstur, atau memberi efek material pada sebuah model 3D. Texture mapping adalah teknik shading untuk pengolahan gambar yang memetakan sebuah fungsi pada permukaan tiga dimensi dalam scene 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. Vertek adalah titik dalam 3 dimensi yang terdiri dari (x,y,z) 149 150 DAFTAR PUSTAKA Achmad Basuki, Nana Ramadijanti. 2006. Grafika Komputer - Teori dan Implementasinya. Yogyakarta Andi Offset Chua Hock-Chuan. 2012. 3D Graphics with OpenGL. Basic Theory. Listian Pratomo. 2007. Membuat Grafik di Java. www.ilmukomputer.com Maliki, Irfan.2010. Grafika Komputer. Yogyakarta Andi Offset. Modul 4 Grafika Komputer Universitas Negeri Malang: Transformasi Objek. 2013. Prihatmanto, Ary Setijadi. 2007. EC5130 – Grafika Komputer dan Pemrograman GPU. Suplemen Diktat Kuliah. OpenGL Tutorial dengan GLUT: Fixed Pipeline. ______________.2015. Learning LWJGL. http://wiki.lwjgl.org/wiki/Learning_LWJGL (online). ______________.2006. Grafik Komputer :Transformasi Geometri2 Dimensi. Universitas Gunadarma ______________.Diktat Kuliah Grafika Kompute BAB 2 Transformasi 2D .http://pdf.nscpolteksby.ac.id/2-Transformasi%202D-20140317.pdf 151