我正在尝试制作粒子轨迹的视频。但是,某种程度上我的场景永远不会更新这是一个非常简单的例子:
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()
如果我运行此脚本,它会显示一个包含两个点和动画GUI的窗口。它还在终端上打印连续的“正在更新场景...”消息流。但是,场景根本没有任何动作。
我做错了什么?
Python 2.7,Mayavi 4.1,VTK 5.8
答案 0 :(得分:10)
只需更改为:
...
for (x, y, z) in zip(xs, ys, zs):
print('Updating scene...')
plt.mlab_source.set(x=x, y=y, z=z)
yield
...
您甚至不需要f.scene.render()
,根据documentation mlab_source.set
保证刷新。
此外,由于您的数据shape
未发生变化,因此您无需使用mlab_source.reset
。
我也测试过并且工作正常。
答案 1 :(得分:1)
你试过mlab_source.reset吗?即使x,y和z数组的长度发生变化,它也能正常工作。
在你的情况下,它将是:
plt.mlab_source.reset(x=x,y=y,z=z)
。