เป็นครั้งแรก ให้เขียนสิ่งที่เรารู้เกี่ยวกับแต่ละ voxel:
voxel = (x, y, z, color) // or some other information
ที่เก็บข้อมูลทั่วไป
วิธีทั่วไปเป็นเพียงแค่นี้:
set of voxels = set of (x,y,z, color)
โปรดทราบว่า triplet (x, y, z) ระบุแต่ละ voxel ที่ไม่ซ้ำกันเนื่องจาก voxel เป็นจุดในอวกาศและไม่มีวิธีที่สองจุดครอบครองที่เดียว (ฉันเชื่อว่าเรากำลังพูดถึงข้อมูล voxel คงที่)
มันควรจะดีสำหรับข้อมูลที่เรียบง่าย แต่มันก็ไม่ได้เป็นโครงสร้างข้อมูลที่รวดเร็ว
การแสดงผลเป็น AFAIK ทำโดยอัลกอริทึม scanline บทความฮาร์ดแวร์ของทอมในชุมีภาพของอัลกอริทึม scanline
ค้นหาอย่างรวดเร็ว
หากต้องการการค้นหาอย่างรวดเร็วโครงสร้างข้อมูลที่เร็วที่สุดสำหรับการค้นหาคือแฮช (อาคาอาร์เรย์หรือแผนที่ ... ) ดังนั้นคุณต้องทำแฮชจากมัน ดังนั้นไร้เดียงสาเราต้องการวิธีที่เร็วที่สุดในการรับองค์ประกอบตามอำเภอใจ:
array [x][y][z] of (color)
นี่คือ O (1) เพื่อค้นหา voxel โดย x, y, z พิกัด
ปัญหาคือว่ามันต้องการพื้นที่คือ O (D ^ 3) โดยที่ D คือช่วงของแต่ละจำนวน x, y และ z (ลืมจำนวนจริงเนื่องจากถ้าพวกเขาเป็น Chars ซึ่งมีช่วง 256 ค่าจะมี 256 ^ 3 = 2 ^ 24 == 16 777 216 องค์ประกอบในอาร์เรย์)
แต่มันขึ้นอยู่กับสิ่งที่คุณต้องการจะทำกับ voxels ถ้าการเรนเดอร์เป็นสิ่งที่คุณต้องการมันก็น่าจะเป็นอาเรย์ที่คุณต้องการ แต่ปัญหาของการจัดเก็บยังคงอยู่ ...
หากที่เก็บข้อมูลมีปัญหา
วิธีหนึ่งคือการใช้การบีบอัด RLE ในอาร์เรย์ ลองนึกภาพชิ้นส่วนของ voxels (ชุดของ voxels โดยที่ voxels มีค่าพิกัดหนึ่งค่าคงที่ .... เช่นระนาบที่ z = 13 เป็นต้น) เช่นชิ้นของชุจะมองเหมือนการวาดภาพง่ายๆใน MSPaint ฉันจะบอกว่าแบบจำลองของ Voxel มักจะอยู่ในตำแหน่งที่เป็นไปได้ทั้งหมด (D ^ 3 พื้นที่ของ voxels ที่เป็นไปได้ทั้งหมด) ฉันเชื่อว่า "ใช้คู่จาก triplet ของพิกัดและบีบอัดแกนที่เหลืออยู่" จะทำกลอุบาย (เช่นใช้ [x] [y] และสำหรับแต่ละองค์ประกอบบีบอัด voxels ทั้งหมดที่แกน z ที่ x, y .. . ควรมี 0 ถึงองค์ประกอบไม่กี่ RLE จะทำอะไรดีที่นี่):
array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color
วิธีอื่นในการแก้ปัญหาการจัดเก็บจะเป็นแบบอาร์เรย์โดยใช้โครงสร้างข้อมูลแบบต้นไม้:
tree data structure = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
- Octree ตามที่ Nick พูดถึง มันควรบีบอัด voxels Octree มีความเร็วที่พอเหมาะสำหรับการค้นหาฉันคิดว่ามันเป็น O (log N) โดยที่ N คือจำนวน voxels
- Octree ควรสามารถจัดเก็บข้อมูล voxel ตามอำเภอใจได้อย่างเหมาะสม
หาก voxels เป็นบางส่วนของความสูงแบบง่ายๆคุณอาจเก็บไว้ที่ หรือคุณอาจเก็บพารามิเตอร์เพื่อทำงานซึ่งสร้างแผนที่ความสูงหรือที่เรียกว่าสร้างแบบเป็นขั้นตอน ...
และแน่นอนคุณสามารถรวมแนวทางที่เป็นไปได้ทั้งหมด แต่อย่าหักโหมจนเกินไปเว้นแต่คุณจะทดสอบว่าโค้ดของคุณใช้งานได้และวัดได้เร็วกว่าจริง ๆ (ดังนั้นจึงคุ้มค่ากับการเพิ่มประสิทธิภาพ)
TL; DR
นอกเหนือจาก Octrees คือการบีบอัด RLE ด้วย voxels, google "voxlap", "ken silverman" ...
ทรัพยากร
มีรายชื่อของเป็นทรัพยากรและการอภิปรายเกี่ยวกับวิธีที่จะทำให้ renderer voxel ได้อย่างรวดเร็วรวมถึงเอกสารและรหัสแหล่งที่มา