Mayavi: Animer la couleur du visage triangular_mesh

Créé le 26 janv. 2017  ·  2Commentaires  ·  Source: enthought/mayavi

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 ?

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 !

Tous les 2 commentaires

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 !

Cette page vous a été utile?
0 / 5 - 0 notes