Mayavi: Animando a cor do rosto da malha triangular

Criado em 26 jan. 2017  ·  2Comentários  ·  Fonte: enthought/mayavi

Olá, tenho uma malha triangular com dados correspondentes à cor do rosto, que posso representar graficamente usando a solução de # 253, por exemplo

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)  

No entanto, não tenho certeza de como animar as mudanças na cor. Por exemplo,

@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()

faz o que eu gostaria, mas fica lento rapidamente conforme a animação avança e, eventualmente, fica inutilizável. A maioria das alterações que tento (por exemplo, remover os comandos do pipeline) resulta na imagem não sendo atualizada. Existe alguma outra opção para atualizar as cores do rosto?

Comentários muito úteis

@RomeshA

Passei um ou dois dias tentando consertar isso e estava seguindo o mesmo exemplo. Muito obrigado a você!

Todos 2 comentários

Eu limpei muito o código criando um tvtk.PolyData manualmente. A outra grande mudança, entretanto, é que a documentação sugere que o método PolyData.modified() é o que deve ser usado para atualizar a figura. No entanto, isso não funciona para mim - em vez disso, tenho que usar o método VTKDataSource.update() , onde VTKDataSource envolve PolyData e, portanto, precisa ser encontrado percorrendo o pais superficiais

Então, o código de trabalho final foi

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

Passei um ou dois dias tentando consertar isso e estava seguindo o mesmo exemplo. Muito obrigado a você!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Mallcock1 picture Mallcock1  ·  10Comentários

anntzer picture anntzer  ·  7Comentários

indranilsinharoy picture indranilsinharoy  ·  9Comentários

ktavabi picture ktavabi  ·  15Comentários

Make42 picture Make42  ·  7Comentários