先看实现后的动画
说明:黄色箭头出现即指向的位置,为二者达到共速点的位置
滑块木板运动动画
原码
from vpython import *
'''
'''
#滑块参数
l1, h1, w1 = 0.2, 0.2, 0.2 #长高宽
m1, v1, c1 = 2, 5, color.red
#木板参数
l2, h2, w2 = 1, 0.2, 0.4 #长高宽
m2, v2, c2 = 0.5, 0, color.green
# 公共参数
floor_l=6 #地板长度
g = 10 #重力加速度
dt = 0.0001 # 时间间隔
mu = 0.3 #滑动摩擦系数
t = 0 #时间
i = 0 #共速标志位,同时控制循环跳出
iMax = 1200 #达到共速后,为了动画好看,再滑动一会
''' 滑板运动的场景'''
room = canvas(title='板块滑动动画', width = 800, height=600, center=vec(0, 0.5, 0),
background=color.gray(0.4))
cameraPos = vec(1.5,2,4)
room.camera.pos = cameraPos #摄像机,即观察者的位置
room.camera.axis = cameraPos * -1 #摄像机对准的方向,这里指向原点
x = arrow(pos=vector(0,0,0), axis=vector(1,0,0), length=2, shaftwidth=0.1, color=color.white) #坐标轴
y = arrow(pos=vector(0,0,0), axis=vector(0,1,0), length=2, shaftwidth=0.1, color=color.white)
#z = arrow(pos=vector(0,0,0), axis=vector(0,0,1), length=2, shaftwidth=0.1, color=color.white)
# 画地面
floor = box(pos=vec(0.5 * floor_l, -0.1, 0), size=vec(floor_l,0.2,4), color=color.gray(0.6))
# 画木板
ban = box(pos=vec(0.5*l2, 0.5*h2, 0), size=vec(l2, h2, w2), color=c2, v=vec(v2,0,0))
# 画滑块
kuai = box(pos=vec(-1, h2+0.5*h1, 0), size=vec(l1,h1,w1),color=c1,v=vec(v1,0,0))
# 画v-t图像
tu=graph(title='v-t图像', x=650, y=300, width=600, height=450, xtitle="t(s)", ytitle="v(m/s), 红色:滑块;绿色:木板")
kuai_vt = gcurve(graph=tu,color=c1)
ban_vt = gcurve(graph=tu, color=c2)
while kuai.pos.x < 0:
rate(1000)
kuai.pos.x += kuai.v.x * dt
""" 制作动态过程"""
#执行循环,滑块掉下来或者
while (ban.pos.x + l1 / 2) >= ban.pos.x >= 0 and i < iMax:
# print(kuai.v.x , ban.v.x)
rate(1000)
if kuai.v.x > ban.v.x:
f = mu*m1*g
ban.a = vec(f/m2, 0, 0)
kuai.a = vec(-f/m1, 0, 0)
elif kuai.v.x < ban.v.x:
f = mu*m1*g
ban.a = vec(-f/m2, 0, 0)
kuai.a = vec(f/m1, 0, 0)
else:
f = 0
ban.a = vec(0, 0, 0)
kuai.a = vec(0, 0, 0)
#求共速的时间
if abs(kuai.v.x - ban.v.x) < 0.005 and i==0:
T = t
i = 1
# 在共速的位置弄个箭头作标识
arrow(pos=vec(kuai.pos.x, 1, 0),axis=vector(0,-1,0), length=0.6, shaftwidth=0.1, color=color.yellow)
elif i >0:
# 共速后,为了动画好看,再滑动一点时间
i += 1
# 求两物体速度和位置
ban.v += ban.a * dt
kuai.v += kuai.a * dt
ban.pos += ban.v * dt
kuai.pos += kuai.v * dt
# 画出 v-t 图
ban_vt.plot(pos=(t, ban.v.x))
kuai_vt.plot(pos=(t, kuai.v.x))
t += dt
# 求相对位移
S = kuai.pos.x - 0.5*l1 - (ban.pos.x - 0.5*l2)
print('到达共速的时间:', T)
print('相对位移:', S)
感谢B站大神布鲁斯特147