我有一个包含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
只是一个一维数组,我希望它是一个二维数组(大小为3 *刻面数),其中第一维包含指向该刻面的对应点数(如.ply文件)。
欢迎提供任何有关进行方法的建议
答案 0 :(得分:1)
您快到了。为了允许使用不同类型的单元(三角形,四边形等),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),
...
]
如果所有多边形都属于同一类型,即所有n_i==n
都为i
,则只需对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))