我无法使用 Mayavi 为表面制作动画

I can't animate a surface with Mayavi

我想用 Mayavi 做一个简单的表面动画,但由于缺乏在线示例(少数非常不清楚或没有用)和官方文档,我很费力。我写了一个非常简单的代码来显示我到目前为止的进展

import numpy as np
from mayavi import mlab
import time

#Meshgrid + u + Surface

x = np.arange(0,1,0.1)
y = np.arange(0,1,0.1)
X,Y = np.meshgrid(x,y)
u = np.ones((10,10))
surf = mlab.mesh(X,Y,u)

#Surface animation

@mlab.animate(delay=1000)
def anim():
    for n in range(1,10):
        global u
        print(n)

        u = u+1
        surf.mlab_source.scalars = u
        yield
anim()
mlab.show()

非常简单,每次迭代我都会从 10x10 的矩阵传递到 10x10 的二进制矩阵,依此类推。

我遇到的问题有3个

我真的无法理解,这几周我一直在努力,希望有人能帮忙。提前致谢。

编辑:

我尝试扩展@E.Klahn 的代码,这个案例更像我的

import numpy as np
from mayavi import mlab

s = 0.01
x = np.arange(0,1,0.1)
y = np.arange(0,1,0.1)
X,Y = np.meshgrid(x,y)
Z = np.ones((10,10))

m = mlab.mesh(X, Y, Z)

@mlab.animate(delay=20)
def anim():
     for i in range(1,100):
         m.mlab_source.z = np.ones((10,10))*s*i
         yield

 anim()
 mlab.show()

但我得到的只是一个上升的平面,而不是像他的代码中那样不断演化的三维物体。

编辑2:

这里的工作代码只是复制了@E.Klahn的例子,非常感谢

import numpy as np
from mayavi import mlab

x = np.arange(0,1,0.1)
y = np.arange(0,1,0.1)
X,Y = np.meshgrid(x,y)
X,Y=X.T,Y.T            #seems an important command
u = np.ones((10,10))
surf = mlab.surf(X,Y,u)

@mlab.animate(delay=500)
def anim():
    for n in range(1,10):
        print(n)

        surf.mlab_source.scalars = 1+np.sin(X)*np.sin(Y)*np.sin(n)
        yield
anim()
mlab.show()

我只是将其打印出来,以提供上面代码的连续性并找出差异。

在这里,我展示了绘制立方体并为其设置动画的代码,以便它使用 mlab.mesh 从 0.01 的高度增长到 1 的高度。 yield 的作用是 returns 控制装饰器,以便更新场景。

import numpy as np
from mayavi import mlab

s = 0.01
X = np.array([[0,0,1,1],[0,0,1,1],[0,0,0,0],[1,1,1,1]])
Y = np.array([[0,1,1,0],[0,1,1,0],[1,0,0,1],[1,0,0,1]])
Z = np.array([[0,0,0,0],[s,s,s,s],[0,0,s,s],[0,0,s,s]])

m = mlab.mesh(X, Y, Z)

@mlab.animate(delay=20)
def anim():
    for i in range(1,101):
        print(i, end='\r')
        m.mlab_source.z = np.array([[0,0,0,0],[s*i,s*i,s*i,s*i],[0,0,s*i,s*i],[0,0,s*i,s*i]])
        yield

anim()
mlab.show()
如果该数据结构具有 scalars 属性,

scalars 是一种访问底层数据结构的方法。但是,对于 mesh,该属性未被使用,而是您想访问 z 并设置这些值。除非有回溯工作,否则我不知道 u 的具体问题是什么。与 yield 相同 - 我看不出为什么该关键字会在任何特定步骤停止动画。

下面的代码显示的不是随时间演变的盒子,而是随时间演变的表面。

import numpy as np
from mayavi import mlab

def evolving_function(X, Y, t, Lx=1, Ly=1):
    
    return np.sin(X+Lx*t)*np.sin(Y+Ly*t)

Lx, Ly = 1,2

x = np.linspace(-10,10,100)
y = np.linspace(-10,10,100)
X,Y = np.meshgrid(x,y)
X, Y = X.T, Y.T
s = evolving_function(X, Y, 0, Lx=Lx, Ly=Ly)

m = mlab.surf(X, Y, s)

dt = 50
t = 10
steps = int(10*1000/dt)

@mlab.animate(delay=dt)
def anim():
     for i in range(1,steps):
         m.mlab_source.scalars = evolving_function(X, Y, dt*i, Lx=Lx, Ly=Ly)
         yield

anim()
mlab.show()