0

我想manim花 4 秒动画创建一个扇区。虽然整个动画持续了 4 秒,但创作部分只有一半。我尝试过扩展run_time参数,但要获得完整的 4 秒创建时间,我必须将持续时间设为 8 秒。实际绘图在 4 秒后完成,但我的动画比必要的长 50%,而后半部分只是坐在那里无所事事。我一定做错了什么,但我对 manim 很陌生,所以我不确定我做错了什么。也许是rate_func参数。

MWE:

from manimlib.imports import *

class Circ(Scene):
    def construct(self):
        shape = Sector(color=GOLD_B,
                       fill_color=GOLD_B,
                       fill_opacity=1,
                       angle=360*DEGREES)
        self.play(ShowCreation(shape,
                               lag_ratio=0,
                               rate_func=lambda t: linear(1 - t),
                               run_time=4*2)) # because we want 4 seconds for the circle's creation

我已经尝试过没有lag_ratio(实际上还不确定它是做什么的)。rate_func我从Uncreatein借来的animation.py。我目前最好的猜测是这个函数占用了run_time参数的全部时间,但看起来只使用了一半。我试过其他功能,原来Uncreatesmooth. 它有所不同,但似乎仍然没有填满整个 4 秒。

提前致谢。

4

1 回答 1

0

问题如下,如果我们打印曲线的控制点,我们会看到以下内容:

print(shape.points)

回报:

[[ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 3.33333333e-01 -8.16431199e-17  0.00000000e+00]
 [ 6.66666667e-01 -1.63286240e-16  0.00000000e+00]
 [ 1.00000000e+00 -2.44929360e-16  0.00000000e+00]
 [ 1.00000000e+00 -2.44929360e-16  0.00000000e+00]
 [ 1.00000000e+00 -2.61799388e-01  0.00000000e+00]
 [ 8.92226904e-01 -5.21986659e-01  0.00000000e+00]
 [ 7.07106781e-01 -7.07106781e-01  0.00000000e+00]
 [ 7.07106781e-01 -7.07106781e-01  0.00000000e+00]
 [ 5.21986659e-01 -8.92226904e-01  0.00000000e+00]
 [ 2.61799388e-01 -1.00000000e+00  0.00000000e+00]
 [-1.83697020e-16 -1.00000000e+00  0.00000000e+00]
 [-1.83697020e-16 -1.00000000e+00  0.00000000e+00]
 [-2.61799388e-01 -1.00000000e+00  0.00000000e+00]
 [-5.21986659e-01 -8.92226904e-01  0.00000000e+00]
 [-7.07106781e-01 -7.07106781e-01  0.00000000e+00]
 [-7.07106781e-01 -7.07106781e-01  0.00000000e+00]
 [-8.92226904e-01 -5.21986659e-01  0.00000000e+00]
 [-1.00000000e+00 -2.61799388e-01  0.00000000e+00]
 [-1.00000000e+00  1.22464680e-16  0.00000000e+00]
 [-1.00000000e+00  1.22464680e-16  0.00000000e+00]
 [-1.00000000e+00  2.61799388e-01  0.00000000e+00]
 [-8.92226904e-01  5.21986659e-01  0.00000000e+00]
 [-7.07106781e-01  7.07106781e-01  0.00000000e+00]
 [-7.07106781e-01  7.07106781e-01  0.00000000e+00]
 [-5.21986659e-01  8.92226904e-01  0.00000000e+00]
 [-2.61799388e-01  1.00000000e+00  0.00000000e+00]
 [ 6.12323400e-17  1.00000000e+00  0.00000000e+00]
 [ 6.12323400e-17  1.00000000e+00  0.00000000e+00]
 [ 2.61799388e-01  1.00000000e+00  0.00000000e+00]
 [ 5.21986659e-01  8.92226904e-01  0.00000000e+00]
 [ 7.07106781e-01  7.07106781e-01  0.00000000e+00]
 [ 7.07106781e-01  7.07106781e-01  0.00000000e+00]
 [ 8.92226904e-01  5.21986659e-01  0.00000000e+00]
 [ 1.00000000e+00  2.61799388e-01  0.00000000e+00]
 [ 1.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 1.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 6.66666667e-01  0.00000000e+00  0.00000000e+00]
 [ 3.33333333e-01  0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00]]

我们可以看到很多第一个控制点都是零向量,我们必须分析扇区源代码来解决这个问题,我建议这样做:

class Circ(Scene):
    def construct(self):
        shape = Sector(
                       color=GOLD_B,
                       fill_color=GOLD_B,
                       fill_opacity=1,
                       stroke_width=4,
                       stroke_color=TEAL,
                       angle=360*DEGREES
        )
        shape.points = shape.points[32:-1] # <- because there are 33 zero vectors at the beginning and 1 at the end
        self.play(
            ShowCreation(
                shape,
                run_time=4,
                rate_func=lambda t: linear(1-t)
            )
        )
        self.wait()

显然,零的数量可能会根据Sector我们使用的 mobject 而变化,因此您必须找到一种方法来过滤开头那些不必要的零向量,也许这可以在 Sector 类的定义中轻松纠正.

于 2020-08-22T01:01:28.633 回答