如何有效地将体素空间聚类到最少数量的相似连续块中?

时间:2013-07-19 14:46:56

标签: algorithm optimization partitioning voxel

首先,如果我的问题不清楚,我会道歉。在过去的几周里,我一直在关于这个主题的谷歌搜索和书籍阅读没有透露我试图解决的问题的任何术语。我将尽我所能描述我的问题;如果有人知道正确的行话来帮助我更简洁地表达我的问题,请告诉我。

我正在研究使用体素来代表服务器托管的多人游戏的可破坏地形的较大(256x256x256体素)战场的可行性。任何游戏一次只能存在一个战场。然而,为了能够广播房间和改变他们的地形,我试图找到一种算法,可以将体素分组到尽可能少的矩形块。作为一个简单的例子,如果水平的下半部分完全填充了一种类型的体素而上半部分具有另一种类型的体素,则该水平应该被分成两个块,一个代表水平的下半部分,并且其他代表顶部。理想情况下,此算法应该能够实时运行,因此可以在每个帧的基础上考虑地形中的任何变形并向客户端广播。这应该使客户能够有效地渲染地形,而不必担心在客户端中复制地形破坏逻辑。

我没有在任何地方找到任何关于如何做到这一点的文章。我试过寻找有关体素引擎的文章;我认为分块不足以满足我的需求。我查看了有关数据挖掘的书籍和文章,但在不知道问题的正确术语的情况下,我无法有效地进行搜索。我甚至看过Joseph O'Rourke的计算几何在C:第二版,但它似乎没有任何帮助。

以下是我尝试过的方法以及我发现的问题。报告的块计数用于填充256 ^ 3空间,通过随机丢弃超过4,194,304个“EARTH”体素到尽可能接近底部,因为它们可以用于随机选择的(x,z)坐标。只计算“EARTH”块。

  • 八月:非常快,但是如果我在空间的中间分裂,它会产生一个可笑的大量块(800,000 +)
  • k-D树分裂以最小化分裂后的加权熵:比八叉树稍慢,但块少得多(~350,000)
  • k-D树分裂以最大化信息增益比:比之前的k-D树方法快两倍,产生更少的块(~167,000),但仍然慢化
  • k-D树分裂以最小化Gowe​​r相似性:非常慢,但产生的块比任何其他k-D树方法(~155,000)
  • 在考虑每个无人认领的“EARTH”块作为块的定义点时,贪婪地抓住可用的最大非交叉,最大的块体积:即使是线程,这个算法也是非常缓慢的(8个线程上8个线程约16分钟)核心系统),但它产生最少的所有块(<65,536)
  • 贪婪地抓住非交叉块的最大子集,同时将块的维度视为客观得分最大化:比其他贪婪方法慢得多,并且还生成几千个块

考虑到最大可接受的块数是每个(x,y)坐标一个块来表示单个列,只有贪婪的体积才能被认为是接近最优的结果。

我不知道如何在不使用永不停止的暴力方法的情况下计算最小块数,因此我不知道是否有可能比贪婪的卷方法做得更好。此外,我不知道如何更快地做到这一点。

任何人都可以给我一个算法来尝试或至少指出我正确的方向吗?我想停止探索这个方向,并想办法解决我的问题,如果不能做得更好的话。

0 个答案:

没有答案