Pertama. Mari kita menulis apa yang kita ketahui tentang setiap voxel:
voxel = (x, y, z, color) // or some other information
Penyimpanan umum
Secara umum adalah ini:
set of voxels = set of (x,y,z, color)
Perhatikan, triplet itu (x, y, z) mengidentifikasi masing-masing voxel secara unik, karena voxel adalah titik dalam ruang dan tidak ada cara dua titik menempati satu tempat (saya percaya kita berbicara tentang data voxel statis).
Itu harus baik untuk data sederhana. Tetapi ini bukan struktur data yang cepat.
Rendering adalah AFAIK yang dilakukan oleh algoritma scanline. Artikel Hardware Tom tentang voxels memiliki gambar algoritma scanline .
Pencarian cepat
Jika pencarian cepat diperlukan, maka struktur data tercepat untuk pencarian adalah hash (alias array, map ...). Jadi, Anda harus membuat hash dari itu. Jadi, secara naif kami hanya menginginkan cara tercepat untuk mendapatkan elemen arbitrer:
array [x][y][z] of (color)
Ini memiliki O (1) untuk mencari voxel dengan koordinat x, y, z.
Masalahnya adalah, bahwa persyaratan ruangnya adalah O (D ^ 3), di mana D adalah kisaran dari masing-masing angka x, y dan z (lupakan bilangan real, karena jika mereka Chars, yang memiliki kisaran nilai 256, akan ada 256 ^ 3 = 2 ^ 24 == 16 777 216 elemen dalam array).
Tapi itu tergantung pada apa yang ingin Anda lakukan dengan voxels. Jika rendering adalah apa yang Anda inginkan, mungkin array inilah yang Anda inginkan. Namun masalah penyimpanan masih tetap ...
Jika penyimpanan adalah masalahnya
Salah satu metode adalah dengan menggunakan kompresi RLE dalam array. Bayangkan sepotong voxels (himpunan voxels, di mana voxel memiliki satu nilai konstan koordinat .... seperti bidang di mana z = 13 misalnya). Seperti sepotong voxels akan tampak seperti beberapa gambar sederhana di MSPaint . Model Voxel, saya katakan, biasanya menempati sebagian kecil dari semua tempat yang memungkinkan (ruang D ^ 3 dari semua voxel yang mungkin). Saya percaya, bahwa "mengambil sepasang dari triplet koordinat dan mengompresi sumbu yang tersisa" akan melakukan trik (misalnya, ambil [x] [y] dan untuk setiap elemen kompres semua voxels pada sumbu z pada x yang diberikan, y .. harus ada 0 hingga beberapa elemen, RLE akan baik-baik saja di sini):
array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color
Metode lain untuk memecahkan masalah penyimpanan adalah alih-alih array menggunakan struktur data tree:
tree data structure = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
- Oktree, seperti yang disebutkan oleh Nick. Seharusnya mengompres voxel. Octree bahkan memiliki kecepatan yang layak untuk pencarian, saya kira itu adalah beberapa O (log N), di mana N adalah jumlah voxels.
- Oktree harus dapat menyimpan data voxel yang sewenang-wenang.
Jika voxel adalah beberapa peta ketinggian sederhana, Anda mungkin menyimpannya. Atau Anda dapat menyimpan parameter berfungsi yang menghasilkan peta ketinggian, alias secara prosedural menghasilkannya ...
Dan tentu saja Anda dapat menggabungkan semua pendekatan yang mungkin. Tapi jangan berlebihan, kecuali Anda menguji bahwa kode Anda berfungsi dan mengukur bahwa itu BENAR-BENAR lebih cepat (jadi itu layak optimasi).
TL; DR
Selain dari Octrees adalah kompresi RLE dengan voxels, google "voxlap", "ken silverman" ...
Sumber daya
Ada daftar sumber daya dan diskusi tentang cara membuat roxer voxel cepat, termasuk makalah dan kode sumber .