Python工程数学7VPython制作3D图形和动画(中)

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

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 可自由选择。

  • 弹跳球的活动序列动画。示例中未思量阻尼影响
  1. from vpython import *
  2. r=1. #radius
  3. h=5. #height
  4. scene.background=color.white
  5. scene.center=vector(0,h,0)
  6. box(pos=vector(0,0,0),size=vector(2*h,r/2,h), color=color.green)
  7. ball = sphere(radius=r, color=color.yellow)
  8. ball.pos=vector(0,2*h,0) #drop height
  9. ball.v = vector(0,0,0) #initial velocity
  10. g=9.81
  11. dt = 0.01
  12. while True:
  13.     rate(100)
  14.     ball.pos = ball.pos + ball.v*dt
  15.     if ball.pos.y < r:
  16.         ball.v.y = -ball.v.y
  17.     else:
  18.         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() 方法创建的。
  1. #11_cylinder_horizontal.py
  2. from vpython import *
  3. scene.background=color.white
  4. scene.width=600
  5. scene.height=300
  6. l=10. #length of the coil
  7. r=l/5. #radius of the core
  8. scene.center=vector(0,0,0)
  9. cs=vector(1,0.7,0.2) #copper-colored
  10. helix(pos=vec(-l/2,0,0),axis=vec(l,0,0),radius=1.25*r,
  11. coils=10,thickness=0.3,color=cs)
  12. np = cylinder(pos=vec(l/2,0,0),axis=vec(l/2,0,0),radius=r,
  13. color=color.red)
  14. sp = cylinder(pos=vec(0,0,0),axis=vec(l/2,0,0),radius=r,
  15. color=color.green)
  16. magnet=compound([np,sp])
  17. magnet.pos=vector(0,0,0)
  18. dx = 0.1
  19. while True:
  20.     rate(50)
  21.     x = magnet.pos
  22.     x = x+vector(dx,0,0)
  23.     magnet.pos = x
  24.     if x.x>l/4. or x.x<=-l/4.:
  25.         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
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表