风青天蓝 发表于 2024-10-24 23:44:53

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

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()
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。
下面为斜向投掷动画的实现。在点击画布上的鼠标左键之前,程序不会启动运动序列。
#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
页: [1]
查看完整版本: Python工程数学7VPython制作3D图形和动画(中)