Я узнал о vtkInterface
, vtkInterface
vtk
wrapper, который облегчает построение vtk
.
Пытаясь запустить свой первый пример, в разделе " Initialize from Numpy Arrays
на этой странице: vtkInterface.PolyData, просто запустив код как есть, и в результате получится серое окно рендеринга, в котором ничего нет.
Некоторые из других примеров работают, но это именно то, что мне нужно в данный момент, и задавалось вопросом, пробовал ли кто-нибудь его и знает, что может быть неправильным.
Пример кода:
import numpy as np
import vtkInterface
# mesh points
vertices = np.array([[0, 0, 0],
[1, 0, 0],
[1, 1, 0],
[0, 1, 0]])
# mesh faces
faces = np.hstack([[4, 0, 1, 2, 3], # square
[3, 0, 1, 4], # triangle
[3, 1, 2, 4]]) # triangle
surf = vtkInterface.PolyData(vertices, faces)
# plot each face with a different color
surf.Plot(scalars=np.arange(3))
Пример неправильный. Ему не хватает пятого пункта. Например, это сработает.
vertices = np.array([[0, 0, 0],
[1, 0, 0],
[1, 1, 0],
[0, 1, 0],
[0.5, 0.5, -1]])
Объяснение: В VTK грани кодируются следующим образом:
face_j = [ n, i_0, i_1, ..., i_n ]
Здесь n
- количество точек на лицо, а i_k
- индексы точек в вершинном массиве. Лицо формируется путем соединения точек vertices[i_k]
с k in range(0,n)
. Список граней создается простым конкатенацией спецификаций одного лица:
np.hstack([face_0, face_1, ..., face_j, ...])
Преимущество этого кодирования состоит в том, что количество точек, используемых на лице, n
, может варьироваться. Таким образом, сетка может состоять из линий, треугольников, квадроциклов и т.д.
В примере вершина с id 4 используется во второй и третьей грани. Поэтому vertices
должны состоять как минимум из пяти записей. Удивительно, но образец не падает, поскольку VTK почти наверняка будет, если некоторые лица будут обращаться к несуществующим точкам.