I'm trying to make a video of the trajectories of particles. However, somehow my scene never updates. Here's a very simple example:
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()
If I run this script, it shows a window with the two points and the animation GUI. It also prints a continous stream of "Updating Scene..." messages on the terminal. However, the scene doesn't show any movement at all.
What am I doing wrong?
Python 2.7, Mayavi 4.1, VTK 5.8
Just change to:
...
for (x, y, z) in zip(xs, ys, zs):
print('Updating scene...')
plt.mlab_source.set(x=x, y=y, z=z)
yield
...
you don't even need the f.scene.render()
, according to documentation mlab_source.set
guarantees the refresh.
Also since shape
of your data doesn't change you don't need to use mlab_source.reset
.
I also tested and works fine.
Have you tried mlab_source.reset? It works even when the length of the x, y, and z arrays are changed.
In your case, it'll be:
plt.mlab_source.reset(x=x,y=y,z=z)
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With