Beberapa hari yang lalu saya menemukan sesuatu yang disebut medan voxel dan saya pikir mereka cukup keren. Tapi saya tidak tahu apa-apa menghasilkan mereka. Apakah Anda memodelkannya dalam perangkat lunak pemodelan Anda atau menggunakan sesuatu seperti peta ketinggian? Saya membaca di wikipedia bahwa voxels seperti piksel 3d atau piksel volumetrik.
Setelah saya membuat medan voxel, bagaimana saya bisa mengambil voxel ini dan membuatnya bisa dihancurkan / diggable ?
Saya akan memilih jawaban terbaik berdasarkan:
- kode dan algoritma. lebih disukai berbasis di C #
- penjelasan. Saya seorang pemula dengan algoritma tetapi saya sangat akrab dengan pemrograman berorientasi objek
- demonstrasi langkah demi langkah. Tidak hanya konsep tetapi juga arah.
- diagram / ilustrasi. Tidak, bukan tangkapan layar dari mesin lain.
Saya tahu bahwa ini adalah masalah yang rumit. Tapi terima kasih atas bantuannya!
Tidak, saya tidak mencoba membuat klon minecraft.
Sunting
Terima kasih kepada semua orang atas bantuan besar Anda (terutama Nick Wiggill)! Inilah yang saya berhasil buat (Work in progress).
sumber
Jawaban:
Untuk menghasilkan medan voxel
( A ) Metode umum adalah untuk menghasilkan peta ketinggian menggunakan Perlin noise. Heightmap pada dasarnya adalah gambar monokrom yang mewakili ketinggian berbeda oleh kegelapan atau terang pikselnya.
Anda akan melihat masing-masing piksel dalam peta tinggi ini untuk membuat "tumpukan" voxel hingga ketinggian yang berbeda (sumbu z) di lokasi yang berbeda (x, y), sesuai dengan kecerahan piksel itu pada gambar heightmap. Karena gambar derau Perlin halus (tidak ada tepi cahaya yang tajam melawan gelap), hasilnya Anda akan memiliki medan yang bergulir dengan lancar.
(B) Anda dapat membangun secara bertahap dengan menciptakan lanskap dari polyhedra yang berbeda. Buat bentuk vektor polihedral yang mendekati bentuk voxel yang Anda inginkan. Menggunakan metode 3D-point-in-polyhedron (paling sering, point-in-convex-hull), periksa titik mana dari grid dunia Anda yang termasuk dalam volume polihedral itu. Misalnya, tentukan piramida di ruang angkasa. Setelah memeriksa setiap titik di wilayah lokal ruang dunia Anda terhadap volume piramidal itu, Anda akan tahu titik mana yang termasuk di dalamnya, dan Anda dapat mengatur sel-sel itu sebagai "sekarang" yang berarti mereka menjadi voxel daripada ruang kosong. Anda sekarang memiliki piramida voxel di ruang Anda. Anda dapat terus menambahkan bentuk apa pun bersama-sama, dengan cara ini, hingga Anda membentuk medan.
(c) (Benar-benar sama dengan b ) Tulis alat pemodelan. Voxatron menunjukkan bagaimana tampilannya. Ini hanya membuat bentuk voxel di dunia pengganti (editor) dan kemudian mengimpornya ke dunia game runtime Anda yang sebenarnya. Saya percaya Voxlap memiliki editor open source pertama untuk voxels. Anda dapat menempatkan voxel individual, atau Anda dapat menggunakan "brush" voxel dengan berbagai bentuk / volume untuk menarik voxel ke dunia Anda.
Apa yang Anda perlukan untuk membangun gim berbasis voxel Anda sendiri
Saya memasukkan bagian ini karena jalan voxel tidak mudah, setidaknya tidak saat ini. Akhir-akhir ini, banyak penelitian sekali lagi dimasukkan ke dalam mesin voxel oleh para pemain besar, menuju aplikasi rendering dan fisika.
Kesederhanaan mungkin menjadi masalah, karena secara dinamis membangun dunia dari voxels mentah adalah pendekatan prosedural untuk konstruksi dunia dan ini pada dasarnya tidak sederhana . Maaf, akan ada beberapa istilah teknis di sini. Menulis mesin voxel adalah pekerjaan yang cukup serius dan membutuhkan pengetahuan di berbagai bidang pengembangan mesin game, terutama dalam hal konsep spasial, dan ini berarti memahami matematika vektor 3D, matriks dan kalkulus dasar ke tingkat yang wajar.
Karena itu, "pembuatan medan voxel" Anda memerlukan konteks untuk bekerja, karena mesin voxel tidak sepenuhnya tersebar luas. Mari kita lanjutkan ke deskripsi dasar tentang cara kerja mesin voxel.
Voxels adalah blok bangunan dasar dunia Anda. Posisi mereka ditentukan oleh grid 3D array-diindeks (array) daripada ruang floating-point terus menerus (seperti yang digunakan dalam game 3D berbasis vektor). Ini akan menjadi "atom" dari dunia Anda. Ketinggiannya bisa 3 kaki seperti pada gim seperti Minecraft, atau bisa lebih kecil dari yang bisa dilihat mata karakter virtual Anda, kecuali terkumpul bersama dalam jumlah besar - sedikit lebih mirip molekul. Ada dua macam:
Apa pun caranya, pendekatan Anda untuk memanipulasi voxel di dunia Anda hampir sama, sebagai berikut.
Untuk membangun dan memindahkan objek di dunia Anda, Anda membutuhkan alat matematika yang disebutkan di atas. Misalnya, untuk membuat dinding: Bangun kotak dimensi yang sesuai dalam ruang 3D, menggunakan vektor. Gunakan matematika matriks untuk mengubah kotak Anda ke rotasi dan posisi yang Anda inginkan di dunia 3d Anda (dalam ruang vektor terus menerus). Untuk mesin voxel, langkah tambahan adalah sekarang menggunakan algoritma 3D point-in-polyhedron untuk menentukan voxel mana yang termasuk dalam ruang yang diputar.
Pada dasarnya, ini adalah cara Anda membangun sebagian besar objek di dunia Anda. Di luar itu, Anda bisa menulis alat sendiri untuk "memodelkan" karakter dengan cara yang Anda katakan, Maya atau 3DS Max. Tetapi karena Anda memodelkan karakter Anda dari voxel alih-alih titik, tepi dan wajah, metode Anda akan jauh berbeda. Jika Anda memutuskan untuk memutar objek-objek ini di dunia Anda, Anda perlu menggunakan transformasi matriks untuk melakukannya.
Medan yang dapat dirusak semudah mengeluarkan satu voxel pada suatu waktu sesuai dengan beberapa metode yang Anda pilih, atau menggunakan operasi CSG (Constructive Solid Geometry) pada volume besar voxel untuk menghapusnya sesuai dengan beberapa volume yang telah ditentukan; misalnya, jika memotret sinar laser melalui batu, Anda mungkin menggunakan volume silinder untuk mengurangi voxel di sini sinar menembak melalui batu. CSG adalah proses yang relatif sederhana menggunakan kisi spasial 3D yang membentuk dunia voxel Anda, dan memeriksa setiap sel di bagian kisi dasar (dalam hal ini batu) terhadap kisi lain (dalam hal ini, sinar laser)
Untuk memiliki "aliran" material (seperti yang ditunjukkan oleh Vigil dalam komentarnya tentang pasir), Anda perlu melihat dinamika fluida dan automata seluler. Ini digunakan oleh penulis Dwarf Fortress, Tarn Adams, dalam apa yang pada dasarnya juga dunia voxel (meskipun voxel jauh lebih besar dalam kasus ini, sebanding dengan Dungeon Keeper, prinsipnya tetap sama). Ini adalah topik canggih dan bukan keharusan untuk mesin voxel sebagaimana didefinisikan, jadi saya akan meninggalkan ini sebagai "rintisan" untuk penelitian Anda sendiri.
CSG dan dinamika fluid membawa saya, terakhir, ke optimasi. Mesin Voxel yang saat ini sedang dikembangkan hampir secara eksklusif memanfaatkan sparse voxel octrees (SVOs) yang merupakan metode pengelompokan ruang voxel ke berbagai resolusi, sebagaimana dibuktikan dalam video ini yang memamerkan mesin Atomontage yang akan datang. Menggunakan octrees / SVO lebih merupakan keharusan daripada pilihan optimasi, karena overhead pemrosesan yang terlibat dalam pemrosesan satu grid seragam besar. Oktree pada dasarnya adalah pohon (grafik asiklik terarah) di mana setiap node memiliki 8 atau nol node anak tergantung pada apakah ruang yang diwakilinya berisi volume fisik. Diagram yang menunjukkan bagaimana oktri membagi ruang untuk membentuk voxel ada di sini .
Implementasi open source voxel terbaik yang saya tahu adalah Voxlap Engine milik Ken Silverman , yang digunakan untuk Voxelstein3D. Ini ditulis dalam C ++, dan mengimplementasikan operasi CSG untuk deformasi medan.
sumber
Cara terbaik untuk menghasilkan medan voxel yang menarik adalah dengan peta kerapatan derau Perlin. Daripada menggunakan peta kebisingan Perlin 2D yang mendefinisikan tinggi dunia 3D, gunakan peta kebisingan Perlin 3D. Bobot peta sehingga nilai-nilai yang lebih dekat ke bawah akan lebih cenderung solid, dan nilai-nilai yang lebih dekat ke atas pasti adalah udara. Ini memberikan ketinggian dunia Anda, tetapi juga memungkinkan untuk overhang dan gua, mirip dengan medan Minecraft , karena tampilan sisi ini dari sepotong medan menunjukkan:
Dari sini Anda dapat menguji pulau-pulau terapung, atau menambahkan sistem gua menggunakan kebisingan fraktal:
Gambar-gambar di atas dan ide-ide sistem gua berasal dari posting blog yang luar biasa ini . Anda dapat mempelajari semua tentang kebisingan Perlin di sini , dan ada beberapa kode sampel untuk membantu Anda memulai di sini .
sumber
Jawaban lain di sini sangat bagus, tetapi saya mengambil pendekatan yang sedikit berbeda.
Saya menghasilkan lingkungan dalam alat pemodelan (3DSMAX), dan membuat oktars yang jarang darinya. Setiap simpul daun kubus, non-kosong adalah voxel. Pada waktu render, saya menggunakan raycasting (diimplementasikan dalam HLSL) untuk menemukan voxel mana yang menempati pixel mana, dan mengatur pixel ke warna yang disimpan dalam node, yang saya hitung ketika menghasilkan pohon dengan rata-rata nilai tekstur dari model sumber.
Ini memberi Anda banyak manfaat yang bagus - deteksi tabrakan secara gratis, variabel LOD, melihat ruang culling, dll - dan, selain dari raycaster - mudah diimplementasikan.
Sayangnya, hampir tidak mungkin untuk mengirim kode sampel dari telepon.
sumber