1

我读到了八叉树,但我并不完全理解它们是如何在体素世界中工作/实现的,在体素世界中,八叉树的目的是通过将重复体素连接到一个大的“体素”来降低要渲染的体素数量。

以下是我想澄清的问题:

  • 你会使用什么类型的数据结构?如何将体素的 3-D 数组转换为具有不同大小体素的数组,这些体素在数组中占据多个位置?
  • 什么是节点,它们的用途是什么?
  • 八叉树是否连接体素,所以只有正方形,或者它可以是矩形或 L 形或整个 Y 体素列还是什么?
  • 八叉树真的能提高体素游戏的性能吗?如果有的话,一般是多少?
4

2 回答 2

5

快速回答:

  • 一棵树:
    每个节点有 8 个子节点,top-back-left、top-back-right 等。一直到某个级别。这方面
    的代码可能会变得非常复杂,尤其是在体素可以在运行时发生变化的情况下。
  • 体素的类型(颜色、材质、项目列表)
  • 是的。仅限多维数据集
    更具体地说是 1x1、2x2、4x4、8x8 等。它必须是整个节点。
    如果你真的想要,你可以定义某种模式,但它不再是八叉树。
  • 是的,但这取决于您的数据。想象一下单独描述 256 个相同的块,或者描述一次(就像 Minecraft 中的空气)

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

于 2013-06-05T05:57:38.300 回答
3

正确完成的八叉树还可以帮助您进行邻居搜索,这使您能够确定一张脸是否被认为是“可见的”(即,您最终会得到一个可见的体素外壳)。建立八叉树后,您可以使用它来存储 XYZ 坐标,然后将其提取到单个数组中。然后你将这个数组输入你的 VERTEX 缓冲区(GL 解决方案需要这个),然后你可以根据需要以块的形式渲染它(随着相机向前移动等)。

如果有相同类型的立方体,八叉树也很自然地将立方体折叠成更大的立方体......就像俄罗斯方块一样,当你的颜色/形状相互“匹配”时......这反过来可以减少你的顶点数和渲染你真的在画正方形和矩形的组合

如果做得正确,你最终会得到很多只有在顶点缓冲区中可见的外向“面”的块。现在,您还必须构建自己的遮挡剔除算法,然后降低其上的可见性,从而减少所需的渲染。

我在这里做了一个例子:

https://vimeo.com/71330826

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

于 2013-08-03T00:45:54.017 回答