Bounding kotak dalam oktober

9

Saya telah melihat bahwa octrees sering digunakan untuk hal-hal seperti frustum culling dan deteksi tabrakan dalam 3D. Tapi saya tidak yakin bagaimana algoritma bekerja sama sekali. Tentunya seluruh prinsip octree rusak ketika Anda mencoba menggunakan kotak pembatas, karena setiap kotak yang diberikan dapat disimpan dalam satu node tetapi sebenarnya tumpang tindih ruang yang diwakili oleh node lain. Selain itu, saya tidak yakin bagaimana ini bisa bekerja untuk mencari kotak yang terikat daripada poin, karena sekali lagi, Anda bisa terjebak melihat ke hampir semua node, mengalahkan tujuan.

Jadi bagaimana mungkin oktober mengatasi kotak berlari?

DeadMG
sumber

Jawaban:

12

Sebuah octree (3D) menggunakan konsep yang sama sebagai Quadtree (2D). Jika Anda membaca dan memahami artikel wikipedia di Quadtrees, Anda harus dapat menerapkan konsep yang sama ke dalam 3D.

Kedua pohon ini memungkinkan Anda untuk menggunakan pencarian berbasis area yang dapat sangat mengurangi jumlah perbandingan yang diperlukan untuk mengetahui objek apa yang ada di area tertentu. Ini bisa berguna untuk vis-culling, atau bahkan untuk tabrakan, tergantung pada gim Anda.

Konsep dasarnya adalah bahwa ruang-dunia dibagi menjadi "ember": kotak untuk 2D atau kubus untuk 3D. Dengan dunia kosong, Anda mulai dengan satu kotak persegi atau kubus yang menutupi seluruh dunia. Saat Anda menambahkan objek ke dunia, Anda mulai di simpul akar dan bekerja jalan Anda ke pohon berdasarkan lokasi dan ukuran objek. Jika ember tujuan mencapai kapasitas, Anda membaginya dengan membelah kotak menjadi 4 kotak lebih kecil (Quadtree), atau membelah kubus menjadi 8 kubus lebih kecil (Oktree). Setiap objek yang Anda tambahkan ke dunia hanya disisipkan sedalam di dalam pohon karena secara fisik dapat masuk sepenuhnya ke dalam batas bucket. Jika suatu objek tidak muat di dalam batas-batas ember saat ini, Anda harus memindahkan objek ke ember induk terkecil yang benar-benar muat di dalamnya.

Perhatikan bahwa menggunakan Quadtree atau Octree berlebihan jika Anda tidak memiliki banyak objek di dunia Anda. Ada juga solusi open-source untuk keduanya.

John McDonald
sumber
Saya pikir dia tahu itu. Saya percaya kebingungannya adalah tentang bagaimana menangani volume yang tidak cocok dengan baik menjadi subdivisi.
ClassicThunder
2
Saya menyebutkan bahwa "Jika suatu objek tidak pas di dalam batas, itu harus disimpan satu lapisan ke atas". Dan itu juga terdengar seperti OP sedikit bingung tentang bagaimana cara kerja Octrees secara umum, berdasarkan kalimat keduanya.
John McDonald
Tidakkah itu melanggar batasan mendasar dari octrees, bahwa hanya ada tujuh atau kurang di setiap node?
DeadMG
Maksud saya, jika saya memiliki N objek yang terletak di sepanjang batas, maka saya akan melihat O (N) cek untuk memeriksa terhadap masing-masing.
DeadMG
@DeadMG, "Oct" seperti di Eight (Octagon, Octane, dll). Ketika simpul akar terpecah, ia akan memiliki 8 anak: North East Up, North East Down, NWU, NWD, SEU, SED, SWU & SWD dengan total 9 node termasuk. akar. Jika salah satu dari simpul anak ini terpecah, simpul itu juga akan memiliki 8 sub-simpul, satu untuk setiap kuadran seperti sebelumnya, menjadikan total 8 + 8 + 1 = 17 simpul. Jika semua objek Anda pas pada batas simpul akar dan tidak cocok dengan salah satu dari 8 kuadran, ya, itu akan menjadi O (N) dan Anda harus memeriksa setiap objek dan Anda tidak akan dapat menyimpan apapun membandingkan, pada kenyataannya itu akan menjadi masalah.
John McDonald
3

n-tree adalah yang paling terkenal tetapi bukan satu - satunya sistem partisi spasial yang tersedia. Ada banyak, banyak lainnya. Sedikit lebih banyak informasi tentang data yang Anda miliki akan sangat membantu dalam menemukan pilihan terbaik. Apakah kotak Anda berubah ukuran, atau bergerak? Seberapa besar mereka? Ada berapa banyak? Apakah Anda memiliki banyak sisipan / kepindahan?

spesies tidak dikenal
sumber