Hola, tengo una malla triangular con datos correspondientes al color de la cara, que puedo trazar usando la solución del n. ° 253, por ejemplo
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)
Sin embargo, no estoy seguro de cómo animar los cambios de color. Por ejemplo,
@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()
hace lo que me gustaría, pero se ralentiza rápidamente a medida que avanza la animación y, finalmente, no se puede utilizar. La mayoría de los cambios que intento (por ejemplo, eliminar los comandos de canalización) dan como resultado que la imagen no se actualice en absoluto. ¿Existe alguna otra opción para actualizar los colores de la cara?
Limpié mucho el código creando un tvtk.PolyData
manualmente. Sin embargo, el otro gran cambio es que la documentación sugiere que el método PolyData.modified()
es lo que debería usarse para actualizar la figura. Sin embargo, esto no funciona para mí; en su lugar, tengo que usar el método VTKDataSource.update()
, donde VTKDataSource
envuelve el PolyData
y, por lo tanto, debe encontrarse atravesando el padres superficiales
Entonces el código de trabajo final fue
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
Pasé uno o dos días tratando de solucionar este problema y seguí el mismo ejemplo. ¡Muchísimas gracias a ti!
Comentario más útil
@RomeshA
Pasé uno o dos días tratando de solucionar este problema y seguí el mismo ejemplo. ¡Muchísimas gracias a ti!