来自 NumPy 数组的逐点 VisPy 动画

Ast*_*son 6 python animation numpy mayavi vispy

我想知道使用 VisPy是否有可能,或者我是否应该开始寻找其他替代方案。

这是发生了什么 - 我正在写一篇关于狭义相对论的一些类似悖论的情况的本科论文。我所做的基本上就是这样,我将在 python 中使用一些脚本生成有序三元组(3D 空间中的点)的数组,这些数组随时间变量(“时间变量”实际上是速度,但它会计数)就像时间一样)。我需要对这些点进行动画处理,在更简单的情况下,它们将形成棒、2D 方块和 3D 立方体,当然还会生成 .gif 或类似的文件。

编码绝对不是我的强项,但我已经使用 Python 有一段时间了。我已经研究过 VisPy 并且喜欢它使用 OpenGL 功能,并且通常喜欢各种示例的好坏(我可以开始工作)。

我的问题是: VisPy 是我需要做的最好的事情吗?我很难弄清楚如何让 VisPy 将单个点制作成 3D 对象等等 - 我已经玩过各种 Geometry 东西,比如 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()
Run Code Online (Sandbox Code Playgroud)

小智 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()
Run Code Online (Sandbox Code Playgroud)