澄清八角树以及它们如何在Voxel世界中发挥作用

时间:2013-06-05 04:58:56

标签: opengl lwjgl voxel octree multidimensional-array

我读到了关于八叉树的信息并且我并没有完全理解它们在一个体素世界中如何工作/被实现,其中八叉树的目的是通过将重复的体素连接到一个大的“体素”来降低您将渲染的体素的数量。

以下是我想澄清的问题:

  • 您将使用哪种类型的数据结构?如何将3-D体素阵列转换为具有不同大小的体素的阵列?阵列中有多个位置?
  • 节点是什么以及它们用于什么?
  • 八叉树是否连接了体素,因此只有方形或者它可以是矩形或L形或整个Y列体素或什么?
  • 八叉树真的能提高体素游戏的性能吗?如果通常这么多?

2 个答案:

答案 0 :(得分:5)

快速回答:

  • 一棵树:
    每个节点有8个孩子,左上角,左上角等等,直到某个级别为止这个代码可能变得相当复杂,特别是如果体素可以在运行时改变。
  • 体素的类型(颜色,材料,项目列表)
  • 是的。仅多维数据集
    更具体地说是1x1,2x2,4x4,8x8等。它必须是整个节点。
    如果你真的想要你可以定义某种模式,但它不再是octdtree。
  • 是的,但这取决于你的数据。想象一下,分别描述256个相同的块,或描述一次(如Minecraft中的空气)

我首先尝试理解四叉树。你可以在纸上做,或用它做一个测试程序。如果您进行实验,您将自己回答这些问题

答案 1 :(得分:3)

正确完成八叉树也可以帮助您进行邻居搜索,这使您可以确定一张脸是否被视为“可见”(即最终看到一块体素可见)。一旦建立了八叉树,就可以使用它来存储XYZ坐标,然后将其提取到一个阵列中。然后,您将此阵列提供给您的VERTEX缓冲区(GL解决方案需要此解决方案),然后您可以根据需要以块形式呈现(随着摄像机向前移动等)。

如果存在相同类型的Cubes,那么Octree也会在那里非常自然地崩溃Cubes变成更大的......就像俄罗斯方块那样,当你有相互“适合”的颜色/形状时...这反过来可以减少你的顶点计数和渲染你真正绘制正方形和矩形的组合

如果操作正确,您将得到许多块,这些块只在顶点缓冲区中可见“面”。然后,您必须构建自己的遮挡剔除算法,然后降低对此的可见性,从而减少所需的渲染。

我在这里做了一个例子:

https://vimeo.com/71330826

注意外部是如何渲染的,但是块本身一直向下到底,即使块的深度面应该相互抵消? (需要更多优化)。还要注意相机如何转动并从渲染缓冲区中移除面?