Salut, j'ai un maillage triangulaire avec des données correspondant à la couleur du visage, que je peux tracer à l'aide de la solution de #253, par exemple
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)
Cependant, je ne sais pas comment animer ensuite les changements de couleur. Par exemple,
@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()
fait ce que je voudrais, mais il ralentit rapidement au fur et à mesure que l'animation progresse et est finalement inutilisable. La plupart des modifications que j'essaie (par exemple, la suppression des commandes de pipeline) entraînent la non mise à jour de l'image. Existe-t-il une autre option pour mettre à jour les couleurs du visage ?
J'ai beaucoup nettoyé le code en créant un tvtk.PolyData
manuellement. L'autre grand changement, cependant, est que la documentation suggère que la méthode PolyData.modified()
doit être utilisée pour mettre à jour la figure. Cependant, cela ne fonctionne pas pour moi - à la place, je dois utiliser la méthode VTKDataSource.update()
, où le VTKDataSource
enveloppe le PolyData
et doit donc être trouvé en parcourant le parents superficiels
Le code de travail final était donc
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
Passez un jour ou deux à essayer de résoudre ce problème et suivais le même exemple. Un grand merci à vous !
Commentaire le plus utile
@RomeshA
Passez un jour ou deux à essayer de résoudre ce problème et suivais le même exemple. Un grand merci à vous !