Wie 3Blue1Brown Animationen erstellt [Video]
(youtube.com)- Die Visualisierungen von 3Blue1Brown werden mit der von Grant Sanderson entwickelten Python-Bibliothek Manim als Code umgesetzt; das Video folgt gemeinsam mit Ben Sparks dem tatsächlichen Produktionsablauf
- Manim hat sich in Grants persönliche Produktionsumgebung und die Manim Community aufgespalten, bei der Dokumentation, Tests und Issue-Bearbeitung stärker ausgebaut sind; für Einsteiger ist meist die Community-Version geeignet
- Die Arbeitsweise ähnelt einem Setup, bei dem Sublime Text mit einem Python-Terminal verbunden ist, Codefragmente sofort ausgeführt werden und per checkpoint paste Zwischenstände gecacht werden, um iterativ zu experimentieren
- Die Demo berechnet den Lorenz attractor mit SciPy und kombiniert anschließend Kurven, Punkte, Updater, eine 3D-Kamera und Nachleuchteffekte, um zu zeigen, wie nahe Anfangsbedingungen auseinanderlaufen
- Die finale Szene wird vorab ausgeführt, um Fehler und Länge zu prüfen, dann als MP4 gerendert und anschließend in ein Schnittprogramm für die Produktion des YouTube-Videos übernommen
Ausgangspunkt von Manim und zwei Versionszweige
- Das zentrale Werkzeug für die Animationen von 3Blue1Brown ist die von Grant Sanderson selbst entwickelte Python-Bibliothek Manim
- Manim baut alle Szenen programmatisch auf und hat sich zu einem maßgeschneiderten Tool für die Produktionsweise von 3Blue1Brown entwickelt
- Gegen Ende seines Bachelorstudiums schrieb Grant Python-Code, um mathematische Funktionen als Transformationen besser zu visualisieren; dieser Code entstand zusammen mit dem ersten Video des Kanals
- Mit der wachsenden Zahl an Videos wurde das Tool verbessert, und die verbesserten Werkzeuge ermöglichten wiederum komplexere Videos
- Die visuellen Effekte des jüngsten Hologramm-Videos wären vor 2 bis 3 Jahren deutlich schwieriger gewesen; dank jahrelanger Workflow-Verbesserungen ist die Produktion inzwischen einfacher geworden
Manim Community und Grants persönliche Version
- Grant hat den Code, den er in Videos verwendet, sowie Manim selbst auf GitHub veröffentlicht
- Da Videoproduktion und Open-Source-Pflege parallel liefen, konnten Issues und Pull Requests jedoch nicht ausreichend betreut werden
- Die Community forkete das Repository, um ein robusteres Werkzeug zu schaffen; diese Version ist die Manim Community
- Issues und Pull Requests werden aktiver bearbeitet
- Tests und Dokumentation sind besser ausgebaut
- Für Einsteiger wird sie in der Regel empfohlen
- In der Videodemo wird die Version verwendet, die Grant selbst nutzt
- Sie wurde in den letzten Jahren stärker auf Interaktivität und hohe Geschwindigkeit hin verbessert
- Für Nutzer, denen Dokumentation und Tests wichtig sind, ist die Community-Version besser geeignet
Code schreiben und sofort überprüfen
- Jede Manim-Szene wird als Python-class geschrieben; der zu rendernde Code steht in der Methode
construct - Objekte wie Kreise, Rechtecke und Text werden zur Szene hinzugefügt, und über die Methode
playwerden Animationen wieWriteoderTransformausgeführt - Die meisten Objekte liegen standardmäßig in der Bildschirmmitte und werden mit Operationen wie
to_edgeodershiftpositioniert - Grants Arbeitsumgebung kombiniert Sublime Text mit einem Python-Terminal
- Kopiert man Codezeilen und führt sie im Terminal aus, werden sie direkt in der aktuellen Szene sichtbar
- Ein Sublime-Shortcut automatisiert das Kopieren und Ausführen des ausgewählten Codes
- Da das Terminal mit der aktuellen Szene verbunden ist, lassen sich Änderungen sofort überprüfen
- Bei langen Szenen ist es wichtig, nicht jedes Mal den gesamten Code neu auszuführen, sondern nur Zwischenabschnitte wiederholt zu testen
- Das Hologramm-Video war ein Beispiel für langen Python-Code, der ein 4 Minuten und 30 Sekunden langes MP4 erzeugte
- Bei langen Szenen werden viele Kontextinformationen und lokale Variablen geteilt, weshalb es nützlich war, alles in einer Datei zu halten
checkpoint pastecached den Szenenzustand an einer bestimmten Kommentarposition, kehrt zu diesem Zustand zurück und führt dann den ausgewählten Code aus- Diese Arbeitsweise ähnelt einem hybriden Workflow zwischen reiner Textdatei und Jupyter notebook
Grundgefühl von Manim-Animationen
- Eine wichtige Philosophie von Manim ist, dass „alles in alles transformiert werden kann“
- Zum Beispiel kann man eine Szene erstellen, in der der erste Buchstabe
Hdes Texteshello worldin einen Kreis transformiert wird- Der Kreis muss nicht direkt zur Szene hinzugefügt werden, sondern kann nur als Transformationsziel definiert sein
- Text ist eine Gruppe von Zeichen, sodass einzelne Buchstaben herausgenommen und manipuliert werden können
Transformverwendet standardmäßig eine weiche rate function- Der Standardwert ist
smooth, was wie eine weiche Bewegung auf Basis einer kubischen Bézier-Kurve wirkt - Mit
linearfühlen sich Anfang und Ende härter an - Wenn der mathematische Zeitverlauf unverändert gezeigt werden soll, ist
linearnötig
- Der Standardwert ist
- Solche Feinjustierungen machen den Unterschied zwischen einer bloß „bewegten Szene“ und einer „gut aussehenden Szene“ aus
- Auch aus 3Blue1Brown-Videos bekannte Animationen wie
Writelassen sich als eingebaute Manim-Funktion aufrufen
Lorenz-attractor-Demo
- Das zentrale Beispiel der Demo ist der Lorenz attractor
- Er entsteht aus einem dreidimensionalen Differentialgleichungssystem
- Eine deterministische Regel legt fest, wie sich ein Punkt im 3D-Raum im Lauf der Zeit verändert
- Verändert man mehrere Anfangsbedingungen, entstehen interessante visuelle Ergebnisse
- Beim Erstellen des mathematischen Berechnungsteils bat Grant ChatGPT darum, eine Python-Funktion zu schreiben
- Verwendet wurden SciPys
integrateund eine Funktion zum Lösen von Anfangswertproblemen - Der erzeugte Code war auf Matplotlib-Rendering ausgelegt und wurde anschließend für Manim angepasst
- Verwendet wurden SciPys
- Der Zustand der Lorenz-Gleichungen hat die Koordinaten
x,y,zund wird als Funktion dargestellt, die zu jedem Zeitpunkt die Ableitungen berechnet - Das Ergebnis der numerischen Lösung besteht aus Zeitwerten sowie
x-,y- undz-Werten; Grant legt darum einen wrapper an, um leichter damit zu arbeiten- Die SciPy-seitige Darstellung behandelt
ywie eine Ausgabe, was etwas verwirrend sein kann - Zustandsarray und transponierte Form werden an die für ihn bequemere Arbeitsweise angepasst
- Die SciPy-seitige Darstellung behandelt
- Setzt man die Anfangsbedingungen auf
(0, 0, 0), bleiben alle Werte 0 und sind daher ungeeignet; nachdem eine Koordinate auf 10 geändert wird, entstehen interessante Punkte - In Manim wird
set_points_as_cornersverwendet, um die berechneten Punkte in eine Kurve umzuwandeln - Um das Koordinatensystem der Achsen in das Manim-Koordinatensystem zu überführen, wird
c2pals Kurzform voncoords_to_pointverwendet - Die
*-Syntax von Python wird genutzt, um ein Iterable als Funktionsargumente zu entpacken- Im Beispiel werden die Listen der
x-,y- undz-Koordinaten getrennt und an die Funktion übergeben
- Im Beispiel werden die Listen der
Eine Szene, in der nahe Anfangsbedingungen auseinanderlaufen
- Der Kern der Lorenz-attractor-Visualisierung ist, dass sehr nahe beieinanderliegende Anfangsbedingungen anfangs ähnlich verlaufen, später aber auseinanderdriften
- Grant erstellt eine Liste von Anfangsbedingungen und setzt die
z-Koordinate jeweils um ein kleinesepsilonanders- Zunächst beginnt er mit 2 Bedingungen
- Später erhöht er sie auf 10 Bedingungen
- Um mehrere Kurven aufzunehmen, wird
VGroupverwendet- Gibt man an, dass es sich um eine Gruppe vektorisierter Objekte handelt, kann das Rendering schneller werden
- Am Endpunkt jeder Kurve wird ein glow dot angebracht
GlowDotist ein Objekt, das erstellt wurde, um einen bewegten Punkt visuell ansprechend darzustellen- Jeder Punkt bekommt einen Updater, der ihn in jedem Frame an das Kurvenende verschiebt
zipwird verwendet, um einander entsprechende Listen wie Punkte und Kurven oder Zustände und Farben parallel zu durchlaufen- Wenn zwei Listen unterschiedlich lang sind, stoppt es am Ende der kürzeren Liste
- Mit
color_gradientwird eine Farbanzahl erzeugt, die der Zahl der Zustände entspricht, sodass die Längen zusammenpassen
- Wenn beim Zeichnen der Kurven mit
ShowCreationdas Standard-Smoothing verwendet wird, kann der tatsächliche Zeitverlauf verfälscht werden; für Teile, die die Dynamik unverändert zeigen, wird daher eine linear rate function verwendet - Nahe Anfangsbedingungen bewegen sich anfangs fast gemeinsam, breiten sich nach einiger Zeit aber so aus, als befänden sie sich an völlig unterschiedlichen Positionen
- Der Lorenz attractor wird nicht als einfacher Punkt oder Zyklus behandelt, sondern als strange attractor, der in eine bestimmte Form gezogen wird, dessen genaue Position aber empfindlich von den Anfangsbedingungen abhängt
Workaround-Code im interaktiven Modus und Szeneneffekte
- In der Demo taucht „verfluchter“ Code wie
globals().update(locals())auf - Dieser Code ist ein temporärer Workaround für das Problem, dass Funktionen in Manims IPython-embed-Umgebung Variablen aus dem äußeren Scope nicht sehen können
- In normalen Python-Skripten funktioniert derselbe Code korrekt
- In Manims eingebetteter interaktiver Umgebung kann ein
NameErrorauftreten - Das Problem wird umgangen, indem lokale Variablen in das Dictionary der globalen Variablen geschrieben werden
- In echtem Bibliothekscode wäre diese Methode ungeeignet, in einer temporären interaktiven Session zur Szenenentwicklung ist das Risiko jedoch vergleichsweise gering
- Besser wäre es, die benötigten Variablen explizit als Funktionsargumente zu übergeben
- Um Kurven im Zeitverlauf verschwinden zu lassen, kann
FadeOutverwendet werden- Wenn
run_timevonplayan die evolution time angepasst wird, wird die Kurve über diese Zeit hinweg langsam transparent
- Wenn
- Der Effekt, hinter Punkten eine Spur zu hinterlassen, wird mit
TracingTailumgesetzt- Damit lässt sich ein Schweif erzeugen, der einem Punkt folgt
- Erhöht man
time_tracedvon 1 Sekunde auf 3 Sekunden, ist ein Schweif über einen längeren Zeitraum sichtbar - Versehen man alle 10 Punkte jeweils mit einem Schweif, wird deutlicher sichtbar, wie sich mehrere Trajektorien ausbreiten
3D-Kamera und Formelbehandlung
- Manim-Szenen können grundsätzlich 3D-Koordinaten haben, die meisten 3Blue1Brown-Szenen werden aus didaktischen Gründen jedoch wie eine 2D-Tafel aufgebaut
- Für den Lorenz attractor sind 3D-Darstellungen nötig, daher werden 3D-Achsen hinzugefügt
- In einer 3D-Ansicht sind langsame Kameradrehungen oder -bewegungen hilfreich, um Tiefenwirkung zu erhalten
- Grant verwendet einen Shortcut, der die aktuelle Kameraposition in die Zwischenablage speichert
- Mit
frame.animate.reorient(...)wird der Kameraframe an eine bestimmte Position animiert
- Formeln können als LaTeX-Objekte in die Szene eingefügt werden
- Mit MathPix lassen sich Gleichungen auf dem Bildschirm per OCR erfassen und als LaTeX oder SVG erhalten
- Um Formeln in einer 3D-Szene am Bildschirm zu fixieren, wird
fix_in_frameverwendet
- Bestimmte Variablen in LaTeX-Formeln können eingefärbt werden
- Im Beispiel werden
x,y,zjeweils mit unterschiedlichen Farben versehen - Die Möglichkeit, Text in mathematische Bestandteile zu zerlegen und diese hervorzuheben oder zu transformieren, ist für mathematische Erklärungen nützlich
- Im Beispiel werden
- Manim bietet auch spezielle Transformationen, die Strings einander zuordnen
- Terme wie
A^2undB^2wandern natürlich an die gleiche Stringposition in der nächsten Zeile - Stringbasiertes Matching kann auch Effekte wie Anagramm-Animationen erzeugen, bei denen Buchstaben an die jeweils passenden Positionen geschickt werden
- Terme wie
- Mit Animationen wie
flash aroundoderindicatekönnen bestimmte Zeichen oder Terme in einer Formel hervorgehoben werden
Rendering und tatsächlicher Produktionsablauf
- Wenn eine Szene zufriedenstellend ist, wird sie mit einem Manim-Befehl gerendert, der die Python-Datei und den Szenennamen angibt
pre-runist ein Schritt, bei dem die gesamte Animation geprüft wird, bevor sie tatsächlich verwendet wird- Dabei wird die Gesamtlänge abgeschätzt
- Es hilft, Fehler vorab zu finden, statt erst während eines Zwischenrenderings
Wist eine Option zum Schreiben in eine Datei, und Finder-bezogene Optionen dienen dazu, die Ergebnisdatei im macOS Finder anzuzeigen- Das Endergebnis wird als MP4-Datei gerendert
- Grant rendert normalerweise in 4K, weshalb es länger dauern kann
- Die gerenderte Datei wird anschließend in ein Schnittprogramm importiert und bearbeitet
- Die frühere Manim-Nutzung bestand vor allem darin, Szenen über die Kommandozeile zu rendern und das MP4 zu überprüfen
- Ungefähr zur Zeit der Umstellung auf eine OpenGL-Implementierung entstand ein Workflow auf Basis einer interaktiven Shell, bei dem Code hervorgehoben und das Ergebnis sofort betrachtet wird
- Grants konkreter Workflow hängt von Sublime-Text-Skripten und der Terminus-Erweiterung ab
- Ähnliche Abläufe lassen sich auch in anderen Texteditoren nachahmen
- Auch in Umgebungen der Visual-Studio-Familie lässt sich ein vergleichbarer Workflow bauen
- Bei der Suche nach Funktionen können Beispielszenen, der
animation-Ordner der Bibliothek und das GitHub-Repository3b1b/videosmit Code zu früheren Videos helfen - Grant bevorzugt eine einfachere Autovervollständigung gegenüber Copilot
- In Manim weiß er oft bereits, welches Verhalten er möchte
- Die Anfrage in Code auszudrücken fühlt sich für ihn natürlicher an als auf Englisch
1 Kommentare
Hacker-News-Kommentare
3B1B leistet wirklich Großartiges.
Mir persönlich haben seine YouTube-Videos enorm geholfen, und ich wünschte, Mathematik würde in der Schule oder im Ingenieurstudium auf diese Weise unterrichtet.
https://sinerider.com/ ist ebenfalls einen Blick wert.
Das ist ein Spiel von einem Freund, der Grant Sanderson gelegentlich bei seiner Arbeit an 3B1B hilft: ein großartiges Mathematik-Lernspiel, bei dem man wie bei LineRider Strecken baut, aber mit Formeln.
Sowohl 3B1B als auch SineRider haben mein intuitives Verständnis von Funktionskomposition mehr geprägt als alles andere.
Beeindruckend war die Szene, in der er in Echtzeit einen Bug in der Rendering-Engine entdeckt und sogar einen Workaround findet.
https://youtu.be/rbu7Zu5X1zI?feature=shared&t=693
Trotzdem beeindruckende Arbeit.
Dass er Position und Ursache kannte und live einen Workaround finden konnte, zeigt, dass er Zeit in die Verbesserung seiner eigenen Werkzeuge investiert – und zwar nicht nur gelegentlich, sondern aktiv.
Ich finde es nach wie vor beeindruckend.
Ich habe mich gefragt, wie die interaktive Python-REPL unten rechts funktioniert.
Edit: Es scheint ein komplett maßgeschneiderter Workflow zu sein: https://github.com/3b1b/videos?tab=readme-ov-file#workflow
Nachdem ich jahrelang nur seine Stimme gehört und sein Gesicht nicht gesehen hatte, war es lustig, sein Gesicht zu sehen – plötzlich fühlte es sich an, als wäre ich mitten im Uncanny Valley gelandet.
In ein paar neueren Videos agiert er wie Moderator, Interviewer und Erzähler.
Auch bei veritasium fühlt es sich seltsam an, wenn Creator stellvertretend einige Videos übernehmen.
Die wirklich große Enthüllung wäre wohl AvE.
Damals bezog sich ein großer Teil der Videokommentare auf den Kanalnamen und das Icon – und tatsächlich sieht eines seiner Augen so aus.
Aber selbst innerhalb solcher Nischenkanäle scheinen die Geschmäcker ziemlich auseinanderzugehen.
Seine Stimme ist wirklich gut. Ruhig und angenehm, sodass man ihn nebenbei laufen lassen kann, während man Hausarbeit macht, und trotzdem etwas lernt.
Solche Creator verdienen Anerkennung.
Das neueste Hologramm-Video gehört qualitativ zu den besten YouTube-Videos, die ich je gesehen habe.
Es wäre wirklich schön, mit diesem Tool ein Erklärvideo zum Bridging-Algorithmus[1] zu erstellen.
Ich bin seit 2016 ein Fan davon, wie dieser Algorithmus in partizipativen demokratischen Prozessen mit Tools wie Pol.is eingesetzt wird, und wollte dazu beitragen, das Verständnis der zugrunde liegenden Mathematik zu verbessern.
Hätte ich Manim gekannt, als die Summer of Math Exposition[2] lief, wäre ich definitiv eingestiegen.
[1]: https://bridging.systems/
[2]: https://some.3b1b.co/
Meine Website steht in meinem Profil. Falls du es irgendwann erstellst, schick mir den Link gern über Social Media.
Manim-Link: https://github.com/3b1b/manim
Es überrascht mich, wie enorm der Produktionsaufwand in jedem seiner Videos ist. Er verdient den YouTube Play Button.
Wie bei Blogs ist ein großer Teil dieser Arbeit verschwendet, wenn man kein Glück hat. Aber ein Blog bekommt zumindest mehrere Chancen auf Sichtbarkeit: Er kann auf HN nach oben kommen, sich auf X oder anderswo verbreiten. Selbst innerhalb einer Plattform gibt es normalerweise mehrere Chancen.
Bei YouTube dagegen entscheidet der Algorithmus im Grunde einmal. Wenn man nicht bereits eine riesige Abonnentenschaft hat, zeigt er das Video quasi zufällig ein paar Leuten; wenn die nicht reagieren, war es das.