Đầu tiên. Hãy viết những gì chúng ta biết về mỗi voxel:
voxel = (x, y, z, color) // or some other information
Kho chung
Cách chung chỉ đơn giản là thế này:
set of voxels = set of (x,y,z, color)
Lưu ý, bộ ba đó (x, y, z) xác định duy nhất mỗi voxel, vì voxel là điểm trong không gian và không có cách nào hai điểm chiếm một vị trí (tôi tin rằng chúng ta đang nói về dữ liệu voxel tĩnh).
Nó sẽ tốt cho dữ liệu đơn giản. Nhưng nó không có nghĩa là một cấu trúc dữ liệu nhanh.
Kết xuất là AFAIK được thực hiện bằng thuật toán scanline. Bài viết về phần cứng của Tom trên voxels có hình ảnh của thuật toán scanline .
Tra cứu nhanh
Nếu cần tra cứu nhanh, thì cấu trúc dữ liệu nhanh nhất để tra cứu là hàm băm (còn gọi là mảng, bản đồ ...). Vì vậy, bạn phải làm cho băm ra khỏi nó. Vì vậy, ngây thơ, chúng tôi muốn cách nhanh nhất để có được yếu tố tùy ý:
array [x][y][z] of (color)
Điều này có O (1) để tra cứu voxel theo tọa độ x, y, z.
Vấn đề là, yêu cầu không gian của nó là O (D ^ 3), trong đó D là phạm vi của mỗi số x, y và z (quên số thực, vì nếu chúng là Chars, có phạm vi 256 giá trị, sẽ có 256 ^ 3 = 2 ^ 24 == 16 777 216 phần tử trong mảng).
Nhưng nó phụ thuộc vào những gì bạn muốn làm với voxels. Nếu kết xuất là những gì bạn muốn, thì đó có thể là mảng bạn muốn. Nhưng vấn đề lưu trữ vẫn còn ...
Nếu lưu trữ là vấn đề
Một phương pháp là sử dụng nén RLE trong mảng. Hãy tưởng tượng một lát voxels (tập hợp các voxels, trong đó voxels có một giá trị hằng số tọa độ .... như mặt phẳng trong đó z = 13 chẳng hạn). Những voxels như vậy sẽ trông giống như một bản vẽ đơn giản trong MSPaint . Mô hình Voxel, tôi muốn nói, thường chiếm một phần của tất cả các vị trí có thể (D ^ 3 không gian của tất cả các voxels có thể). Tôi tin rằng, "lấy một cặp từ bộ ba tọa độ và nén trục còn lại" sẽ thực hiện thủ thuật (ví dụ: lấy [x] [y] và cho mỗi phần tử nén tất cả các voxels tại trục z tại x, y .. nên có 0 đến vài yếu tố, RLE sẽ làm tốt ở đây):
array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color
Phương pháp khác để giải quyết vấn đề lưu trữ sẽ là thay vì sử dụng cấu trúc dữ liệu cây:
tree data structure = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
- Octree, như được đề cập bởi Nick. Nó nên nén voxels. Octree thậm chí có một tốc độ khá tốt để tra cứu, tôi đoán đó là một số O (log N), trong đó N là số lượng voxels.
- Octree có thể lưu trữ dữ liệu voxel tùy ý.
Nếu voxels là một số sơ đồ chiều cao đơn giản Bạn có thể lưu trữ chỉ đó. Hoặc Bạn có thể lưu trữ các tham số cho chức năng tạo sơ đồ chiều cao, hay còn gọi là tạo thủ tục ...
Và tất nhiên Bạn có thể kết hợp tất cả các phương pháp có thể. Nhưng đừng lạm dụng nó, trừ khi bạn kiểm tra rằng Mã của bạn hoạt động và đo lường rằng nó THỰC SỰ nhanh hơn (vì vậy nó đáng để tối ưu hóa).
TL; DR
Khác với Octrees là nén RLE với voxels, google "voxlap", "ken silverman" ...
Tài nguyên
Có danh sách các tài nguyên và thảo luận về cách tạo trình kết xuất voxel nhanh, bao gồm các giấy tờ và mã nguồn .