马尼姆 set_z_index 与 value_tracker

manim set_z_index with value_tracker

value_tracker 似乎在最后一小段时间更改其值时没有考虑到 z.index,我真的不明白为什么。我故意添加了很多 set_z_index(1) 来尝试解决它,但什么也没做。这是该问题的一种极简主义示例:

from manim import *    
class RatioHF(MovingCameraScene):
        def bar_mouvante(self, x_position, y_position, pourcentage_homme):
            rectangle_de_base = \
                Rectangle(height=1, width=4,
                          stroke_color=BLACK).move_to([x_position, y_position, 0]).set_fill(PINK, opacity=0.8)
    
            remplissage_de_base = \
                Rectangle(height=1, width=2,
                          stroke_color=BLACK).move_to([x_position-1, y_position, 0]).set_fill(BLUE, opacity=0.8)
    
            tracker = ValueTracker(0.5).set_z_index(1)
            pourcentage_de_base = DecimalNumber(0.5, color=BLACK).move_to(remplissage_de_base.get_critical_point(LEFT) +
                                                                          np.array([0.5, 0, 0])).set_z_index(1)
            pourcentage_de_base.add_updater(lambda m: m.set_value(tracker.get_value())).set_z_index(1)
    
            self.play(FadeIn(rectangle_de_base, remplissage_de_base, pourcentage_de_base))
    
            self.play(
                AnimationGroup(
                    remplissage_de_base.animate.become(
                        Rectangle(height=remplissage_de_base.height,
                                  width=pourcentage_homme*4,
                                  stroke_color=BLACK).align_to(rectangle_de_base, LEFT+UP).set_fill(BLUE, opacity=0.8)
                    ),
                    tracker.animate.set_value(pourcentage_homme).set_z_index(1)
                )
            )
    
    
            self.wait()
    
    
        def construct(self):
            self.wait()
            self.bar_mouvante(0, 0, 0.8)
            self.wait()

AnimationGroup时不时会做一些很奇怪的事情。在这个特定的例子中,它打乱了渲染的对象顺序(不幸的是,这是一个特别常见的副作用)。如果你不是绝对必须使用它,请避免使用它。

在这种情况下,您只需将播放调用更改为

        self.play(
            remplissage_de_base.animate.become(
                Rectangle(height=remplissage_de_base.height,
                            width=pourcentage_homme*4,
                            stroke_color=BLACK).align_to(rectangle_de_base, LEFT+UP).set_fill(BLUE, opacity=0.8)
            ),
            tracker.animate.set_value(pourcentage_homme)
        )

它应该可以工作。

请注意,设置 ValueTrackerz_index 不会执行任何操作; ValueTracker 是一个不可见的辅助对象;实际相关的对象是 DecimalNumber.