翼度科技»论坛 编程开发 python 查看内容

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

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
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

举报 回复 使用道具