在Python中从VTK文件中检索facet和point

7
我有一个包含3D模型的vtk文件,
我想提取点坐标和面片。
以下是一个最小工作示例:
import vtk
import numpy
from vtk.util.numpy_support import vtk_to_numpy

reader = vtk.vtkPolyDataReader()
reader.SetFileName('test.vtk')
reader.Update()

polydata = reader.GetOutput()

points = polydata.GetPoints()
array = points.GetData()
numpy_nodes = vtk_to_numpy(array)

这里的numpy_nodes包含了所有点的x、y、z坐标,但我无法找到与该模型相关联的面对应的列表。
我尝试过:
facets= polydata.GetPolys()
array = facets.GetData()
numpy_nodes = vtk_to_numpy(array)

但是numpy_nodes只是一个1D数组,而我期望得到一个2D数组(大小为3 * 面数),其中第一维包含相应面的点的编号(就像.ply文件中一样)。
如果您有任何建议,请告诉我。

“facets” 不包含形成面的顶点索引吗? - user6764549
如果我要求解释器打印出facets,它会给我'(vtkCommonDataModelPython.vtkCellArray)0x7fcbfc0400a8'。 - Anthony Lethuillier
很好,我不知道vtk_to_numpy在vtk中存在。 - normanius
1个回答

3

您差不多就要成功了。为了支持包含不同形状(三角形、四边形等)的单元格,numpy数组使用以下方案来编码信息:

numpyArray = [ n_0, id_0(0), id_0(1), ..., id_0(n0-1), 
               n_1, id_1(0), id_1(1), ..., id_1(n1-1), 
               ... 
               n_i, id_i(0), id_i(1), ..., id_1(n1-1), 
               ...
              ]

如果所有的多边形都是同一种类型,即对于所有的in_i==n,那么只需重塑1D数组即可得到可解释的内容:
cells = polydata.GetPolys()
nCells = cells.GetNumberOfCells()
array = cells.GetData()
# This holds true if all polys are of the same kind, e.g. triangles.
assert(array.GetNumberOfValues()%nCells==0)
nCols = array.GetNumberOfValues()//nCells
numpy_cells = vtk_to_numpy(array)
numpy_cells = numpy_cells.reshape((-1,nCols))
numpy_cells 的第一列可以丢弃,因为它只包含每个单元格的点数。但是剩余的列包含您正在寻找的信息。
为了确保结果,请将输出与“传统”收集点 ID 的方式进行比较:
def getCellIds(polydata):
    cells = polydata.GetPolys()
    ids = []
    idList = vtk.vtkIdList()
    cells.InitTraversal()
    while cells.GetNextCell(idList):
        for i in range(0, idList.GetNumberOfIds()):
            pId = idList.GetId(i)
            ids.append(pId)
    ids = np.array(ids)
    return ids

numpy_cells2 = getCellIds(polydata).reshape((-1,3))

print(numpy_cells[:10,1:])
print(numpy_cells2[:10])
assert(np.array_equal(numpy_cells[:,1:], numpy_cells2))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接