Manim/python 覆盖更新函数,仅对最后一个更新程序进行动画处理

问题描述 投票:0回答:1

我正在尝试制作 Manim 动画,其中点遵循一组径向基函数作为 x 的函数。我还制作了一条垂直线,点应该完全遵循该线。奇怪的是,这些点似乎相互重叠,使得动画中看起来好像只有一个点。使用

pdb.set_trace
,我看到每个 Dot 中的更新函数在 for 循环的每次迭代中都会发生变化。函数或
deepcopy
对象的
Dot
似乎并不能阻止这种情况的发生。我该怎么做才能为每个点拥有不同的更新程序功能?

from manim import *
import numpy as np
from scipy.stats import norm
import pdb


class RDFBasis(Scene):
    def construct(self):
        axes = Axes(
            x_range=[0, 5, 1],
            y_range=[0, 1, 0.2],
            x_length=10,
            tips=False,
        )
        axes_labels = axes.get_axis_labels()

        vt = ValueTracker(0)
        line = Line(axes.c2p(0, 1), axes.c2p(0, 0))
        line.add_updater(lambda x: x.move_to(axes.c2p(vt.get_value(),  0.5)))

        graphs = []
        dots = []
        anims = []
        for i in np.linspace(0, 5, 5):
            func = lambda x: norm.pdf(x, loc=i, scale=0.5)
            graph = axes.plot(func, color=RED)
            graphs.append(graph)

            dot = Dot()
            dot.move_to(graph.get_start())
            dot_mover = lambda x=dot, graph=graph: x.move_to(graph.get_point_from_function(vt.get_value()))
            dot.add_updater(dot_mover)
            dots.append(dot)
            # pdb.set_trace()


        plot = VGroup(axes, *graphs)
        labels = VGroup(axes_labels)
        # pdb.set_trace()
        self.add(plot, labels, line, *dots)
        self.play(vt.animate.set_value(5.0))
python manim
1个回答
0
投票

我不是Python专家,所以我不确定为什么会发生这种情况,但是for循环中的lambda以某种方式破坏了

graph.get_point_from_function()
函数。用这样的东西替换你的代码将使它工作:

...
func1 = lambda x: norm.pdf(x, loc=1, scale=0.5)
func2 = lambda x: norm.pdf(x, loc=2, scale=0.5)
func3 = lambda x: norm.pdf(x, loc=3, scale=0.5)
    
funcs = [func1, func2, func3]

    
    for i in range(3):
        graph = axes.plot(funcs[i], color=RED)
        graphs.append(graph)
        ...
© www.soinside.com 2019 - 2024. All rights reserved.