Graphics 如何将网格分割成若干块,使所有的块都小于给定数量的顶点?

Graphics 如何将网格分割成若干块,使所有的块都小于给定数量的顶点?,graphics,3d,mesh,Graphics,3d,Mesh,我需要导入一个网格到一个应用程序,它只能处理每个对象一定数量的网格。正因为如此,我不得不将网格分割成几个部分,直到所有图片都低于最大顶点数。拆分必须在运行时进行,因此我不能使用外部应用程序拆分网格 我没有任何关于如何分割网格的要求,但它应该保存所有面、法线和UV 有任何已知的算法可以这样做吗?您需要使用三角形邻接图。从一个三角形开始,标记它。然后从每个三角形的边上,移动相邻的未访问的三角形并标记它们已访问。一旦顶点计数达到极限,创建一个新网格并重新开始。一种既易于编码又能给出相当好的结果的可能性

我需要导入一个网格到一个应用程序,它只能处理每个对象一定数量的网格。正因为如此,我不得不将网格分割成几个部分,直到所有图片都低于最大顶点数。拆分必须在运行时进行,因此我不能使用外部应用程序拆分网格

我没有任何关于如何分割网格的要求,但它应该保存所有面、法线和UV


有任何已知的算法可以这样做吗?

您需要使用三角形邻接图。从一个三角形开始,标记它。然后从每个三角形的边上,移动相邻的未访问的三角形并标记它们已访问。一旦顶点计数达到极限,创建一个新网格并重新开始。

一种既易于编码又能给出相当好的结果的可能性是使用Hilbert排序对三角形进行空间排序[1]。然后遍历三角形的有序列表,将它们分组为n个元素的簇,并生成网格的不同部分。我的GEOGRAM编程库[2]中提供了一个实现。请参见函数mesh_partition()[3]。如果您希望优化零件的“紧凑性”(即最小化每个零件中连接的组件数量),则可以使用图形分割算法,如METIS[4]或SCOTCH[5],应用于面图形(每个面有一个节点,每对相邻面有一条边连接)。但是,它更昂贵(在时间和内存消耗方面)

[1]

[2]

[3]

[4]


[5]

您的网格是否使用索引?它是三角形的吗?如果是,可以迭代索引,将当前索引指向的每个顶点复制到新的较小网格中。当新网格的顶点计数大于最大顶点计数-3时,您将“完成”该网格。@kirkroerig是的,我的网格是三角化的。它是一个有序的顶点列表,每个顶点都包括其uv坐标。面定义为向量列表中3个索引的组。三角形是不相关的,例如,我可以有一个索引为0、300和1534的三角形。