这是Python Mayavi中的简单动画脚本:
from mayavi import mlab
import numpy as np
alpha = np.linspace(0, 2*np.pi, 100)
beta = np.linspace(0, np.pi, 100)
x = np.sin(beta) * np.cos(alpha)
y = np.sin(beta) * np.sin(alpha)
z = np.cos(beta)
plt = mlab.points3d(x, y, z)
@mlab.animate(delay=100)
def anim():
global x, y, z
f = mlab.gcf()
for _ in range(100):
# x = np.concatenate((x, [np.random.random()]))
# y = np.concatenate((y, [np.random.random()]))
# z = np.concatenate((z, [np.random.random()]))
x = 1.1 * x
plt.mlab_source.set(x=x, y=y, z=z)
f.scene.render()
yield
anim()
mlab.show()
运行良好,并且点可以移动。但是,我想取消对np.concatenate
行的注释,以免动画过程中点数发生变化……Mayavi似乎不支持这一点?
我认为此限制与更新剧情的效率有关,但我希望以上内容能起作用,并且不介意任何速度打击。
有什么想法吗?
我尝试过在mlab.points3d(x, y, z)
之后重新绘制mlab.clf()
,但是随后动画没有显示-仅显示最后一帧。
谢谢。
答案 0 :(得分:1)
您应该每the docs使用reset()
而不是set()
:
x, y = np.mgrid[0:3:1,0:3:1]
s = mlab.surf(x, y, np.asarray(x*0.1, 'd'),
representation='wireframe')
# Animate the data.
fig = mlab.gcf()
ms = s.mlab_source
for i in range(5):
x, y = np.mgrid[0:3:1.0/(i+2),0:3:1.0/(i+2)]
sc = np.asarray(x*x*0.05*(i+1), 'd')
ms.reset(x=x, y=y, scalars=sc)
fig.scene.reset_zoom()