Implementasi peta genteng / medan dengan ketinggian ubin yang berdekatan

10

Ahoy!

Saya mencari beberapa informasi tentang peta ubin, atau lebih tepatnya, apa jenis peta ubin tertentu.

Saya tertarik pada jenis implementasi yang digunakan dalam taipan rollercoaster, atau seri taipan transportasi dan telah mencari ke medan bidang vektor dan medan peta ketinggian, tetapi saya tidak yakin mereka cocok untuk apa yang saya cari. mengembangkan.

Sudah sulit untuk menemukan info yang layak karena kebanyakan orang menyebutnya sebagai peta petak isometrik, tapi saya ingin membuat sesuatu dalam 3D dengan perspektif ortografi tetap. Saya mengerti bahwa penyimpanan yang mendasari peta ubin tidak ada hubungannya dengan bagaimana itu diberikan tetapi saya tidak mencari untuk membuat peta ubin 2D seperti game pokemon / zelda sekolah lama, lebih sesuai dengan diablo dengan kemampuan untuk menyertakan menjorok tebing dan medan miring.

Saya hanya mencoba mencari istilah yang tepat untuk mencari google dan stackoverflow untuk sumber daya untuk membantu saya memutuskan jalan mana yang akan dilanjutkan.

Sejauh ini saya sudah berhasil menyempurnakan peta ubin dasar tanpa menggunakan komponen tinggi / y yang disimpan dalam VBO dan dirender sebagai bingkai gambar. Sejauh ini terlihat baik-baik saja tetapi saya membayangkan bahwa saya akan menghadapi masalah ketika mencoba untuk memanipulasi satu titik untuk membuat tebing dan lereng tanpa mempengaruhi ubin tetangga.

Apakah ada jenis implementasi khusus yang harus saya perhatikan? Saya pikir saya akan memecahkannya ketika saya menemukan jumlah yang wajar jika info tentang medan bidang vektor tetapi saya tidak yakin ini akan menghasilkan hasil yang benar juga.

Jika ada yang bisa menjelaskan tentang hal ini untuk saya, bantuannya akan sangat dihargai :)

Memperbarui

Saya telah memasukkan gambar untuk klarifikasi lebih lanjut tentang apa yang ingin saya capai:

Peta ubin 2.5D

Gambar dipinjam dari Cara membuat ubin isometrik miring (tinggi)

Gambar ini menunjukkan jenis medan yang ingin saya hasilkan tetapi tidak menyertakan "tebing" atau tipe medan yang menggantung yang saya minati. Namun itu menimbulkan beberapa pertanyaan lain yang belum saya pertimbangkan, yaitu;

  • Bagaimana 'lapisan' seperti air (kiri atas gambar) akan ditangani untuk memasukkan tanah yang terlihat di bawah air?
  • Bagaimana "tepi" peta akan dipenuhi sehingga bumi / lumpur dibuat untuk menggambarkan dunia sebagai entitas yang tidak rata?
  • Mungkinkah penyimpanan dasar untuk medan semacam ini digunakan untuk memodelkan fisika seperti bola yang bergulir menuruni bukit atau kecepatan gerakan pemain yang melintasi lereng?

Saya punya ide bahwa setiap ubin dari medan dapat dimodelkan dengan 8 simpul di mana 4 simpul utama menutupi ubin itu sendiri dan sisa 4 simpul digunakan untuk memodelkan sisi / dinding setiap ubin. Dua masalah yang saya lihat dengan implementasi ini adalah bahwa a) peta dunia pada dasarnya berukuran dua kali lipat dan b) mengingat bahwa tidak semua ubin akan menyertakan "dinding", beberapa ubin akan berakhir dengan simpul redundan yang tidak digunakan.

Saya ingin membuat editor terrain yang memungkinkan setiap ubin untuk dideformasi serta menyertakan kemampuan untuk mengubah medan selama bermain game. Ini dengan sendirinya menimbulkan pertanyaan tambahan seperti; Bisakah VBO digunakan untuk menyimpan dan membuat medan sambil dimodifikasi dengan cepat dan, apakah mungkin untuk memodifikasi simpul tanpa memengaruhi ubin tetangga?

Saya mendapat kesan bahwa saya terlalu rumit atau sedang mengalami kelumpuhan analisis karena saya lalai untuk menulis kode apa pun untuk menyelesaikan masalah tanpa memiliki gagasan yang jelas tentang bagaimana saya akan mencapai apa yang saya inginkan.

Sekali lagi, saya benar-benar hanya mencari dorongan ke arah yang benar dengan ini. Apakah ada tipe spesifik dari implementasi tilemap / terrain yang akan memenuhi untuk peta 3D yang akan dideformasi oleh editor peta maupun selama bermain game atau apakah saya harus memutar sendiri, sehingga untuk berbicara? Saya tidak mencoba menemukan kembali roda di sini, tetapi saya berjuang untuk menemukan sumber daya mengingat saya tidak yakin apa yang harus dicari.

Jika ada yang bisa memberikan info, sumber daya, atau potongan kode apa pun, itu akan sangat dihargai karena saya ingin membuat tangan saya kotor dan mulai menghasilkan sesuatu selain kerangka gambar datar yang saat ini saya miliki.

Terima kasih sudah membaca!

KaptenRedmuff
sumber

Jawaban:

2

Jika saya jadi Anda, saya akan melihat voxels, lebih khusus rendering kubus-jenis Minecraft . Tidak seperti pemetaan ketinggian, mereka dapat menangani overhang, gua, bangunan dengan beberapa lantai, dll.

Anda akan menyimpan medan dalam array 3D bilangan bulat, di mana angka dipetakan ke jenis medan tertentu: 0 = udara, 1 = kotoran, 2 = air, dll. Kemudian, untuk membuat jaring untuk dirender, Anda harus buat wajah-wajah kubus untuk setiap voxel yang tidak kosong.

Tutorial ini adalah penjelasan yang bagus tentang bagaimana melakukan ini di C ++ menggunakan Ogre3D. Saya kira Anda harus pergi sedikit lebih rendah di OpenGL.

Setelah membuat kubus, Anda ingin menghaluskan bagian tepinya untuk membuat jenis bidang fluida yang ditunjukkan pada gambar Anda. Saya percaya PolyVox (juga dalam C ++) melakukan ini; Anda bisa melihat kode mereka. Saya pikir pada dasarnya Anda lakukan dalam 3D apa yang ditunjukkan gambar dalam 2D: rata-rata posisi kubus sekitarnya untuk mengetahui di mana harus menempatkan setiap simpul.

EDIT:

  • Hasilkan wajah untuk kubus yang berdekatan dengan air seolah-olah genteng air kosong, dan buatlah permukaan air secara transparan.
  • Wajah di "tepi" dapat dihasilkan seperti wajah biasa, jika Anda menganggap voxels di luar dunia kosong.
  • Fisika: Anda mungkin dapat memberi makan mesh yang diberikan ke mesin fisika Anda sebagai objek statis.
  • Editor peta: Anda ingin mengedit data voxel yang mendasarinya, bukan mesh itu sendiri! (Mesh harus mencerminkan data, jadi mengedit voxel akan menghasilkan perubahan pada mesh Anda.) Anda mungkin ingin mencari Model, View, Controller (MVC) jika Anda tidak terbiasa dengannya.

Jika Anda memiliki pertanyaan lebih lanjut, silakan tinggalkan komentar. Selamat datang di gamedev.SE!

Wackidev
sumber
Ini adalah solusi yang sangat rumit untuk masalah yang relatif sederhana. Banyak game telah melakukan apa yang diminta OP tanpa kerumitan voxels.
Sean Middleditch
Saya setuju voxel bisa rumit. Bisakah Anda menautkan ke permainan ini? Saya tertarik mendengar bagaimana mereka melakukannya.
Wackidev
Saya bermain-main dengan ide menggunakan voxels. Apakah implementasi ini menyiratkan bahwa semua kubus memiliki dimensi satuan, atau bisakah sebuah kubus tunggal diekstrusi? Saya kira dunia perlu disimpan dalam lapisan untuk memungkinkan air dan ubin lain yang mungkin "tumpang tindih" di sepanjang bidang-y.
CaptainRedmuff
Ya, biasanya voxel berukuran satuan. Saya kira orang bisa mengusir mereka, tetapi saya pikir itu hanya akan membuatnya lebih rumit. Saya tidak yakin saya mengerti apa yang Anda maksud tentang lapisan. Apakah Anda mengacu pada ubin air yang memiliki ketinggian bervariasi?
Wackidev
Sesuatu seperti itu. Saya berpikir lebih banyak tentang hanya mendefinisikan "lantai" yang bisa menjadi kubus diekstrusi yang kemudian memiliki kubus air di atas yang didefinisikan oleh pesawat di mana keduanya berpotongan. Mungkin aku terlalu memperumit masalah lagi. Saya akan melakukan lebih banyak membaca tentang voxels dan melihat di mana itu menuntun saya.
CaptainRedmuff
6

Ini: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png adalah contoh peta yang telah saya lakukan beberapa waktu lalu.

Saya memiliki XML yang mewakili peta dan berbagai jenis ubin. Setiap jenis akan memiliki beberapa atribut:

  • Tinggi
  • Posisi
  • Jenis Penggabungan: Jenis penggabungan ubin mana yang akan dilakukan, ALL(jika harus menggabungkan ke ubin apa pun di sekitarnya), EQUAL(hanya digabung dengan ubin dengan jenis yang sama), NONE(tidak pernah bergabung).
  • Gabung Tinggi: Tinggi maks untuk lereng (baik untuk overhang), katakanlah Anda ingin ubin untuk bergabung hanya dengan ubin pada ketinggian yang sama atau selisih 1, nilainya akan menjadi satu.

Saya kemudian akan membaca semua ubin dan membuatnya di tempat kejadian. Pertama hanya memperhitungkan posisi. Setiap ubin harus tahu tetangga itu, jadi saya harus melalui peta dua kali, sekali untuk membuat semuanya, dan sekali lagi untuk memindahkan setiap titik ke posisi yang tepat.

Meskipun model saya adalah heks, konsepnya sama, Anda akan memerlukan kubus untuk mewakili ubin Anda, Anda kemudian akan memindahkan simpul dasar ke tingkat terendah dan 'menghaluskan' bagian atas kubus dengan kubus di sekitarnya. Anda juga akan memeriksa apakah dua sisi kubus digabungkan sehingga Anda bisa menghapus sisi itu dari kubus (jika tidak digabungkan, mungkin itu adalah tebing atau semacamnya).

Tentang fisika, tergantung pada tujuan Anda. Jika Anda melakukan sesuatu seperti taipan rollercoaster, Anda tidak benar-benar membutuhkannya. Anda bisa memeriksa tinggi pemain di antara setiap ubin dan menentukan kecepatan berjalan. Anda bisa melakukan hal yang sama untuk objek yang bergerak dengan sendirinya (seperti bola), Anda bisa memeriksa ubin di sekitar (atau sudut ubin saat ini) dan memutuskan arah / kecepatan. Jika Anda membutuhkan fisika realistis (seperti gravitasi, gesekan, dll) Anda harus menggunakan mesin fisika, dan Anda bisa menggunakan representasi 3D kubus di mesin.

Layers juga dimungkinkan, tetapi Anda membutuhkan sesuatu seperti minecraft (dengan menghaluskan kubus di lapisan tertinggi). Jika Anda hanya membutuhkan lapisan untuk air, Anda dapat memiliki "mata air" pada ubin dan kode Anda mengisi setiap ruang di sekitarnya yang berada pada ketinggian yang sama atau lebih rendah (solusi rekursif akan cocok di sini dengan baik).

Editor medan juga akan sederhana, jika kode Anda cukup fleksibel, Anda dapat menerapkan transformasi ke ubin tunggal (yang Anda ubah), atau ke daftar ubin (jika Anda menggunakan 'kuas' untuk pilih dan pindahkan mereka). Kode yang sama dapat digunakan untuk memodifikasi medan di game. Dan ya, Anda dapat mengubah simpul pada VBO, juga memungkinkan untuk mengubah simpul tanpa mempengaruhi yang lain (itu juga tergantung pada Anda pengkodean seperti itu).

Luke B.
sumber
+1 Terima kasih atas masukan Anda tentang ini. Anda menyampaikan poin bagus tentang pelapisan sehubungan dengan "mata air" yang sebelumnya tidak saya pertimbangkan. Saya akan melihat ke dalam memodifikasi VBO on the fly sekarang saya tahu itu mungkin :)
CaptainRedmuff