Skip to content

动画

rate()

rate(60)

rate(n)语句暂停计算,如果必要的话,确保至少经过1/n秒。

rate()函数是VPython程序中任何动画循环的重要部分。rate(n)有四个重要作用:

  1. 首先,rate(n)确定循环的实际执行速度。rate(1)将使循环每秒执行不超过一次。rate(500)允许循环每秒执行多达500次。具有rate(30)的循环在每台计算机上看起来都一样,不管CPU的内在速度如何。

  2. 其次,rate(n)使动画工作。它允许VPython重新绘制显示,以便对象可以移动,动画可以发生,以及图形可以绘制。在可能的情况下,VPython每秒重新绘制每个画布60次,但在计算循环中没有rate()语句的情况下,这将根本不会发生。没有rate()语句,循环可能会更新对象的位置,但这是不可见的,因为屏幕从未重新绘制。

  3. 第三,rate(n)允许处理鼠标和键盘事件。没有rate()语句的循环会锁定这些事件,直到它完成。

  4. 第四,rate(n)使无限循环可中断。在循环内使用rate()语句,您可以通过单击“编辑此程序”来跳出无限循环。如果没有rate()语句,程序将挂起,唯一的选择是关闭浏览器选项卡。

使用rate()的简单动画。如果省略rate()语句,将看不到任何运动。

python
ball = sphere(pos=vec(-3,-3,0), radius=0.3, color=color.yellow, make_trail = True)
velocity = vec(0.5, 0.5, 0)
dt = 0.1

while ball.pos.y < 3:
    rate(30)
    ball.pos = ball.pos + velocity * dt

make_trail 和 rate()

如果轨迹的点之间相距很远,则不要使用大于rate(60)的速率。VPython尝试每秒渲染约60次3D场景。每次渲染场景时,它都会查看所有指定了“make_trail=True”的对象的列表,如果对象的pos属性已更改,则渲染函数会扩展轨迹。如果您指定rate(300),并且您在每次循环中仅更新对象的位置一次,则对象的每5个位置将被添加到轨迹中,因为场景每秒只渲染约60次。相比之下,如果您指定rate(10)并且在每次循环中仅更新对象的位置一次,则轨迹将每秒扩展10次。

动画速度

Web VPython本质上比Python快,因为它被转译成JavaScript,而JavaScript循环比Python循环快得多。然而,将Python字典添加到Web VPython的3.2版本中导致了一些Web VPython循环的减速。在大多数情况下,这将不会被注意到。然而,如果您的代码循环密集(例如,如果您一次动画大量粒子),您可能希望通过将程序的第一行更改为:Web VPython 3.2 nodictionary