Cara membuat animasi 3Blue1Brown [Video]
(youtube.com)- Visualisasi 3Blue1Brown dikodekan dengan library Python Manim yang dibuat oleh Grant Sanderson, dan videonya mengikuti alur produksi nyata bersama Ben Sparks
- Manim terbagi antara lingkungan produksi pribadi Grant dan Manim Community yang diperkuat dalam dokumentasi, pengujian, dan penanganan issue; untuk pemula, versi komunitas biasanya lebih cocok
- Pengerjaan ini mirip alur menghubungkan Sublime Text dan terminal Python untuk langsung menjalankan potongan kode, lalu memakai checkpoint paste untuk menyimpan status tengah dan bereksperimen berulang kali
- Demonya menghitung Lorenz attractor dengan SciPy, lalu menggabungkan kurva, titik, updater, kamera 3D, dan efek jejak untuk menunjukkan proses kondisi awal yang berdekatan saling menyimpang
- Adegan akhir dirender ke MP4 setelah pre-run untuk memeriksa error dan durasi, lalu dimasukkan ke alat editing untuk melanjutkan proses pembuatan video YouTube
Titik awal Manim dan dua cabang versinya
- Alat inti animasi 3Blue1Brown adalah library Python Manim yang dibuat langsung oleh Grant Sanderson
- Manim menyusun semua adegan secara terprogram, dan berkembang sebagai alat khusus yang disesuaikan dengan cara produksi 3Blue1Brown
- Menjelang akhir masa kuliahnya, Grant membuat kode Python untuk memvisualisasikan fungsi matematika dengan lebih baik sebagai transformasi, dan kode ini dimulai bersama video pertama kanal tersebut
- Seiring bertambahnya video, alatnya ikut membaik, dan alat yang membaik itu kembali memungkinkan video yang lebih kompleks
- Efek visual pada video hologram terbaru akan jauh lebih sulit jika dikerjakan 2–3 tahun lalu, tetapi berkat perbaikan workflow selama beberapa tahun, tingkat kesulitan produksinya menurun
Manim Community dan versi pribadi Grant
- Grant telah membuka kode yang dipakai dalam videonya dan Manim itu sendiri di GitHub
- Namun, karena produksi video dan pengelolaan open source berjalan bersamaan, penanganan issue dan Pull Request tidak bisa dilakukan secara memadai
- Komunitas mem-fork repositori tersebut untuk membuat alat yang lebih kokoh, dan versi ini adalah Manim Community
- Penanganan issue dan Pull Request lebih aktif
- Pengujian dan dokumentasi lebih lengkap
- Secara umum direkomendasikan bagi orang yang baru mulai
- Dalam demo video, yang dipakai adalah versi yang benar-benar digunakan Grant sendiri
- Dalam beberapa tahun terakhir, versi ini ditingkatkan agar lebih interaktif dan bekerja lebih cepat
- Bagi pengguna yang mengutamakan dokumentasi dan pengujian, versi komunitas lebih cocok
Cara produksi dengan menulis kode dan langsung mengeceknya
- Setiap adegan di Manim ditulis sebagai class Python, dan kode yang akan dirender masuk ke dalam metode
construct - Objek seperti lingkaran, persegi, dan teks ditambahkan ke layar, lalu animasi seperti
WritedanTransformdijalankan dengan metodeplay - Sebagian besar objek secara default diletakkan di tengah layar, lalu posisinya diubah dengan operasi seperti
to_edgedanshift - Lingkungan kerja Grant adalah memakai Sublime Text bersama terminal Python
- Baris kode bisa disalin lalu dijalankan di terminal dan langsung tercermin pada adegan saat ini
- Shortcut Sublime mengotomatiskan proses menyalin dan menjalankan kode yang dipilih
- Terminal terhubung ke adegan saat ini sehingga hasil perubahan bisa langsung diperiksa
- Pada adegan panjang, kemampuan untuk bereksperimen berulang hanya pada bagian tengah tanpa menjalankan seluruh kode setiap kali menjadi sangat penting
- Contoh video hologram adalah kode Python panjang yang menghasilkan MP4 berdurasi 4 menit 30 detik
- Adegan panjang berbagi banyak konteks dan variabel lokal, sehingga menyimpannya dalam satu file terasa berguna
checkpoint pastemenyimpan status adegan pada posisi komentar tertentu, lalu kembali ke status itu dan menjalankan kode yang dipilih- Pendekatan ini lebih mirip workflow hibrida antara file teks murni dan Jupyter notebook
Nuansa dasar animasi Manim
- Salah satu filosofi penting Manim adalah bahwa “apa pun bisa diubah menjadi apa pun”
- Misalnya, bisa dibuat adegan yang mengubah huruf pertama
Hdari tekshello worldmenjadi lingkaran- Lingkaran itu tidak perlu langsung ditambahkan ke adegan, cukup didefinisikan sebagai target transformasi
- Teks adalah kelompok karakter sehingga huruf per huruf bisa diambil dan dimanipulasi
Transformsecara default memakai rate function yang halus- Nilai default-nya adalah
smooth, dan terlihat seperti gerakan halus berbasis cubic bezier - Jika memakai
linear, awal dan akhir gerak terasa lebih kaku - Dalam kasus ketika perkembangan waktu matematis harus ditampilkan apa adanya,
lineardiperlukan
- Nilai default-nya adalah
- Penyesuaian detail seperti ini menciptakan perbedaan antara sekadar “adegan bergerak” dan “adegan yang enak dilihat”
- Animasi yang familier di video 3Blue1Brown seperti
Writejuga bisa dipanggil sebagai fungsi bawaan Manim
Demo Lorenz attractor
- Contoh utama dalam demo adalah Lorenz attractor
- Ini adalah bentuk yang muncul dari persamaan diferensial tiga dimensi
- Titik di ruang 3D ditentukan oleh aturan deterministik tentang bagaimana ia berubah seiring waktu
- Jika kondisi awal diubah menjadi beberapa variasi, akan muncul hasil visual yang menarik
- Saat membuat bagian perhitungan matematika, Grant meminta ChatGPT menulis fungsi Python
- Dipakai
integratedari SciPy dan fungsi penyelesai masalah nilai awal - Kode yang dihasilkan awalnya mengacu pada rendering Matplotlib, lalu disesuaikan agar cocok untuk Manim
- Dipakai
- Keadaan persamaan Lorenz dinyatakan dengan koordinat
x,y,z, dan direpresentasikan sebagai fungsi yang menghitung turunan di setiap saat - Hasil solusi numerik keluar sebagai nilai waktu serta nilai
x,y,z, dan Grant menambahkan wrapper agar lebih mudah dipakai- Bentuk representasi dari SciPy agak membingungkan karena memperlakukan
yseperti output - Array keadaan dan bentuk transposenya disesuaikan ke format yang lebih nyaman untuk dipakai
- Bentuk representasi dari SciPy agak membingungkan karena memperlakukan
- Ketika kondisi awal diatur ke
(0, 0, 0), semua nilai menjadi 0 sehingga tidak cocok; setelah satu koordinat diubah menjadi 10, muncullah titik-titik yang menarik - Di Manim,
set_points_as_cornersdipakai untuk mengubah titik-titik hasil perhitungan menjadi kurva - Untuk mengubah koordinat sumbu ke sistem koordinat Manim, dipakai
c2p, singkatan daricoords_to_point - Sintaks
*di Python dipakai untuk membongkar iterable menjadi argumen fungsi- Pada contoh, daftar koordinat
x,y,zdipisahkan lalu diteruskan ke fungsi
- Pada contoh, daftar koordinat
Adegan kondisi awal yang berdekatan lalu menyimpang
- Inti visualisasi Lorenz attractor adalah kondisi-kondisi awal yang sangat berdekatan mula-mula bergerak mirip, lalu kemudian menyimpang
- Grant membuat daftar kondisi awal dan menetapkan koordinat
zberbeda sebesarepsilonkecil- Awalnya dimulai dengan 2 kondisi
- Setelah itu diperluas menjadi 10 kondisi
VGroupdipakai untuk menampung beberapa kurva- Dengan memberi tahu bahwa ini adalah grup objek tervectorisasi, rendering bisa dibuat lebih cepat
- Pada titik ujung tiap kurva dipasang glow dot
GlowDotadalah objek yang dibuat agar titik bergerak terlihat lebih menarik secara visual- Setiap titik dipasangi updater agar berpindah ke ujung kurva pada setiap frame
zipdipakai saat menelusuri daftar yang saling berpasangan secara paralel, seperti titik dan kurva, atau state dan warna- Jika panjang dua daftar berbeda, iterasi berhenti saat daftar yang lebih pendek habis
color_gradientdipakai untuk membuat jumlah warna yang sama dengan jumlah state agar panjangnya cocok
- Saat menggambar kurva dengan
ShowCreation, smoothing default bisa mendistorsikan perkembangan waktu yang sebenarnya, jadi untuk bagian yang ingin menunjukkan dinamika apa adanya dipakai linear rate function - Kondisi awal yang berdekatan hampir bergerak bersama pada awalnya, tetapi seiring waktu menyebar hingga tampak berada di posisi yang sepenuhnya berbeda
- Lorenz attractor diperlakukan sebagai strange attractor yang tertarik ke bentuk tertentu alih-alih sekadar titik atau periode, tetapi posisi tepatnya sensitif terhadap kondisi awal
Kode workaround di mode interaktif dan efek adegan
- Dalam demo muncul kode “terkutuk” seperti
globals().update(locals()) - Ini adalah workaround sementara untuk menghindari masalah di lingkungan embed IPython Manim, tempat fungsi tidak bisa melihat variabel dari scope luar
- Dalam skrip Python biasa, kode yang sama berjalan normal
- Di lingkungan interaktif tersemat Manim, bisa muncul
NameError - Variabel lokal dimasukkan ke dictionary variabel global untuk menghindari masalah itu
- Untuk kode library sungguhan, cara seperti ini tidak tepat, tetapi dalam sesi interaktif sementara untuk pengembangan adegan risikonya relatif kecil
- Cara yang lebih baik adalah membuat fungsi menerima variabel yang dibutuhkan secara eksplisit sebagai argumen
- Untuk membuat kurva menghilang seiring waktu,
FadeOutbisa dipakai- Jika
run_timepadaplaydisesuaikan dengan evolution time, kurva akan perlahan menjadi transparan selama waktu tersebut
- Jika
- Efek meninggalkan jejak di belakang titik diimplementasikan dengan
TracingTail- Bisa membuat ekor yang mengikuti satu titik
- Jika
time_traceddinaikkan dari 1 detik menjadi 3 detik, jejak yang terlihat akan mencakup waktu lebih panjang - Jika tiap satu dari 10 titik diberi ekor, penyebaran beberapa lintasan menjadi terlihat jauh lebih jelas
Kamera 3D dan pemrosesan rumus
- Adegan Manim pada dasarnya bisa memiliki koordinat 3D, tetapi sebagian besar adegan 3Blue1Brown dibuat agar tampak seperti papan tulis 2D demi alasan edukatif
- Lorenz attractor membutuhkan 3D, jadi sumbu 3D ditambahkan
- Di layar 3D, efek kamera yang berputar atau bergerak perlahan berguna untuk menjaga kesan kedalaman
- Grant memakai shortcut yang menyimpan posisi kamera saat ini ke clipboard
- Kamera dianimasikan ke posisi tertentu dalam bentuk
frame.animate.reorient(...)
- Rumus bisa ditambahkan ke adegan sebagai objek LaTeX
- Dengan MathPix, persamaan di layar bisa dibaca lewat OCR untuk mendapatkan LaTeX atau SVG
- Untuk menjaga rumus tetap menempel pada layar di adegan 3D, digunakan
fix_in_frame
- Variabel tertentu dalam rumus LaTeX bisa diberi warna
- Dalam contoh,
x,y,zmasing-masing ditetapkan dengan warna berbeda - Kemampuan memisahkan teks menjadi komponen matematis untuk ditekankan atau ditransformasikan berguna dalam penjelasan matematika
- Dalam contoh,
- Manim juga memiliki transform khusus yang mencocokkan string
- Suku seperti
A^2danB^2bisa berpindah secara alami ke posisi string yang sama pada baris berikutnya - Pencocokan berbasis string juga bisa membuat efek seperti animasi anagram yang memindahkan huruf ke posisi yang bersesuaian
- Suku seperti
- Animasi seperti
flash arounddanindicatebisa dipakai untuk menonjolkan karakter atau suku tertentu dalam rumus
Rendering dan alur produksi nyata
- Setelah adegan dirasa memuaskan, rendering dilakukan dengan perintah Manim yang menentukan file Python dan nama adegan
pre-runadalah tahap meninjau seluruh animasi sebelum benar-benar digunakan- Membantu memperkirakan durasi total
- Berguna untuk menangkap error lebih awal, bukan di tengah proses rendering
Wadalah opsi untuk menulis ke file, dan opsi terkait Finder dipakai untuk menampilkan file hasil di macOS Finder- Hasil akhir dirender sebagai file MP4
- Grant biasanya merender dalam 4K sehingga bisa memakan waktu lebih lama
- File hasil render kemudian dimasukkan ke alat editing untuk diedit lebih lanjut
- Cara lama memakai Manim terutama berupa siklus merender adegan lewat command line lalu memeriksa MP4
- Setelah muncul workflow berbasis shell interaktif, kurang lebih bersamaan dengan masa perpindahan ke implementasi OpenGL, prosesnya berubah menjadi menyorot kode dan langsung melihat hasilnya
- Workflow spesifik Grant bergantung pada skrip Sublime Text dan ekstensi Terminus
- Perilaku serupa bisa ditiru di editor teks lain
- Lingkungan keluarga Visual Studio juga bisa membuat alur kerja serupa
- Saat mencari fitur, bisa memanfaatkan contoh adegan, folder
animationdi library, dan repositori GitHub3b1b/videosyang berisi kode video lama - Grant lebih menyukai autocomplete yang lebih sederhana dibanding Copilot
- Dalam Manim, sering kali ia sudah tahu perilaku yang diinginkannya
- Menyatakan permintaan dalam bentuk kode terasa lebih alami baginya daripada dalam bahasa Inggris
1 komentar
Opini Hacker News
3B1B benar-benar melakukan pekerjaan yang luar biasa
Secara pribadi, saya sangat terbantu oleh video-video YouTube-nya, dan saya berharap matematika diajarkan seperti ini di SMA atau fakultas teknik
https://sinerider.com/ juga layak dilihat
Ini gim yang dibuat oleh seorang teman yang kadang membantu pekerjaan 3B1B Grant Sanderson; gim edukasi matematika yang bagus, mirip LineRider dalam membuat lintasan, tetapi dibuat dengan persamaan
Baik 3B1B maupun SineRider punya pengaruh paling besar terhadap pemahaman intuitif saya tentang komposisi fungsi
Adegan saat ia menemukan bug di mesin rendering secara real time dan bahkan menemukan workaround-nya terasa mengesankan
https://youtu.be/rbu7Zu5X1zI?feature=shared&t=693
Meski begitu, tetap pekerjaan yang mengesankan
Fakta bahwa ia tahu lokasi dan penyebabnya lalu bisa memikirkan workaround secara live berarti ia menginvestasikan waktu untuk memperbaiki alatnya sendiri, dan bukan sesekali saja melainkan secara aktif
Menurut saya tetap keren
Saya penasaran bagaimana REPL interaktif Python di kanan bawah itu bekerja
Edit: sepertinya ini workflow yang sepenuhnya kustom: https://github.com/3b1b/videos?tab=readme-ov-file#workflow
Lucu juga, setelah bertahun-tahun hanya mendengar suaranya tanpa melihat wajahnya, begitu melihat wajahnya rasanya tiba-tiba masuk tepat ke tengah uncanny valley
Dalam beberapa video terbaru, ia bertindak seperti pembawa acara, pewawancara, dan narator
Rasanya juga agak aneh ketika kreator lain menggantikan beberapa video, seperti di veratasium
Kalau pengungkapan yang benar-benar besar, mungkin AvE
Saat itu, banyak komentar video membahas nama kanal dan ikonnya, dan memang salah satu matanya benar-benar terlihat seperti itu
Meski begitu, bahkan di antara kanal-kanal niche seperti ini pun selera tampaknya cukup terbagi
Suaranya benar-benar bagus. Tenang dan nyaman, jadi bisa diputar di samping saat mengerjakan pekerjaan rumah dan tetap belajar sesuatu
Kreator seperti ini pantas mendapat pengakuan
Video hologram terbarunya termasuk salah satu video YouTube dengan kualitas terbaik yang pernah saya lihat
Akan sangat bagus kalau alat ini dipakai untuk membuat video penjelasan tentang algoritma bridging[1]
Sejak 2016 saya menyukai cara algoritma ini digunakan dalam proses demokrasi partisipatif dengan alat seperti Pol.is, dan saya ingin berkontribusi meningkatkan pemahaman tentang matematika di baliknya
Kalau saya tahu Manim saat Summer of Math Exposition[2] berlangsung, saya pasti akan ikut terjun
[1]: https://bridging.systems/
[2]: https://some.3b1b.co/
Situs web saya ada di profil, jadi kalau suatu hari membuatnya, tolong kirim tautannya lewat media sosial
Tautan Manim: https://github.com/3b1b/manim
Saya kagum dengan besarnya jumlah produksi yang masuk ke setiap videonya. Ia memang pantas mendapat YouTube Play Button
Sama seperti blog, tanpa keberuntungan, sebagian besar usaha itu bisa terbuang. Namun blog setidaknya punya beberapa kesempatan untuk terekspos. Bisa naik ke halaman atas HN, atau menyebar di X maupun tempat lain. Bahkan dalam satu platform pun biasanya ada beberapa kesempatan
Sebaliknya, di YouTube, algoritme pada dasarnya memutuskan sekali saja. Kalau belum punya jumlah subscriber yang sangat besar, video akan ditampilkan hampir secara acak kepada beberapa orang, dan kalau mereka tidak merespons, selesai sampai di situ