2013-01-11 15 views
9

Ich versuche ein Video über die Flugbahnen von Teilchen zu machen. Allerdings wird meine Szene irgendwie nie aktualisiert. Hier ist ein sehr einfaches Beispiel:Animieren eines 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() 

Wenn ich dieses Skript ausführen, zeigt es ein Fenster mit den zwei Punkten und der Animations-GUI. Es wird auch ein kontinuierlicher Stream von "Aktualisiere Szene ..." Nachrichten auf dem Terminal ausgegeben. Die Szene zeigt jedoch keinerlei Bewegung.

Was mache ich falsch?

Python 2.7, MayaVi 4.1, VTK 5.8

+0

Ich bin auch neu mit Mayavi - haben Sie versucht mit mlab.clf (figure = mayavi_scene), um die Zahl in jedem Zyklus zu löschen? – Griff

Antwort

8

Gerade:

...

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

...

Sie haben nicht einmal die f.scene.render() müssen, nach documentationmlab_source.set die Refresh garantiert.

Auch seit shape Ihrer Daten nicht ändern, müssen Sie nicht mlab_source.reset verwenden.

Ich habe auch getestet und funktioniert gut.

1

Haben Sie versucht mlab_source.reset? Es funktioniert auch dann, wenn die Länge der x-, y- und z-Arrays geändert wird. In Ihrem Fall wird es sein: plt.mlab_source.reset(x=x,y=y,z=z). ändern