我无法使用 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个
- 我真的不明白
mlab_source.scalars
做了什么:从根本上说,我不知道如何告诉它 z 轴正在变化,并且在这样做时它遵循 u
- Mayavi 打开了,但是网格全是平面和黑色,好像
u
有问题
- 我不明白
yield
做了什么:在我写的实际代码中它提前很多停止了计算(比如在 300 步中它在第 29 步停止),但是我无法删除它
我真的无法理解,这几周我一直在努力,希望有人能帮忙。提前致谢。
编辑:
我尝试扩展@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()
我想用 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个
- 我真的不明白
mlab_source.scalars
做了什么:从根本上说,我不知道如何告诉它 z 轴正在变化,并且在这样做时它遵循u
- Mayavi 打开了,但是网格全是平面和黑色,好像
u
有问题
- 我不明白
yield
做了什么:在我写的实际代码中它提前很多停止了计算(比如在 300 步中它在第 29 步停止),但是我无法删除它
我真的无法理解,这几周我一直在努力,希望有人能帮忙。提前致谢。
编辑:
我尝试扩展@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()