--- 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 ### [rules/kinetic-typography.md](rules/kinetic-typography.md) Creating impactful text animations that convey emotion. ### [rules/timing-and-easing.md](rules/timing-and-easing.md) Professional easing curves and timing patterns. ### [rules/visual-hierarchy.md](rules/visual-hierarchy.md) Directing attention through size, color, and motion. ### [rules/brand-consistency.md](rules/brand-consistency.md) Maintaining consistent style across animations. ## Templates ### Kinetic Typography - Word by Word ```python 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) # Dramatic entrance 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) # Exit with style 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 combination 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 ```python from manim import * import random class LogoReveal(Scene): def construct(self): self.camera.background_color = "#0a0a0a" # Create logo text logo = Text("BRAND", font_size=120, color=WHITE, weight=BOLD) # Create particles that will form the logo 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) # Swirl 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 ) # Converge to logo position self.play( FadeOut(particles), FadeIn(logo, scale=0.5), run_time=0.8 ) # Glow effect 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 ```python from manim import * class TitleSequence(Scene): def construct(self): self.camera.background_color = "#16213e" # Main title title = Text("EPISODE ONE", font_size=72, color=WHITE) subtitle = Text("The Beginning", font_size=36, color=BLUE_C) # Slide in from sides 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 ) # Add decorative lines 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 ) # Fade all together self.wait(2) self.play( FadeOut(VGroup(title, subtitle, lines), shift=UP), run_time=0.6 ) ``` ### Text Glitch Effect ```python from manim import * class GlitchText(Scene): def construct(self): self.camera.background_color = "#000000" text = Text("GLITCH", font_size=96, color=WHITE, weight=BOLD) # Create glitch copies 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) # Glitch animation for _ in range(5): # Random offset 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 ) # Settle 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 ```python from manim import * class CounterAnimation(Scene): def construct(self): self.camera.background_color = "#1a1a2e" # Value tracker counter = ValueTracker(0) # Dynamic text 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) # Animate count self.play( counter.animate.set_value(1000000), run_time=3, rate_func=rate_functions.ease_out_cubic ) # Celebration effect 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 ```python NEON_PINK = "#ff00ff" NEON_BLUE = "#00ffff" NEON_GREEN = "#00ff00" DARK_BG = "#0a0a0a" ``` ### Corporate Professional ```python CORP_BLUE = "#0066cc" CORP_GRAY = "#333333" CORP_WHITE = "#ffffff" CORP_ACCENT = "#ff6600" ``` ### Minimal Modern ```python MIN_BLACK = "#1a1a1a" MIN_WHITE = "#f5f5f5" MIN_GRAY = "#888888" MIN_ACCENT = "#3366ff" ``` ## Best Practices 1. **Less is more** - Restraint makes key moments impactful 2. **Timing is everything** - Wrong timing kills good animation 3. **Consistency builds trust** - Same style throughout 4. **Sound design matters** - Design with audio in mind 5. **Test on target platform** - Different devices, different experience