2013-01-11 11 views
9

Sto provando a realizzare un video delle traiettorie di particelle. Tuttavia, in qualche modo la mia scena non si aggiorna mai. Ecco un esempio molto semplice:Animazione di un mayavi points3d plot

from __future__ import absolute_import, division, print_function 
from mayavi import mlab 
import numpy as np 
import math 

alpha = np.linspace(0, 2*math.pi, 100) 

xs = np.cos(alpha) 
ys = np.sin(alpha) 
zs = np.zeros_like(xs) 

mlab.points3d(0,0,0) 
plt = mlab.points3d(xs[:1], ys[:1], zs[:1]) 

@mlab.animate(delay=100) 
def anim(): 
    f = mlab.gcf() 
    while True: 
     for (x, y, z) in zip(xs, ys, zs): 
      print('Updating scene...') 
      plt.mlab_source.x[0] = x 
      plt.mlab_source.y[0] = y 
      plt.mlab_source.z[0] = z 
      f.scene.render() 
      yield 


anim() 
mlab.show() 

Se eseguo questo script, mostra una finestra con i due punti e la GUI di animazione. Stampa anche un flusso continuo di messaggi "Aggiornamento scena ..." sul terminale. Tuttavia, la scena non mostra alcun movimento.

Cosa sto sbagliando?

Python 2.7, Mayavi 4.1, 5.8 VTK

+0

Sono nuovo nell'uso di Mayavi anche tu - hai provato a usare mlab.clf (figura = mayavi_scene) per cancellare la figura in ogni ciclo? – Griff

risposta

8

basta cambiare a:

...

for (x, y, z) in zip(xs, ys, zs): 
     print('Updating scene...') 
     plt.mlab_source.set(x=x, y=y, z=z) 
     yield 

...

voi non nemmeno bisogno del f.scene.render(), secondo documentationmlab_source.set garantisce l'aggiornamento.

Anche dal shape dei tuoi dati non cambia non è necessario utilizzare mlab_source.reset.

Ho anche provato e funziona correttamente.

1

Hai provato mlab_source.reset? Funziona anche quando la lunghezza degli array x, yez è cambiata.

Nel tuo caso, sarà: plt.mlab_source.reset(x=x,y=y,z=z).