我有一个高分辨率的三角形网格,有大约200万个三角形。我想将三角形和顶点的数量减少到大约每个10000,同时尽可能地保留其一般形状。
我知道这可以使用reducepatch在Matlab中完成。另一种选择是qslim包。 VTK中还有一个具有python接口的抽取功能,所以从技术上讲它也可以在python中使用。 Meshlab也可能在python中可用(?)。
如何在python中进行这种网格抽取?非常感谢例子。
答案 0 :(得分:4)
这是一个从其c ++等效vtk示例(http://www.vtk.org/Wiki/VTK/Examples/Cxx/Meshes/Decimation)翻译而来的最小python原型,正如MrPedru22所建议的那样。
from vtk import (vtkSphereSource, vtkPolyData, vtkDecimatePro)
def decimation():
sphereS = vtkSphereSource()
sphereS.Update()
inputPoly = vtkPolyData()
inputPoly.ShallowCopy(sphereS.GetOutput())
print("Before decimation\n"
"-----------------\n"
"There are " + str(inputPoly.GetNumberOfPoints()) + "points.\n"
"There are " + str(inputPoly.GetNumberOfPolys()) + "polygons.\n")
decimate = vtkDecimatePro()
decimate.SetInputData(inputPoly)
decimate.SetTargetReduction(.10)
decimate.Update()
decimatedPoly = vtkPolyData()
decimatedPoly.ShallowCopy(decimate.GetOutput())
print("After decimation \n"
"-----------------\n"
"There are " + str(decimatedPoly.GetNumberOfPoints()) + "points.\n"
"There are " + str(decimatedPoly.GetNumberOfPolys()) + "polygons.\n")
if __name__ == "__main__":
decimation()
答案 1 :(得分:2)
我建议您使用vtkQuadricDecimation,在视觉上输出模型的质量要比使用vtkDecimatePro(无适当设置)好。
decimate = vtkQuadricDecimation()
decimate.SetInputData(inputPoly)
decimate.SetTargetReduction(0.9)
最重要的事情之一是在保存STL时使用二进制表示形式:
stlWriter = vtkSTLWriter()
stlWriter.SetFileName(filename)
stlWriter.SetFileTypeToBinary()
stlWriter.SetInputConnection(decimate.GetOutputPort())
stlWriter.Write()
答案 2 :(得分:0)
使用 meshlab(主要是 MeshlabXML 库)的最好的优雅和最漂亮的 Python 抽取工具可以在这个 Dr. Hussein Bakri 的存储库中找到 https://github.com/HusseinBakri/3DMeshBulkSimplification
我一直在使用它。看看代码