如何在Manim中制作右端固定的可振荡弹簧动画
实现固定右端的振荡弹簧
要让弹簧右端固定,仅左侧带质量的部分做振荡,需要固定弹簧的右端点,并动态调整弹簧的长度和形状以匹配质量的运动。以下是修改后的代码:
from manim import * import numpy as np class YoungModulus(Scene): def construct(self): # 设定弹簧右端的固定点 fixed_right_end = RIGHT * 4 # 用ValueTracker跟踪质量的x坐标,控制振荡运动 mass_x_pos = ValueTracker(-2) # 动态生成弹簧:右端固定在fixed_right_end,左端随质量位置变化 spring = always_redraw(lambda: ParametricFunction( # 调整正弦函数参数,保证弹簧圈数在拉伸/压缩时保持一致 lambda t: [ t, np.sin(6 * (t - mass_x_pos.get_value()) / (fixed_right_end[0] - mass_x_pos.get_value())), 0 ], # t范围从当前质量的x坐标到固定点的x坐标,确保右端固定 t_range=[mass_x_pos.get_value(), fixed_right_end[0]], color=YELLOW, stroke_width=4 )) # 创建质量块 mass = Circle( radius=0.5, color=RED, fill_opacity=1, stroke_width=0 ) # 让质量块始终跟随弹簧左端 mass.add_updater(lambda m: m.move_to(spring.get_start())) # 可选:添加固定端的标记,方便观察 fixed_dot = Dot(fixed_right_end, color=BLUE) fixed_label = Text("固定端").next_to(fixed_dot, UP) # 入场动画 self.play(FadeIn(spring, mass, fixed_dot, fixed_label)) # 执行振荡动画:质量在x=-2和x=0之间来回运动 for _ in range(2): self.play( mass_x_pos.animate.set_value(0), rate_func=smooth, run_time=1 ) self.play( mass_x_pos.animate.set_value(-2), rate_func=smooth, run_time=1 ) self.wait()
关键修改点:
- 固定右端点:通过
fixed_right_end设定弹簧右端的固定位置,动画过程中该点不会移动。 - 动态调整弹簧长度:弹簧的
t_range根据质量的实时x坐标动态变化,确保右端始终锚定在固定点,左端跟随质量移动。 - 保持弹簧圈数一致:正弦函数的参数中加入了长度比例计算,避免弹簧拉伸/压缩时圈数变形。
- 质量块联动:通过updater让质量块始终与弹簧左端绑定,无需手动调整位置。
内容的提问来源于stack exchange,提问作者Pulsar Plasma
相关产品推荐
相关产品推荐

