Chaîne de production vidéo Manim
Standard créatif
C'est du cinéma éducatif. Chaque image enseigne. Chaque animation révèle une structure.
Avant d'écrire la moindre ligne de code, articulez l'arc narratif. Quelle idée fausse cette animation corrige-t-elle ? Quel est le "déclic" ? Quelle histoire visuelle emmène le spectateur de la confusion à la compréhension ? Le prompt de l'utilisateur est un point de départ — interprétez-le avec ambition pédagogique.
La géométrie avant l'algèbre. Montrez d'abord la forme, l'équation ensuite. La mémoire visuelle encode plus vite que la mémoire symbolique. Quand le spectateur voit le motif géométrique avant la formule, l'équation semble méritée.
L'excellence au premier rendu est non négociable. Le résultat doit être visuellement clair et esthétiquement cohérent sans cycles de révision. Si quelque chose semble encombré, mal rythmé, ou comme des "diapos générées par IA", c'est faux.
La superposition d'opacité dirige l'attention. Ne montrez jamais tout à pleine luminosité. Éléments principaux à 1.0, éléments contextuels à 0.4, éléments de structure (axes, grilles) à 0.15. Le cerveau traite la saillance visuelle par couches.
Du temps pour respirer. Chaque animation a besoin d'un self.wait() après elle. Le spectateur a besoin de temps pour absorber ce qui vient d'apparaître. Ne précipitez jamais une animation vers la suivante. Une pause de deux secondes après une révélation clé n'est jamais perdue.
Langage visuel cohérent. Toutes les scènes partagent une palette de couleurs, un dimensionnement typographique cohérent, des vitesses d'animation assorties. Une vidéo techniquement correcte où chaque scène utilise des couleurs aléatoires différentes est un échec esthétique.
Prérequis
Exécutez scripts/setup.sh pour vérifier toutes les dépendances. Nécessite : Python 3.10+, Manim Community Edition v0.20+ (pip install manim), LaTeX (texlive-full sur Linux, mactex sur macOS), et ffmpeg. La documentation de référence a été testée avec Manim CE v0.20.1.
Modes
| Mode | Entrée | Sortie | Référence |
|---|---|---|---|
| Explication de concept | Sujet/concept | Explication animée avec intuition géométrique | references/scene-planning.md |
| Dérivation d'équation | Expressions mathématiques | Preuve animée étape par étape | references/equations.md |
| Visualisation d'algorithme | Description d'algorithme | Exécution pas à pas avec structures de données | references/graphs-and-data.md |
| Histoire de données | Données/métriques | Graphiques animés, comparaisons, compteurs | references/graphs-and-data.md |
| Diagramme d'architecture | Description système | Composants se construisant avec connexions | references/mobjects.md |
| Explication d'article | Article de recherche | Résultats et méthodes clés animés | references/scene-planning.md |
| Visualisation 3D | Concept 3D | Surfaces rotatives, courbes paramétriques, géométrie spatiale | references/camera-and-3d.md |
Stack
Un seul script Python par projet. Pas de navigateur, pas de Node.js, pas de GPU requis.
| Couche | Outil | Objectif |
|---|---|---|
| Cœur | Manim Community Edition | Rendu de scène, moteur d'animation |
| Mathématiques | LaTeX (texlive/MiKTeX) | Rendu d'équations via MathTex |
| Vidéo I/O | ffmpeg | Assemblage de scènes, conversion de format, multiplexage audio |
| TTS | ElevenLabs / Qwen3-TTS (optionnel) | Voix off narrative |
Pipeline
PLANIFIER --> CODER --> RENDU --> ASSEMBLER --> AUDIO (optionnel) --> RÉVISER
- PLANIFIER — Écrivez
plan.mdavec l'arc narratif, la liste des scènes, les éléments visuels, la palette de couleurs, le script de voix off - CODER — Écrivez
script.pyavec une classe par scène, chacune rendable indépendamment - RENDU —
manim -ql script.py Scene1 Scene2 ...pour le brouillon,-qhpour la production - ASSEMBLER — Concaténation ffmpeg des clips de scène dans
final.mp4 - AUDIO (optionnel) — Ajoutez une voix off et/ou une musique de fond via ffmpeg. Voir
references/rendering.md - RÉVISER — Rendu d'images fixes de prévisualisation, vérification par rapport au plan, ajustement
Structure du projet
nom-du-projet/
plan.md # Arc narratif, découpage des scènes
script.py # Toutes les scènes dans un fichier
concat.txt # Liste des scènes pour ffmpeg
final.mp4 # Résultat assemblé
media/ # Généré automatiquement par Manim
videos/script/480p15/
Direction créative
Palettes de couleurs
| Palette | Arrière-plan | Primaire | Secondaire | Accent | Cas d'usage |
|---|---|---|---|---|---|
| Classique 3B1B | #1C1C1C | #58C4DD (BLEU) | #83C167 (VERT) | #FFFF00 (JAUNE) | Maths/Info général |
| Académique chaleureux | #2D2B55 | #FF6B6B | #FFD93D | #6BCB77 | Accessible |
| Techno néon | #0A0A0A | #00F5FF | #FF00FF | #39FF14 | Systèmes, architecture |
| Monochrome | #1A1A2E | #EAEAEA | #888888 | #FFFFFF | Minimaliste |
Vitesse d'animation
| Contexte | run_time | self.wait() après |
|---|---|---|
| Apparition titre/intro | 1.5s | 1.0s |
| Révélation équation clé | 2.0s | 2.0s |
| Transformation/morphose | 1.5s | 1.5s |
| Étiquette de support | 0.8s | 0.5s |
| Nettoyage FadeOut | 0.5s | 0.3s |
| Révélation "déclic" | 2.5s | 3.0s |
Échelle typographique
| Rôle | Taille de police | Utilisation |
|---|---|---|
| Titre | 48 | Titres de scène, texte d'ouverture |
| En-tête | 36 | En-têtes de section dans une scène |
| Corps | 30 | Texte explicatif |
| Étiquette | 24 | Annotations, étiquettes d'axes |
| Légende | 20 | Sous-titres, petits caractères |
Polices
Utilisez des polices monospaces pour tout le texte. Le rendu Pango de Manim produit un crénage cassé avec les polices proportionnelles, quelle que soit la taille. Voir references/visual-design.md pour les recommandations complètes.
MONO = "Menlo" # définir une fois en haut du fichier
Text("Série de Fourier", font_size=48, font=MONO, weight=BOLD) # titres
Text("n=1 : sin(x)", font_size=20, font=MONO) # étiquettes
MathTex(r"\nabla L") # math (utilise LaTeX)
font_size=18 minimum pour la lisibilité.
Variation par scène
N'utilisez jamais une configuration identique pour toutes les scènes. Pour chaque scène :
- Couleur dominante différente de la palette
- Disposition différente — ne centrez pas toujours tout
- Animation d'entrée différente — variez entre Write, FadeIn, GrowFromCenter, Create
- Poids visuel différent — certaines scènes denses, d'autres épurées
Flux de travail
Étape 1 : Planification (plan.md)
Avant tout code, écrivez plan.md. Voir references/scene-planning.md pour le modèle complet.
Étape 2 : Codage (script.py)
Une classe par scène. Chaque scène est rendable indépendamment.
from manim import *
BG = "#1C1C1C"
PRIMARY = "#58C4DD"
SECONDARY = "#83C167"
ACCENT = "#FFFF00"
MONO = "Menlo"
class Scene1_Introduction(Scene):
def construct(self):
self.camera.background_color = BG
title = Text("Pourquoi ça marche ?", font_size=48, color=PRIMARY, weight=BOLD, font=MONO)
self.add_subcaption("Pourquoi ça marche ?", duration=2)
self.play(Write(title), run_time=1.5)
self.wait(1.0)
self.play(FadeOut(title), run_time=0.5)
Motifs clés :
- Sous-titres sur chaque animation :
self.add_subcaption("texte", duration=N)ousubcaption="texte"dansself.play() - Constantes de couleur partagées en haut du fichier pour la cohérence entre scènes
self.camera.background_colordéfini dans chaque scène- Sorties propres — FadeOut de tous les mobjects en fin de scène :
self.play(FadeOut(Group(*self.mobjects)))
Étape 3 : Rendu
manim -ql script.py Scene1_Introduction Scene2_CoreConcept # brouillon
manim -qh script.py Scene1_Introduction Scene2_CoreConcept # production
Étape 4 : Assemblage
cat > concat.txt << 'EOF'
file 'media/videos/script/480p15/Scene1_Introduction.mp4'
file 'media/videos/script/480p15/Scene2_CoreConcept.mp4'
EOF
ffmpeg -y -f concat -safe 0 -i concat.txt -c copy final.mp4
Étape 5 : Révision
manim -ql --format=png -s script.py Scene2_CoreConcept # image de prévisualisation
Notes d'implémentation critiques
Chaînes brutes pour LaTeX
# FAUX : MathTex("\frac{1}{2}")
# JUSTE :
MathTex(r"\frac{1}{2}")
buff >= 0.5 pour le texte en bordure
label.to_edge(DOWN, buff=0.5) # jamais < 0.5
FadeOut avant de remplacer du texte
self.play(ReplacementTransform(note1, note2)) # pas Write(note2) par-dessus
N'animez jamais des mobjects non ajoutés
self.play(Create(circle)) # doit d'abord être ajouté
self.play(circle.animate.set_color(RED)) # puis animé
Objectifs de performance
| Qualité | Résolution | FPS | Vitesse |
|---|---|---|---|
-ql (brouillon) | 854×480 | 15 | 5-15s/scène |
-qm (moyen) | 1280×720 | 30 | 15-60s/scène |
-qh (production) | 1920×1080 | 60 | 30-120s/scène |
Itérez toujours en -ql. Ne rendez en -qh que pour le résultat final.
Références
| Fichier | Contenu |
|---|---|
references/animations.md | Animations de base, fonctions de taux, composition, syntaxe .animate, motifs de rythme |
references/mobjects.md | Texte, formes, VGroup/Group, positionnement, style, mobjects personnalisés |
references/visual-design.md | 12 principes de conception, superposition d'opacité, modèles de disposition, palettes de couleurs |
references/equations.md | LaTeX dans Manim, TransformMatchingTex, motifs de dérivation |
references/graphs-and-data.md | Axes, tracé, BarChart, données animées, visualisation d'algorithme |
references/camera-and-3d.md | MovingCameraScene, ThreeDScene, surfaces 3D, contrôle de la caméra |
references/scene-planning.md | Arcs narratifs, modèles de disposition, transitions de scène, modèle de planification |
references/rendering.md | Référence CLI, préréglages de qualité, ffmpeg, flux de voix off, export GIF |
references/troubleshooting.md | Erreurs LaTeX, erreurs d'animation, erreurs courantes, débogage |
references/animation-design-thinking.md | Quand animer vs montrer statique, décomposition, rythme, synchronisation de la narration |
references/updaters-and-trackers.md | ValueTracker, add_updater, always_redraw, mise à jour temporelle, motifs |
references/paper-explainer.md | Transformer des articles de recherche en animations — flux de travail, modèles, motifs par domaine |
references/decorations.md | SurroundingRectangle, Brace, flèches, DashedLine, Angle, cycle de vie des annotations |
references/production-quality.md | Listes de contrôle avant code, avant rendu, après rendu, disposition spatiale, couleur, tempo |
Divergence créative (à utiliser uniquement quand l'utilisateur demande un résultat expérimental/créatif/unique)
Si l'utilisateur demande une approche explicative créative, expérimentale ou non conventionnelle, sélectionnez une stratégie et raisonnez-la AVANT de concevoir l'animation.
- SCAMPER — quand l'utilisateur souhaite une nouvelle interprétation d'une explication standard
- Inversion d'hypothèses — quand l'utilisateur veut remettre en question la façon dont un sujet est généralement enseigné
Transformation SCAMPER
Prenez une visualisation mathématique/technique standard et transformez-la :
- Substituer : remplacez la métaphore visuelle standard (droite numérique → chemin sinueux, matrice → grille urbaine)
- Combiner : fusionnez deux approches explicatives (algébrique + géométrique simultanément)
- Inverser : dérivez à rebours — partez du résultat et déconstruisez jusqu'aux axiomes
- Modifier : exagérez un paramètre pour montrer pourquoi il compte (taux d'apprentissage ×10, taille d'échantillon ×1000)
- Éliminer : supprimez toute notation — expliquez uniquement par l'animation et les relations spatiales
Inversion d'hypothèses
- Listez ce qui est "standard" dans la visualisation de ce sujet (gauche à droite, 2D, étapes discrètes, notation formelle)
- Choisissez l'hypothèse la plus fondamentale
- Inversez-la (dérivation droite-à-gauche, plongement 3D d'un concept 2D, morphose continue au lieu d'étapes, zéro notation)
- Explorez ce que l'inversion révèle que l'approche standard cache