|
7.3 动画
动画的主要目的是移动物体。正如在现实世界中一样,使用 VPython 方法创建的身体对象应该能够按照物理定律在三维空间中移动。所有位置变化的数学运算通常都在一个无限循环中进行,在本书的后续章节中,我也将其称为动画循环。您可以使用 rate(frequency) 方法来设置动画在 1 秒钟内的执行频率。body.pos=vector(x,y,z) 属性设置了身体在三维空间中的当前位置。
7.3.1 垂直运动 垂直运动时,三维坐标的 x 和 z 分量值为零。
body.v=vector(0,0,0) 属性初始化了速度矢量。body.v*dt 属性根据当前速度与可自由选择的时间间隔 dt 的乘积计算当前位置。标识符 v 可自由选择。
- from vpython import *
- r=1. #radius
- h=5. #height
- scene.background=color.white
- scene.center=vector(0,h,0)
- box(pos=vector(0,0,0),size=vector(2*h,r/2,h), color=color.green)
- ball = sphere(radius=r, color=color.yellow)
- ball.pos=vector(0,2*h,0) #drop height
- ball.v = vector(0,0,0) #initial velocity
- g=9.81
- dt = 0.01
- while True:
- rate(100)
- ball.pos = ball.pos + ball.v*dt
- if ball.pos.y < r:
- ball.v.y = -ball.v.y
- else:
- ball.v.y = ball.v.y - g*dt
复制代码
第 06 行将第 07 行的地板对象 box() 向下移动 5 个长度单位。第 08 行创建了球对象。第 09 行确定下降高度为 10 个单位长度。第 10 行
用 ball.v= vector(0,0,0) 属性初始化。在第 12 行,时间间隔 dt=0.01 被设置为现实值。
无限循环在第 13 行至第 19 行之间运行。由于使用了 rate(100),该循环每秒执行 100 次(第 14 行)。在第 15 行,根据旧球位置和速度 ball.v 与时间间隔 dt 的乘积计算出新球位置 ball.pos。如果球的位置小于球的半径 r,物体球就会向上移动(第 16 和 17 行);否则就会向下移动(第 18 和 19 行)。
7.3.2 水平运动
条形磁铁在线圈内沿 x 轴方向来回运动。线圈对象是使用 helix() 方法创建的。- #11_cylinder_horizontal.py
- from vpython import *
- scene.background=color.white
- scene.width=600
- scene.height=300
- l=10. #length of the coil
- r=l/5. #radius of the core
- scene.center=vector(0,0,0)
- cs=vector(1,0.7,0.2) #copper-colored
- helix(pos=vec(-l/2,0,0),axis=vec(l,0,0),radius=1.25*r,
- coils=10,thickness=0.3,color=cs)
- np = cylinder(pos=vec(l/2,0,0),axis=vec(l/2,0,0),radius=r,
- color=color.red)
- sp = cylinder(pos=vec(0,0,0),axis=vec(l/2,0,0),radius=r,
- color=color.green)
- magnet=compound([np,sp])
- magnet.pos=vector(0,0,0)
- dx = 0.1
- while True:
- rate(50)
- x = magnet.pos
- x = x+vector(dx,0,0)
- magnet.pos = x
- if x.x>l/4. or x.x<=-l/4.:
- dx = -dx
复制代码
在第 12 至 20 行,创建了墙壁的方框对象。第 21 行创建的黄色球体对象球的半径为 r=0.4(第 08 行)。
第 22 行为球对象定义了一个新属性 m。标识符 m 可以自由选择。我们可以选择质量来表示球的质量。第 23 行定义并初始化的 ball.p 向量表示质量的冲量。标识符 p 也可以自由选择。作为提示,以下公式适用于脉冲:
通过该等式可以计算移动的距离:
这同样适用于 y 和 z 方向。
小球运动的动画可以在 while 循环中进行(第 29 至 37 行)。在第 31 行,下面的求和算法将根据脉冲 p、质量 m 和时间间隔 dt 计算出球的当前位置:ball.pos = ball.pos + (ball.p/ball.m)*dt
当球分别弹到侧壁、顶壁、底壁或后壁时,第 32 至 37 行中的 if 查询会使球的运动方向反转。
7.3.4 复合运动
斜抛是制作复合运动动画的一个很好的例子。对于投掷运动的 x 和 y 分量,我们假设以下公式适用:
运动轨迹取决于初速度 v0、投掷角度 α 和投掷高度 h。
下面为斜向投掷动画的实现。在点击画布上的鼠标左键之前,程序不会启动运动序列。
[code]#13_oblique_throw.pyfrom vpython import *h=1.2 #throwing heightb=60. #width of the reference planev0=22.5 #initial velocityalpha=45. #throwing anglealpha=radians(alpha)g=9.81r=b/40.h=h+rscene.background=color.whitescene.width=600scene.height=600scene.center=vector(0,b/4.,0)ball = sphere(pos=vector(-b/2.,h,0),radius=r,color=color.yellow)box(pos=vec(0,-b/50.,0),size=vec(b,b/25.,b/2.),color=color.green)scene.caption="\nStart with mouse click"scene.waitfor('click')dt=0.01t=0.0while True: rate(50) x = v0*t*cos(alpha) y = h + v0*t*sin(alpha) - 0.5*g*t**2 ball.pos = vector(x-b/2.,y+r,0) if y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|