| name | motion-graphics |
| version | 1.0.0 |
| description | Kinetic typography, logo animations, and stylized motion design skill.
**Triggers when:**
- User wants text animations or kinetic typography
- Request involves logo reveals or title sequences
- Content focuses on visual impact over education
- User mentions "title", "intro", "logo", "text animation", "kinetic"
**Capabilities:**
- Kinetic typography with dynamic text effects
- Logo reveals and brand animations
- Particle effects and visual flourishes
- Modern motion design patterns
- Attention-grabbing title sequences
|
| author | manim-video-generator |
| license | MIT |
Motion Graphics Skill
The Motion Graphics skill creates visually striking animations focused on aesthetic impact, perfect for titles, intros, and attention-grabbing content.
Design Principles
The 4 S's of Motion Graphics
- Style: Consistent visual language throughout
- Surprise: Unexpected movements that delight
- Smoothness: Fluid transitions and easing
- Simplicity: Clean design, no visual clutter
Motion Design Fundamentals
- Anticipation: Small movement before main action
- Follow-through: Elements continue after stopping
- Overshoot: Go past, then settle into place
- Squash & Stretch: Emphasize weight and impact
Rules
Creating impactful text animations that convey emotion.
Professional easing curves and timing patterns.
Directing attention through size, color, and motion.
Maintaining consistent style across animations.
Templates
Kinetic Typography - Word by Word
from manim import *
class KineticTypography(Scene):
def construct(self):
self.camera.background_color = "#1a1a2e"
words = ["The", "Future", "Is", "NOW"]
colors = [WHITE, BLUE, WHITE, YELLOW]
for word, color in zip(words, colors):
text = Text(word, font_size=96, color=color, weight=BOLD)
text.scale(0)
self.add(text)
self.play(
text.animate.scale(1),
rate_func=rate_functions.ease_out_back,
run_time=0.4
)
self.wait(0.3)
self.play(
text.animate.shift(UP * 2).set_opacity(0),
rate_func=rate_functions.ease_in_cubic,
run_time=0.3
)
self.remove(text)
final = Text("THE FUTURE IS NOW", font_size=48, color=GOLD)
self.play(Write(final), run_time=1)
self.play(Indicate(final, scale_factor=1.1, color=WHITE))
Logo Reveal - Particle Assemble
from manim import *
import random
class LogoReveal(Scene):
def construct(self):
self.camera.background_color = "#0a0a0a"
logo = Text("BRAND", font_size=120, color=WHITE, weight=BOLD)
particles = VGroup()
for _ in range(100):
dot = Dot(
point=[random.uniform(-7, 7), random.uniform(-4, 4), 0],
radius=0.05,
color=random_color()
)
particles.add(dot)
self.add(particles)
self.play(
*[Rotating(p, radians=PI * 2, about_point=ORIGIN)
for p in particles],
run_time=1.5,
rate_func=rate_functions.ease_in_out_sine
)
self.play(
FadeOut(particles),
FadeIn(logo, scale=0.5),
run_time=0.8
)
glow = logo.copy().set_color(BLUE).set_opacity(0.5)
self.play(
glow.animate.scale(1.2).set_opacity(0),
run_time=0.5
)
self.remove(glow)
self.wait()
Title Sequence - Slide & Stack
from manim import *
class TitleSequence(Scene):
def construct(self):
self.camera.background_color = "#16213e"
title = Text("EPISODE ONE", font_size=72, color=WHITE)
subtitle = Text("The Beginning", font_size=36, color=BLUE_C)
title.shift(LEFT * 10)
subtitle.shift(RIGHT * 10)
self.add(title, subtitle)
self.play(
title.animate.move_to(UP * 0.5),
subtitle.animate.move_to(DOWN * 0.5),
run_time=0.8,
rate_func=rate_functions.ease_out_cubic
)
line_left = Line(LEFT * 3, LEFT * 0.5, color=GOLD, stroke_width=2)
line_right = Line(RIGHT * 0.5, RIGHT * 3, color=GOLD, stroke_width=2)
lines = VGroup(line_left, line_right).next_to(title, UP, buff=0.3)
self.play(
Create(line_left),
Create(line_right),
run_time=0.5
)
self.wait(2)
self.play(
FadeOut(VGroup(title, subtitle, lines), shift=UP),
run_time=0.6
)
Text Glitch Effect
from manim import *
class GlitchText(Scene):
def construct(self):
self.camera.background_color = "#000000"
text = Text("GLITCH", font_size=96, color=WHITE, weight=BOLD)
red_copy = text.copy().set_color(RED).shift(LEFT * 0.05 + UP * 0.02)
blue_copy = text.copy().set_color(BLUE).shift(RIGHT * 0.05 + DOWN * 0.02)
self.add(red_copy, blue_copy, text)
for _ in range(5):
self.play(
red_copy.animate.shift(RIGHT * 0.1),
blue_copy.animate.shift(LEFT * 0.1),
run_time=0.05
)
self.play(
red_copy.animate.shift(LEFT * 0.1),
blue_copy.animate.shift(RIGHT * 0.1),
run_time=0.05
)
self.play(
red_copy.animate.move_to(text.get_center()),
blue_copy.animate.move_to(text.get_center()),
run_time=0.2
)
self.remove(red_copy, blue_copy)
self.wait()
Counter Animation
from manim import *
class CounterAnimation(Scene):
def construct(self):
self.camera.background_color = "#1a1a2e"
counter = ValueTracker(0)
number = always_redraw(lambda: Text(
f"{int(counter.get_value()):,}",
font_size=120,
color=WHITE,
weight=BOLD
))
label = Text("SUBSCRIBERS", font_size=32, color=BLUE_C)
label.next_to(number, DOWN, buff=0.5)
self.add(number, label)
self.play(
counter.animate.set_value(1000000),
run_time=3,
rate_func=rate_functions.ease_out_cubic
)
self.play(
Indicate(number, scale_factor=1.2, color=GOLD),
run_time=0.5
)
Easing Functions Reference
| Effect | Rate Function | Use Case |
|---|
| Smooth | smooth | General purpose |
| Dramatic entrance | ease_out_back | Pop-in effects |
| Gentle exit | ease_in_cubic | Fade outs |
| Bouncy | ease_out_bounce | Playful motion |
| Snappy | ease_out_expo | Quick, impactful |
| Natural | ease_in_out_sine | Organic movement |
| Linear | linear | Constant speed |
Color Palettes
Neon Cyberpunk
NEON_PINK = "#ff00ff"
NEON_BLUE = "#00ffff"
NEON_GREEN = "#00ff00"
DARK_BG = "#0a0a0a"
Corporate Professional
CORP_BLUE = "#0066cc"
CORP_GRAY = "#333333"
CORP_WHITE = "#ffffff"
CORP_ACCENT = "#ff6600"
Minimal Modern
MIN_BLACK = "#1a1a1a"
MIN_WHITE = "#f5f5f5"
MIN_GRAY = "#888888"
MIN_ACCENT = "#3366ff"
Best Practices
- Less is more - Restraint makes key moments impactful
- Timing is everything - Wrong timing kills good animation
- Consistency builds trust - Same style throughout
- Sound design matters - Design with audio in mind
- Test on target platform - Different devices, different experience