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?
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ê!
Comentários muito úteis
@RomeshA
Passei um ou dois dias tentando consertar isso e estava seguindo o mesmo exemplo. Muito obrigado a você!