从NumPy数组逐点进行VisPy动画

6
我想知道在VisPy中是否可能实现某个功能,或者我应该开始寻找其他替代方案。
这是我的情况-我正在撰写一篇关于狭义相对论中类似悖论的论文。我将编写一些Python脚本,生成随时间变化的有序三元组数组(3D空间中的点),其中“类似时间”的变量实际上是速度,但它会像时间一样计算。我需要为这些点制作动画,在简单情况下,这些点将形成杆、2D正方形和3D立方体,并且当然要生成.gif或类似的东西。
编程绝对不是我的长项,但我已经使用Python有一段时间了。我研究了VisPy,并喜欢它使用OpenGL功能,以及通常喜欢各种漂亮的示例(我可以让它们工作)。
我的问题是:VisPy是我需要做的最好的事情吗?我很难弄清楚如何使VisPy将单独的点变成3D对象等——我已经尝试过各种几何形状,例如create_cube,但似乎无法仅移动顶点。
如果有人有任何建议,请告诉我从哪里开始,或者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()
1个回答

5

我和你遇到了同样的问题,不过最终找到了解决方法。我查看了 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()

非常好的示例,谢谢!这应该放在Vispy快速入门页面上!(只是缺少'import sys'才能成为完美的hello world 示例。) - Avio
谢谢你的回答!你也可以在回调函数中使用ev.elapsed来获取实际时间! - Paddy Harrison
谢谢!只有当我设置timer.start(0.05),即一些小延迟时,这才对我有效。 - Julius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接