Привет, у меня есть треугольная сетка с данными, соответствующими цвету лица, которую я могу построить, используя решение из # 253, например.
mesh = mlab.triangular_mesh(self.vertices[:,0], self.vertices[:,1], self.vertices[:,2], self.triangles,representation='wireframe',opacity=0)
mesh.mlab_source.dataset.cell_data.scalars = color
mesh.mlab_source.dataset.cell_data.scalars.name = 'Cell data'
mesh.mlab_source.update()
mesh2 = mlab.pipeline.set_active_attribute(mesh,cell_scalars='Cell data')
surf = mlab.pipeline.surface(mesh2)
Однако я не знаю, как потом анимировать изменения цвета. Например,
@mlab.animate(delay=100)
def anim():
f = mlab.gcf()
for i in range(0,data.shape[0]):
mesh.mlab_source.dataset.cell_data.scalars = data[i,:]
mesh.mlab_source.dataset.cell_data.scalars.name = 'Cell data'
mesh.mlab_source.update()
mesh2 = mlab.pipeline.set_active_attribute(mesh,cell_scalars='Cell data')
mlab.pipeline.surface(mesh2)
yield
anim()
mlab.show()
делает то, что я хотел бы, но он быстро замедляется по мере продвижения анимации и в конечном итоге становится непригодным для использования. Большинство изменений, которые я пробую (например, удаление команд конвейера), приводят к тому, что изображение вообще не обновляется. Есть ли другой вариант обновления цвета лица?
Я сильно очистил код, создав tvtk.PolyData
вручную. Другое большое изменение, однако, заключается в том, что в документации предлагается использовать метод PolyData.modified()
для обновления фигуры. Однако у меня это не работает - вместо этого я должен использовать метод VTKDataSource.update()
, где VTKDataSource
оборачивает PolyData
и, следовательно, его нужно найти, пройдя поверхностные родители
Итак, окончательный рабочий код был
from mayavi import mlab
from tvtk.api import tvtk
polydata = tvtk.PolyData(points=self.vertices, polys=self.triangles)
polydata.cell_data.scalars = np.ravel(data[:,0].copy())
polydata.cell_data.scalars.name = 'celldata'
mesh = mlab.pipeline.surface(polydata)
@mlab.animate(delay=10)
def anim():
for i in range(0,data.shape[0]):
polydata.cell_data.scalars = np.ravel(data[:,i].copy())
polydata.cell_data.scalars.name = "celldata"
# polydata.modified() # does not work
mesh.parent.parent.update() # works
yield
anim()
mlab.show()
@RomeshA
Потратьте день или два, пытаясь исправить это, и следуйте тому же примеру. Огромное Вам спасибо!
Самый полезный комментарий
@RomeshA
Потратьте день или два, пытаясь исправить это, и следуйте тому же примеру. Огромное Вам спасибо!