3

我有一个包含大约 200 万个三角形的高分辨率三角形网格。我想将三角形​​和顶点的数量减少到每个约 10000 个,同时尽可能地保留其一般形状。

我知道这可以在 Matlab 中使用 reducepatch 完成。另一种选择是 qslim 包。在具有 python 接口的 VTK 中也有抽取功能,所以从技术上讲,它在 python 中也是可能的。Meshlab 也可能在 python 中可用(?)。

如何在 python 中进行这种网格抽取?示例将不胜感激。

4

3 回答 3

5

这是从其 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()
于 2016-07-05T09:52:48.457 回答
3

我建议您使用 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()
于 2020-01-10T11:49:19.763 回答
1

使用 meshlab(主要是 MeshlabXML 库)的最佳优雅和最漂亮的 Python 抽取工具可以在 Hussein Bakri 博士的存储库中找到 https://github.com/HusseinBakri/3DMeshBulkSimplification

我用它所有的时间。看看代码

于 2021-05-15T17:59:25.760 回答