Monday 11 April 2016

Skripsian #1

Assalaamu'alaykum, ya Ahli Kampus!

Udah lama rasanya gua gak update lagi di blog ini. Dan sekalinya update, gua akan langsung ngebahas sesuatu yang saat ini sedang ramai-ramainya digarap anak-anak seangkatan gua, yaitu mengerjakan tugas akhir alias "Skripi" (ada juga yang bilang Skripsuit atau Skripsweet atau Skripsheep, atau Skr*pshit, suka-suka lo aja). Sebenernya gua nulis ini karena dulu udah kepalang janji ama temen sebimbingan, yaitu ketika ada progres bakalan langsung gua tulis di blog. Sekalian buat ngingetin juga. Dan karena gua baru ada progresnya sekarang, jadi ya baru gua tulis sekarang. Ngoahahaa...

Oke, langsung aja.

Judul dari tugas akhir gua adalah "Otomasi Terrain Modelling menggunakan Teknik Procedural Generation". Bingung kan lo? Haha.. Masalah judul mungkin bisa gua perbaiki nanti. Intinya yang mau gua kerjakan adalah..., bingung juga gua ngejelasinnya. Mungkin bakalan lebih nyaman kalau gua jelasin sedikit demi sedikit.


Terrain dan Terrain Modelling


gambar: brentgrossman.com

Terrain adalah hamparan permukaan bumi khususnya yang berkaitan dengan bentuk fisik dan perbedaan ketinggian. Biasanya mencakup daerah yang luas seperti pegunungan, dataran rendah, dan perairan. Nah, pada era digital seperti sekarang, terrain ini sering dimodelkan ke dalam bentuk 3D digital. Tujuannya ya untuk membuat pemodelan lahan, film animasi, video game, ataupun simulasi-simulasi lainnya. Proses pemodelan ini disebut dengan "Terrain Modelling". Penting gak tuh Terrain Modelling? Oo, tentu sangat penting. Bisa dibayangkan kalau kalian maen game Skyrim atau Age of Empire tapi gak ada permukaan tanahnya, mau berantem di mana?

Masalah dalam Terrain Modelling adalah, itu ukuran tanahnya luas banget. Ada gunungnya, ada sungainya, ada bukit-bukit kecilnya, ada lubangnya juga. Kalau digambar satu-satu bakalan effort banget. Belum lagi waktu yang dibutuhkan juga pasti sangat lama. Dan juga masalah penyimpanan, butuh memori yang sangat besar untuk menampung model 3D segede itu. Nah, masalah inilah yang gua ambil untuk gua kerjakan di tugas akhir gua.

Procedural Generation

Solusi dari permasalahan yang menimpa gua adalah sebuah teknik yang bernama Procedural Generation. Filosofi dari teknik ini adalah, daripada membuat konten secara manual, lebih baik kita membuat sebuah prosedur yang dapat men-generate konten itu secara otomatis. Kita buat rule-nya, tugas selebihnya kita serahkan pada komputer. Ooh, jadi maksudnya di-random? Mirip-mirip semacam itu. Dengan begitu, waktu pembuatan pun akan sangat jauh diminimalisasi.

Untuk itu, gua mencoba mencari berbagai paper. Setelah berpuluh-puluh paper gua baca, akhirnya ketemu satu paper yang cocok. Gua menunjuk paper ini sebagai acuan utama gua setelah Al-Quran dan Hadits. Alasan gua memilih paper itu adalah karena sepertinya isinya gak terlalu kompleks, hihi... (sepertinya). Selain itu, paper itu menunjukkan pembuatan salah satu fitur terrain yang jarang sekali ada di paper lain, yaitu sungai. Jadi yaa, tanpa banyak basa-basi gua pun memilih paper tersebut.

Modeling Landscapes with Ridges and Rivers - bottom up approach

Itulah judul papernya. Ditulis oleh om Fares Belhadj dan uwa Pierre Audibert. Secara garis besar, ada tiga tahapan utama untuk men-generate terrain ala beliau-beliau di atas. Pertama, buat jalur pegunungan. Kedua, buat jalur sungai. Ketiga, buat dataran yang bukan gunung dan bukan sungai. Intinya itu. Dan di postingan sekarang, gua akan membahas cuma sampai pembuatan jalur pegunungan aja alias Ridge.

Output yang akan dihasilkan dari penelitian gua adalah sebuah peta ketinggian atau yang biasa disebut "Heightmap". Biasanya heightmap ini berbentuk sebuah gambar peta hitam putih atau grayscale. Nilai ketinggiannya direpresentasikan dengan warnanya. Semakin putih, makan titik tersebut semakin tinggi. Sedangkan semakin hitam, berarti titik tersebut semakin rendah. Nih contohnya, heightmap benua australia yang gua dapat dari google.

gambar: reddit.com

Balik lagi ke pegunungan. Gua berkutat di depan layar lcd laptop selama seminggu untuk mengimplementasikan Ridge ini. Maklum, gua bukan orang yang ahli dalam hal coding. Ahakhak... Oke, langsung ke impelementasi.

Untuk membuat jalur pegunungan, kita buat yang namanya pertikel Ridge. Partikel ini adalah sebuah titik yang bergerak di tanah yang sudah kita sediakan. Lalu ketinggiannya di-random berdasarkan fungsi sebaran normal. Nah, untuk bentuk jalurnya sendiri dibuat bergerak secara acak berdasarkan gerak Fractional Brownian Motion atau disingkat FBM. Gua gak ngerti sama sekali tentang FBM itu dan gua gak tau gimana cara mengimplementasikannya. Setelah gua tanya-tanya sama Pak Abrar (dosen pembimbing gua), beliau menyarankan untuk mencari alternatif lain yang mirip dengan fbm. Gua pun mencari selama berhari-hari, dan akhirnya gua menemukan sebuah alternatif yang sangat keren yang bernama Perlin Noise.

Diberi nama begitu karena yang menemukannya bernama bapak Ken Perlin. Lalu, apa istimewanya Perlin Noise. Perlin Noise adalah sebuah algoritma keren yang dapat membangkitkan nilai-nilai acak tapi teratur. Lho? Acak apa teratur nih? Yang bener dong? Sabar, sabar. Gua emang kurang pandai untuk membuat definisi. Untuk lebih jelasnya, silakan liat gambar di bawah ini.

gambar: buku Nature of Code

Dari gambar tersebut bisa terlihat perbedaannya. Untuk setiap nilai di sepanjang sumbu x, dibangkitkan nilai-nilai y secara acak. Gambar yang kanan jika menggunakan fungsi random biasa, sedangkan yang kiri jika menggunakan fungsi noise satu dimensi. Acak bukan? Teratur bukan? Itulah istimewanya. Perlin Noise biasa digunakan untuk men-simulasikan fenomena yang terjadi secara alamiah di kehidupan sehari-hari kita. Salah satunya adalah jalur pegunungan yang akan gua buat. Dan beruntungnya gua, fungsi noise sudah built-in di dalam program yang gua pakai. Ngoahahahah...

Awalnya, gua memakai noise ini untuk me-random koordinat x dan y di canvas gua. Tapi hasilnya gak begitu memuaskan karena bentuknya hampir gak karuan kayak benang kusut.


Bahkan kalau gua maen-maenin lagi, hasilnya bisa jadi kayak gini.


Ahakhakhakhakk... Intermeso aja.
Karena gagal, gua pun mencoba memutar otak. Gua baca lagi paper dari Om Belhadj berulang-ulang. Akhirnya gua menemukan pencerahan. Selama ini yang gua buat noise adalah koordinat x dan y-nya. Gimana kalau yang gua buat noise sekarang bukan koordinatnya, melainkan arah sudut vektornya! Gua pun buru-buru menuliskan kode tersebut di text-editor gua. Setelah berulang-ulang mencorat-coret persamaan vektor matematika sederhana dan membetulkan bug, akhirnya hasil yang dapat agak memuaskan.



Bisa dilihat kalau jalur pegunungan tersebut libih pegunuganwi. Dengan titik tertinggi berwarna putih ada di tengah, dan makin ke samping makin hitam alias makin rendah. Cuman tugas gua gak sampai di sini. Kalau cuma begitu, model 3D yang dihasilkan bakalan pipih. Pegunungan itu bakalan jadi pegungungan yang kurus dan gak lebar sama sekali. Untuk itulah, di setiap titik di jalur pegunungan itu, perlu digambar lagi jalur yang arahnya tegak lurus dengan arah aslinya. Yang nantinya itulah yang akan menjadi lebar dari pegunungan tersebut. Setelah dibuat, hasilnya kira-kira seperti ini.


Ahahaha... Punten banget jalurnya beda sama yang sebelumnya. Karena setiap kali kodingannya di-run, hasilnya bakalan beda-beda. Bisa dilihat kalau jalur di atas sekarang sudah punya lebar. Tapi masih ada bug. Seharusnya gua bikin kondisi ketika ada sebuah jalur yang bertabrakan dengan jalur lain, jalur tersebut distop. Tapi untuk sekarang, gua biarkan begitu dulu. Haha...
Di paper disebutkan bahwa setelah jadi seperti di atas, gambar tersebut akan di-blend supaya kita dapat memodelkan jalur sungainya nanti. Hasilnya kayak gini.


Oke, mungkin lebih tepatnya itu gua blur. Karena setelah gua blend ternyata seolah gak terjadi apa-apa. Gua pun memutuskan untuk membuatnya blur. Gua blur dengan skala 5.0. Dengan begitu gambar pegunungan terlihat lebih rapi. Ini kalau kalian mau liat hasil 3D-nya.




Masih banyak jalur yang bertabrakan, Ketinggiannya pun belum menyebar normal, belum ada sungai, dan masih banyak dataran kosongnya.

Untuk saat ini segitu dulu. Progres berikutnya mungkin gua akan sedikit merapikan lagi gunungnya dan membuat jalur aliran sungai.

See ya! :D

No comments:

Post a Comment