首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PyMeshLab将顶点数减少到一定数量

如何使用PyMeshLab将顶点数减少到一定数量
EN

Stack Overflow用户
提问于 2020-12-23 12:55:15
回答 1查看 626关注 0票数 2

我有一批三角形网格,每个网格都有不同的顶点和面。我想将所有网格的顶点数量减少到相同的数量,10000。

我知道我可以用简化_二次曲面_边缘_崩溃_抽取减少面数,这意味着顶点数将相应减少。但问题是,我必须多次使用该方法,以便将顶点数精确地降至10000。

因此,我想知道是否有其他方法可以直接将顶点数减少到10000?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-23 20:47:26

Meshlab,以及据我所知的任何其他能够简化的库,使用面数作为参数来指导简化过程。

好消息是,这两个值通过欧拉[Euler characteristic](https://en.wikipedia.org/wiki/Euler_characteristic#Polyhedra) ]

这大致表示顶点的数量是没有孔的曲面的面数的一半。将你的网格抽取到20000个面将产生大约10000个顶点的网格,但你也可以很容易地落到9999以下。由于您拥有使用python编程的优势,因此可以设计一个收敛到多个顶点的进程。

因此,我们的想法是将网格简化为面数略高于20000的面数,然后慢慢优化您的解决方案,直到获得10000个顶点。我建议您使用当前步骤中的多余顶点(顶点- 10000)来减少每个步骤中的面数。

代码语言:javascript
复制
import pymeshlab as ml
ms = ml.MeshSet()
ms.load_new_mesh('input.ply')
m = ms.current_mesh()
print('input mesh has', m.vertex_number(), 'vertex and', m.face_number(), 'faces')

#Target number of vertex
TARGET=10000

#Estimate number of faces to have 100+10000 vertex using Euler
numFaces = 100 + 2*TARGET

#Simplify the mesh. Only first simplification will be agressive
while (ms.current_mesh().vertex_number() > TARGET):
    ms.apply_filter('simplification_quadric_edge_collapse_decimation', targetfacenum=numFaces, preservenormal=True)
    print("Decimated to", numFaces, "faces mesh has", ms.current_mesh().vertex_number(), "vertex")
    #Refine our estimation to slowly converge to TARGET vertex number
    numFaces = numFaces - (ms.current_mesh().vertex_number() - TARGET)

m = ms.current_mesh()
print('output mesh has', m.vertex_number(), 'vertex and', m.face_number(), 'faces')
ms.save_current_mesh('output.ply')

请注意:

有时你不能精确地减少到10000个顶点,而会以9999个顶点结束。

使用这个公式,每一步(在第一步之后)将移除超过10000的大约一半的顶点,给出一个“软着陆”到您想要的顶点数量。典型的执行应该减少到大约10050个顶点,然后是10025、10012、10006、10003、10001,最后是10000个顶点。最终的面数取决于输入模型的所述欧拉特性。

只有第一个简化步骤将花费大量的执行时间(取决于输入网格中的三角形数量),并且下一个简化步骤将非常快。

如果你仍然想要加速这个方法,你可以这样做

numFaces = numFaces - int(1.5*(ms.current_mesh().vertex_number() - 10000))

,但这增加了在9999顶点下结束的机会,执行时间不会受到太大影响。

这种方法适用于任何基于人脸的抽取算法,它不是二次边折叠所独有的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65419221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档