我想知道使用VisPy是否有可能,或者我应该开始寻找其他替代方法。
这是发生的事情-我正在写一篇关于狭义相对论情况的本科论文。我实际上是在做这个,我会在python中有一些脚本,该脚本会生成有序三重数组(3D空间中的点),这些数组会随变量的时间而变化(“like like”变量实际上是速度,但它将计数)就像时间一样)。我需要为这些点设置动画,在较简单的情况下,这些点将形成杆,2D正方形和3D立方体,并且当然会产生.gif或类似图像。
编码绝对不是我的强项,但是我已经使用Python一段时间了。我研究了VisPy,它喜欢使用OpenGL功能,并且通常喜欢各种示例的出色程度(我可以开始工作)。
我的问题是: VisPy是我需要做的最好的事情吗?我很难弄清楚如何使VisPy将单个点变成3D对象,诸如此类-我玩过诸如create_cube之类的各种Geometry,但是看起来我不能只移动顶点。
如果有人对从哪里开始有任何建议,或者Mayavi或其他方法会更容易,请告诉我。
更新:我确实弄清楚了如何制作一个非常好(且简单)的3D立方体轮廓,这正是我想要的。我仍然不确定如何设置动画,因为使用VisPy进行动画制作的示例完全不同。
有人有方向吗?在代码中,需要发生的是点的初始数组需要更新每帧(可以在脚本中以任何一种方式导入或计算点)
import numpy as np
import vispy
import vispy.scene
from vispy.scene import visuals
from vispy import app
canvas = vispy.scene.SceneCanvas(keys='interactive', show=True)
view = canvas.central_widget.add_view()
# generate data
pos = np.array([[0, 0, 0], [0.5, 0.5, 0.5], [0, 0.5, 0.5], [0.5, 0, 0.5],
[0.5, 0.5, 0], [0, 0, 0.5], [0, 0.5, 0], [0.5, 0, 0]])
# These are the data that need to be updated each frame --^
scatter = visuals.Markers()
scatter.set_data(pos, edge_color=None, face_color=(1, 1, 1, .5), size=10)
view.add(scatter)
view.camera = 'turntable'
# just makes the axes
axis = visuals.XYZAxis(parent=view.scene)
if __name__ == '__main__':
import sys
if sys.flags.interactive != 1:
vispy.app.run()
最佳答案
我有同样的问题,尽管它寻求解决方案。我检查了Vispy API并更改了代码,效果很好。
希望这对您和其他人有帮助。
import numpy as np
import vispy
import vispy.scene
from vispy.scene import visuals
from vispy import app
canvas = vispy.scene.SceneCanvas(keys='interactive', show=True)
view = canvas.central_widget.add_view()
view.camera = 'turntable'
# generate data
def solver(t):
pos = np.array([[0.5 + t/10000, 0.5, 0], [0, 0, 0.5], [0, 0.5, 0], [0.5, 0, 0]])
return pos
# These are the data that need to be updated each frame --^
scatter = visuals.Markers()
view.add(scatter)
#view.camera = scene.TurntableCamera(up='z')
# just makes the axes
axis = visuals.XYZAxis(parent=view.scene)
t = 0.0
def update(ev):
global scatter
global t
t += 1.0
scatter.set_data(solver(t), edge_color=None, face_color=(1, 1, 1, .5), size=10)
timer = app.Timer()
timer.connect(update)
timer.start(0)
if __name__ == '__main__':
canvas.show()
if sys.flags.interactive == 0:
app.run()
关于python - VisPy动画从NumPy数组逐点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47970212/