Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何有效地将体素空间聚类到尽可能少的相似、连续块中?_Algorithm_Optimization_Partitioning_Voxel - Fatal编程技术网

Algorithm 如何有效地将体素空间聚类到尽可能少的相似、连续块中?

Algorithm 如何有效地将体素空间聚类到尽可能少的相似、连续块中?,algorithm,optimization,partitioning,voxel,Algorithm,Optimization,Partitioning,Voxel,我正在研究使用体素来表示大型战场(256x256x256体素)的可行性,这些战场具有可破坏的地形,可用于服务器托管的多人游戏。任何一场比赛一次只能有一个战场。然而,为了能够广播房间及其地形的变化,我正在尝试找到一种算法,可以将体素分组到尽可能少的矩形块中 作为一个简单的示例,如果层的下半部分完全填充了一种类型的体素,而上半部分填充了另一种类型的体素,则层应分为两个块,一个块表示层的下半部分,另一个块表示层的上半部分。理想情况下,该算法应该能够实时运行,以便在每帧的基础上计算地形中的任何变形,并将

我正在研究使用体素来表示大型战场(256x256x256体素)的可行性,这些战场具有可破坏的地形,可用于服务器托管的多人游戏。任何一场比赛一次只能有一个战场。然而,为了能够广播房间及其地形的变化,我正在尝试找到一种算法,可以将体素分组到尽可能少的矩形块中

作为一个简单的示例,如果层的下半部分完全填充了一种类型的体素,而上半部分填充了另一种类型的体素,则层应分为两个块,一个块表示层的下半部分,另一个块表示层的上半部分。理想情况下,该算法应该能够实时运行,以便在每帧的基础上计算地形中的任何变形,并将其广播给客户端。这将使客户端能够高效地渲染地形,而不必担心在客户端中重复地形破坏逻辑

以下是我尝试过的方法以及我发现的问题。报告的块计数用于填充256^3的空间,方法是将超过4194304个“地球”体素随机放置到尽可能靠近底部的位置,以获得随机选择的(x,z)坐标。仅计算“接地”块

  • 八叉树:非常快,但是如果我在一个空间的中间分割,它会产生大量的块(800000+)
  • k-D树在分裂后进行分裂以最小化加权熵:略慢于八叉树,但块要少得多(~350000)
  • k-D树拆分以最大化信息增益率:比以前的k-D树方法快两倍,生成的块要少得多(~167000),但仍然很慢
  • k-D树拆分以最小化Gower相似性:非常慢,但生成的块比任何其他k-D树方法都少(~155000)

  • 当考虑到每个无人认领的“地球”块作为块的定义点时,贪婪地抓住最大的非相交块子集,最大的体积块:即使是线程,该算法的速度也非常慢(8核系统上有8个线程,大约16分钟),但它生成的块是所有块中最少的(也许你可以通过使用普通的图像压缩算法来解决这个问题?即将其分割成256个位图(其中每个像素代表一种块类型,每个位图代表一层块)。然后您可以将每个位图压缩为PNG格式进行传输?我认为传输块的位置、尺寸和类型会更有效。我有一些测试文件,它们非常小。此外,这意味着客户端必须弄清楚如何将这些位图中的信息表示为3D g几何,这是我在这里试图解决的同一个问题。我想说的是,通过四叉树或其他你尝试过的算法只压缩二维层,并提供所有的层集,而不试图缩短层的数量。看,战场似乎就像“下面的地面,上面的空气”具有上层尺寸小于下层尺寸的墙或其他结构(如金字塔)。这将导致3D算法在斜坡上卡住,因为您需要将块边界与轴对齐。我尝试了一种新方法:k-D树,拆分以最小化熵,然后最大化拆分一侧的体积。这种方法比其他k-D树方法慢得多,生成约360000个块。这不好。(如果是平面地形的话)我会用RLE压缩来压缩高度轴,并将空气体素设置为背景色。(RLE压缩/解压缩速度非常快),这将节省大量内存(足以忘记树木)。根据地形复杂度,可以从256^3->32*256*256