3b1b-manim/old_projects/name_animation.py
2019-05-02 20:36:14 -07:00

108 lines
3.3 KiB
Python

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from manimlib.imports import *
NAME_WITH_SPACES = "Prime Meridian"
DIAMETER = 3.0
RADIUS = DIAMETER / 2
LETTER_SCALE = 1
class NameAnimationScene(Scene):
CONFIG = {
"animated_name": "Prime Meridian"
}
def construct(self):
name = self.animated_name
letter_mobs = TextMobject(name)
nb_letters = len(letter_mobs)
randy = PiCreature()
randy.move_to(ORIGIN).set_height(0.5 * DIAMETER)
randy.set_color(BLUE_E)
randy.look_at(UP + RIGHT)
self.add(randy)
dtheta = TAU / nb_letters
angles = np.arange(TAU / 4, -3 * TAU / 4, -dtheta)
name_mob = VGroup()
for (letter_mob, angle) in zip(letter_mobs, angles):
letter_mob.scale(LETTER_SCALE)
pos = RADIUS * np.cos(angle) * RIGHT + RADIUS * np.sin(angle) * UP
letter_mob.move_to(pos)
name_mob.add(letter_mob)
pos2 = RADIUS * np.cos(angles[2]) * RIGHT + \
RADIUS * np.sin(angles[2]) * UP
times_n_label = VGroup(
TexMobject("\\times"),
Integer(1)
)
times_n_label.arrange(RIGHT)
times_n_label.shift(FRAME_WIDTH * RIGHT / 4)
times_n_label.to_edge(UP)
self.play(
LaggedStartMap(FadeIn, name_mob, run_time=3),
ApplyMethod(randy.change, "pondering", pos2, run_time=1),
FadeIn(times_n_label)
)
for n in range(2, nb_letters + 2):
group = []
for (j, letter_mob) in enumerate(name_mob.submobjects):
new_angle = TAU / 4 - n * j * dtheta
new_pos = RADIUS * np.cos(new_angle) * \
RIGHT + RADIUS * np.sin(new_angle) * UP
letter_mob.target = letter_mob.copy().move_to(new_pos)
anim = MoveToTarget(letter_mob, path_arc=- j * dtheta)
group.append(anim)
new_n = Integer(n)
new_n.move_to(times_n_label[1])
self.play(
AnimationGroup(*group, run_time=3),
UpdateFromFunc(randy, lambda r: r.look_at(name_mob.submobjects[2])),
FadeOut(times_n_label[1]),
FadeIn(new_n)
)
times_n_label.submobjects[1] = new_n
self.wait(0.5)
thank_you = TextMobject("Thank You!").next_to(randy, DOWN)
new_randy = randy.copy()
new_randy.change("hooray")
new_randy.set_color(BLUE_E)
new_randy.look_at(ORIGIN)
self.play(
ReplacementTransform(name_mob, VGroup(*thank_you)),
Transform(randy, new_randy)
)
self.play(Blink(randy))
def __str__(self):
return self.animated_name.replace(" ", "") + "Animation"
names = []
if __name__ == "__main__":
for name in names:
try:
NameAnimationScene(
frame_duration=PRODUCTION_QUALITY_FRAME_DURATION,
camera_config=PRODUCTION_QUALITY_CAMERA_CONFIG,
animated_name=name,
write_to_movie=True,
output_directory=os.path.join(
VIDEO_DIR,
"active_projects",
"name_animations",
),
)
except Exception as e:
print("Could not animate %s: %s" % (name, e))