能否修改Manim中Mobject的中心?旋轮线曲柄动画遇布局问题
解决旋轮线曲柄动画的位置对齐问题
当然可以修改Mobject的中心,不用默认的质心。你的问题根源在于:默认情况下VGroup的center是组内所有元素的质心平均值,而你需要的是让第二个曲柄的端点(那个dot)对齐到第一个曲柄的arc中心,所以得手动把曲柄组的中心设置为我们需要的锚点位置。
具体修改步骤
- 重设曲柄组的中心:在创建第一个曲柄
crank后,将其中心设置为端点dot的位置,这样后续move_to操作就会以这个端点为基准移动。 - 同步旋转逻辑:把第二个曲柄的旋转和第一个曲柄绑定,避免用独立的时间增量
dt导致转速不同步,保证动画的一致性。
修改后的完整代码
RADIUS = 0.2 class SpirographCranks(Scene): def construct(self): dot = Dot(ORIGIN) line = Line(ORIGIN, RIGHT * (2 - RADIUS)) arc = Arc(arc_center=RIGHT*2, angle=PI, start_angle=PI/2, radius=RADIUS) crank = VGroup(dot, line, arc) # 将曲柄组的中心设置为端点dot的位置,替代默认质心 crank.set_center(dot.get_center()) self.add(crank) crank2 = crank.copy() def update(mobj, dt): # 让crank2的端点对齐到第一个crank的arc中心 mobj.move_to(crank.arc.get_center()) # 同步第一个crank的旋转角度,可根据需求调整方向/转速比 mobj.set_rotation(crank.get_rotation()) crank2.add_updater(update) self.add(crank2) self.play(Rotate(crank, angle=2*PI, rate_func=linear, about_point=ORIGIN), run_time=4)
额外说明
如果需要实现标准旋轮线的动画,第二个曲柄的转速可能需要调整(比如反向旋转或转速为第一个曲柄的特定倍数),只需要修改mobj.set_rotation的参数即可,例如:
- 反向旋转:
mobj.set_rotation(-crank.get_rotation()) - 2倍转速:
mobj.set_rotation(2 * crank.get_rotation())
内容的提问来源于stack exchange,提问作者141592653
相关产品推荐
相关产品推荐

