Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Mari Membuat Mesin Grafik 3D: Spaces and Culling

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Let’s Build a 3D Graphics Software Engine.
Let's Build a 3D Graphics Engine: Linear Transformations
Let's Build a 3D Graphics Engine: Rasterizing Line Segments and Circles

Indonesian (Bahasa Indonesia) translation by Shylchemist (you can also view the original English article)

Selamat datang! Ini adalah bagian ketiga dari seri kita pada mesin grafis 3D. Jika Anda berhasil sampai sejauh ini ke seri, Anda akan senang mengetahui bahwa bagian ini akan jauh lebih ringan pada aspek matematika dari mesin 3D, dan sebagai gantinya akan mengambil fokus pada hal-hal yang lebih praktis - khususnya, menambahkan kamera dan sistem rendering dasar.

Tips: Jika Anda belum membaca dua bagian pertama, saya sangat menyarankan Anda melakukannya sebelum melanjutkan.

Anda juga bisa mendapatkan bantuan tambahan di Envato Studio, di mana Anda dapat memilih dari beragam layanan Desain & Pemodelan 3D berkualitas tinggi dari penyedia berpengalaman.

3D Design Modeling services
Layanan Desain & Pemodelan 3D di Envato Studio

Rekap

Pertama, mari kita lihat kelas yang telah dibuat sejauh ini:

Menggunakan dua kelas ini sendiri telah terbukti sedikit berantakan sejauh ini, dan menggambar setiap titik yang mungkin dapat menguras memori sistem Anda cukup cepat. Untuk mengatasi masalah ini, kita akan memperkenalkan kelas baru ke dalam mesin permainan: kamera.

Kamera kita akan menjadi tempat semua render terjadi, secara eksklusif; itu akan menyisihkan semua objek kita ke layar, dan itu juga akan mengelola daftar semua poin kita.

Tetapi sebelum membahas semua itu, kita harus terlebih dahulu berbicara sedikit tentang pemusnahan.


London Culling

Culling, menurut definisi, adalah pemilihan objek dari kelompok objek yang lebih besar. Untuk mesin game, pilihan kecil yang diambil akan menjadi poin yang ingin kita gambar ke layar. Kelompok objek yang lebih besar akan menjadi setiap titik yang ada.

Melakukan hal ini secara drastis mengurangi daya mesin Anda pada memori sistem, dengan menggambar hanya apa yang benar-benar dapat dilihat oleh pemain, daripada nilai seluruh dunia. Di mesin, kita akan melakukan ini dengan mengatur parameter untuk ruang tampilan.

Ruang tampilan akan ditentukan di ketiga sumbu tradisional: x, y, dan z. Definisi x-nya akan terdiri dari segala sesuatu antara batas kiri dan kanan jendela, definisi ynya akan terdiri dari segala sesuatu antara batas atas dan bawah jendela, dan definisi znya akan antara 0 (di mana kamera diatur) dan jarak pandangan pemain kita (untuk demonstrasi, kita akan menggunakan nilai arbitrer 100).

Sebelum menggambar suatu titik, kelas kamera kita akan memeriksa untuk melihat apakah titik itu berada dalam ruang tampilan. Jika ya, maka intinya akan ditarik; jika tidak, itu tidak akan terjadi.


Bisakah Kita Mendapatkan Beberapa Kamera di Sini?

Dengan pemahaman dasar tentang pemusnahan, kita dapat menyimpulkan bahwa kelas kita akan terlihat seperti ini, sejauh ini:

Kita juga akan memiliki kamera menangani semua rendering untuk mesin kita juga. Bergantung pada mesinnya, Anda akan menemukan bahwa penyaji sering dipisahkan dari sistem kamera. Ini biasanya dilakukan untuk menjaga sistem tetap terkapsulasi dengan baik, karena - tergantung pada ruang lingkup mesin Anda - keduanya bisa menjadi sangat berantakan jika disimpan bersama. Namun, untuk tujuan kita, akan lebih mudah untuk memperlakukan mereka sebagai satu.

Pertama, kita akan menginginkan fungsi yang dapat dipanggil secara eksternal dari kelas yang akan menggambar adegan tersebut. Fungsi ini akan menggilir setiap titik yang ada, membandingkannya dengan parameter culling kamera, dan menggambarnya jika berlaku.

ViewFrustum
Sumber: http://en.wikipedia.org/wiki/File:ViewFrustum.svg

Tips: Jika Anda ingin memisahkan sistem kamera Anda dari renderer Anda, Anda bisa membuat kelas Renderer, meminta sistem kamera mengambil titik, menyimpan yang akan ditarik dalam array, dan kemudian mengirim array itu ke draw() fungsi penyaji Anda.


Manajemen Poin

Bagian terakhir dari kelas kamera kita akan menjadi sistem manajemen titiknya. Bergantung pada bahasa pemrograman yang Anda gunakan, ini bisa saja berupa array sederhana dari semua objek yang dapat digambar (kita akan menangani lebih dari sekadar titik di bagian selanjutnya). Atau, Anda mungkin harus menggunakan kelas induk objek default bahasa. Jika Anda super sial, Anda harus membuat kelas induk objek Anda sendiri dan membuat setiap kelas yang dapat digambar (sejauh ini hanya poin) menjadi turunan dari kelas itu.

Setelah menambahkan itu ke dalam kelas, gambaran umum dasar kamera kita akan terlihat seperti ini:

Dengan tambahan ini, mari kita tingkatkan sedikit pada program yang dibuat terakhir kali.


Hal Lebih Besar dan Lebih Baik

Kita akan membuat program menggambar titik sederhana, dengan program sampel yang dibuat terakhir kali sebagai titik awal.

Dalam iterasi program ini, kita akan menambahkan penggunaan kelas kamera baru kita. Ketika tombol D ditekan, program akan menggambar ulang layar tanpa pemusnahan, menampilkan jumlah objek yang dirender di sudut kanan atas layar. Ketika tombol C ditekan, program akan menggambar ulang layar dengan pemusnahan, juga menampilkan jumlah objek yang diberikan.

Mari kita lihat kodenya:

Sekarang Anda bisa melihat, secara langsung, kekuatan culling! Perhatikan bahwa jika Anda melihat melalui kode sampel, beberapa hal dilakukan sedikit berbeda agar demo lebih ramah web. (Anda dapat melihat demo sederhana saya di sini.)


Kesimpulan

Dengan kamera dan sistem rendering di bawah belt Anda, Anda secara teknis dapat mengatakan bahwa Anda telah membuat mesin game 3D! Mungkin belum terlalu mengesankan, tapi sedang dalam perjalanan.

Pada artikel berikutnya, kita akan melihat menambahkan beberapa bentuk geometris ke mesin (yaitu segmen garis dan lingkaran), dan kita akan berbicara tentang algoritma yang dapat digunakan untuk menyesuaikan persamaan mereka dengan piksel layar.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.