3Blue1Brown animasyonları nasıl yapılıyor [Video]
(youtube.com)- 3Blue1Brown görselleştirmeleri, Grant Sanderson'ın oluşturduğu Python kütüphanesi Manim ile kodlanıyor; videoda da Ben Sparks ile birlikte gerçek üretim akışı izleniyor
- Manim, Grant'in kişisel üretim ortamı ile dokümantasyon, test ve issue yönetimi daha güçlü olan Manim Community olarak ikiye ayrılmış durumda; yeni başlayanlar için genelde community sürümü daha uygun
- Çalışma biçimi, Sublime Text ile Python terminalini bağlayıp kod parçalarını anında çalıştırmaya ve checkpoint paste ile ara durumları önbelleğe alarak tekrar tekrar denemeye yakın
- Demoda Lorenz attractor, SciPy ile hesaplandıktan sonra eğri, nokta, updater, 3D kamera ve iz efekti birleştirilerek birbirine yakın başlangıç koşullarının nasıl ayrıştığı gösteriliyor
- Son sahne, ön çalıştırma ile hata ve süre kontrolü yapıldıktan sonra MP4 olarak render ediliyor; ardından kurgu aracına aktarılıp YouTube video üretim sürecine devam ediliyor
Manim'in çıkış noktası ve iki ayrı sürüm
- 3Blue1Brown animasyonlarının temel aracı, Grant Sanderson'ın doğrudan geliştirdiği Python kütüphanesi Manim
- Manim, tüm sahneleri programatik olarak kuruyor ve 3Blue1Brown'ın üretim tarzına uygun özelleştirilmiş bir araç olarak gelişti
- Grant, lisans eğitimini bitirirken matematiksel fonksiyonları dönüşümlerle daha iyi görselleştirmek için Python kodu yazdı; bu kod da kanalın ilk videosuyla birlikte başladı
- Videolar arttıkça araç gelişti, gelişen araç da daha karmaşık videoları mümkün kılan bir döngü yarattı
- Yakın dönemdeki hologram videosundaki görsel efektler 2-3 yıl önce çok daha zor olurdu; ancak yıllar içinde yapılan iş akışı iyileştirmeleri üretim zorluğunu düşürdü
Manim Community ve Grant'in kişisel sürümü
- Grant, videolarda kullandığı kodu ve Manim'in kendisini GitHub'da açık olarak paylaştı
- Ancak video üretimiyle açık kaynak bakımını birlikte yürütürken issue ve Pull Request'lere yeterince yanıt vermek kolay olmadı
- Topluluk, daha sağlam bir araç üretmek için depoyu fork etti; bu sürüm Manim Community oldu
- Issue ve Pull Request yanıtları daha aktif
- Testler ve dokümantasyon daha iyi durumda
- İlk kez başlayanlar için genel olarak öneriliyor
- Video demosunda Grant'in doğrudan kullandığı sürüm yer alıyor
- Son birkaç yılda daha interaktif ve daha hızlı çalışacak şekilde geliştirildi
- Dokümantasyon ve testin önemli olduğu kullanıcılar için community sürümü daha uygun
Kod yazıp anında kontrol eden üretim biçimi
- Manim'deki her sahne bir Python class olarak yazılıyor ve render edilecek kod
constructmetodunun içinde bulunuyor - Daire, dikdörtgen, metin gibi nesneler ekrana ekleniyor;
playmetodu ileWrite,Transformgibi animasyonlar çalıştırılıyor - Nesnelerin çoğu varsayılan olarak ekranın ortasına yerleşiyor;
to_edge,shiftgibi işlemlerle konumları değiştiriliyor - Grant'in çalışma ortamı, Sublime Text ile Python terminalini birlikte kullanma düzenine dayanıyor
- Kod satırları kopyalanıp terminalde çalıştırıldığında mevcut sahneye anında yansıyor
- Sublime kısayolları, seçilen kodu kopyalayıp çalıştırma sürecini otomatikleştiriyor
- Terminal mevcut sahneye bağlı olduğu için değişiklik sonucu hemen görülebiliyor
- Uzun sahnelerde tüm kodu her seferinde baştan çalıştırmak yerine yalnızca ara bölümleri tekrar denemek önemli
- Hologram videosu örneği, 4 dakika 30 saniyelik bir MP4 üreten uzun bir Python koduydu
- Uzun sahneler çok sayıda bağlam ve yerel değişken paylaştığı için tek dosyada tutulmaları faydalıydı
checkpoint paste, belirli bir yorum satırı konumundaki sahne durumunu önbelleğe alıyor; sonra o duruma dönüp seçilen kodu çalıştırıyor- Bu yaklaşım, saf metin dosyası ile Jupyter notebook arasında hibrit bir iş akışına benziyor
Manim animasyonunun temel hissi
- Manim'in önemli felsefelerinden biri, “her şey her şeye dönüştürülebilir” fikri
- Örneğin
hello worldmetnindeki ilk harf olanH, bir daireye dönüştürülen sahneye çevrilebilir- Daireyi sahneye doğrudan eklemeden de dönüşüm hedefi olarak tanımlamak mümkün
- Metin bir karakter grubu olduğu için tek tek harfler alınıp işlenebiliyor
Transformvarsayılan olarak yumuşak bir rate function kullanıyor- Varsayılan değer
smooth; cubic bezier tabanlı, akıcı bir hareket gibi görünüyor linearkullanıldığında başlangıç ve bitiş daha sert hissediliyor- Matematiksel zaman akışını olduğu gibi göstermek gereken durumlarda
lineargerekli
- Varsayılan değer
- Bu ince ayarlar, yalnızca “hareket eden sahne” ile “izlemesi iyi görünen sahne” arasındaki farkı yaratıyor
Writegibi 3Blue1Brown videolarında tanıdık gelen animasyonlar da Manim'in yerleşik işlevleriyle çağrılabiliyor
Lorenz attractor demosu
- Demonun merkez örneği Lorenz attractor
- 3 boyutlu diferansiyel denklemlerden çıkan bir yapı
- 3D uzaydaki bir noktanın zaman içinde nasıl değişeceğini deterministik kurallarla belirliyor
- Başlangıç koşulları farklılaştırıldığında ilginç görsel sonuçlar ortaya çıkıyor
- Grant, matematiksel hesaplama bölümünü hazırlarken ChatGPT'den Python fonksiyonu yazmasını istedi
- SciPy'nin
integratearaçları ve başlangıç değer problemi çözücü işlevleri kullanıldı - Üretilen kod Matplotlib render'ı temel alıyordu, ardından Manim'e uyacak şekilde düzenlendi
- SciPy'nin
- Lorenz denkleminin durumu
x,y,zkoordinatlarından oluşuyor ve her andaki türevleri hesaplayan bir fonksiyonla ifade ediliyor - Sayısal çözüm sonucunda zaman değerleri ile
x,y,zdeğerleri elde ediliyor; Grant bunları kullanımı kolaylaştırmak için bir wrapper ile sardı- SciPy tarafındaki gösterim,
y'yi çıktı gibi ele aldığı için biraz kafa karıştırıcı olabiliyor - Durum dizisini ve transpoze biçimini kendi çalışma tarzına uygun hale getirdi
- SciPy tarafındaki gösterim,
- Başlangıç koşulu
(0, 0, 0)seçildiğinde tüm değerler 0 çıktığı için uygun olmadı; koordinatlardan biri 10 yapıldıktan sonra ilginç noktalar oluştu - Manim'de hesaplanan noktaları eğriye çevirmek için
set_points_as_cornerskullanılıyor - Eksenlerin koordinat sistemini Manim koordinat sistemine dönüştürmek için
coords_to_pointfonksiyonunun kısa hali olanc2pkullanılıyor - Python'daki
*sözdizimi, iterable bir yapıyı fonksiyon argümanlarına açarak vermek için kullanılıyor- Örnekte
x,y,zkoordinat listeleri ayrılıp fonksiyona aktarılıyor
- Örnekte
Birbirine yakın başlangıç koşullarının ayrıştığı sahne
- Lorenz attractor görselleştirmesinin kilit noktası, birbirine çok yakın başlangıç koşullarının önce benzer hareket edip sonra ayrışması
- Grant, başlangıç koşulları listesi oluşturuyor ve
zkoordinatını küçük birepsilonkadar farklı ayarlıyor- İlk etapta 2 koşulla başlıyor
- Sonrasında bunu 10 koşula çıkarıyor
- Birden fazla eğriyi tutmak için
VGroupkullanılıyor- Bunun vektörleştirilmiş nesne grubu olduğunu belirtmek, render'ı daha hızlı hale getirebiliyor
- Her eğrinin uç noktasına bir glow dot ekleniyor
GlowDot, hareket eden noktayı görsel olarak daha iyi göstermek için hazırlanmış bir nesne- Her noktaya updater bağlanıyor ve böylece her karede eğrinin uç noktasına taşınıyor
zip, nokta ve eğri ya da durum ve renk gibi eşleşen listeleri paralel dolaşmak için kullanılıyor- İki listenin uzunluğu farklıysa kısa olan bittiğinde duruyor
color_gradient, durum sayısıyla aynı sayıda renk üreterek uzunluğu eşitliyor
- Eğriler
ShowCreationile çizilirken varsayılan smoothing kullanılırsa gerçek zaman akışı bozulabilir; bu yüzden dinamiğin olduğu gibi gösterildiği bölümlerde linear rate function kullanılıyor - Yakın başlangıç koşulları ilk başta neredeyse birlikte hareket ederken zamanla tamamen farklı konumlara dağılmış gibi görünüyor
- Lorenz attractor, basit bir nokta ya da periyot değil; belirli bir biçime çekilirken tam konumu başlangıç koşullarına hassas olan bir strange attractor olarak ele alınıyor
İnteraktif moddaki geçici çözüm kodu ve sahne efektleri
- Demo sırasında
globals().update(locals())gibi “lanetli” bir kod ortaya çıkıyor - Bu kod, Manim'in IPython embed ortamında bir fonksiyonun dış kapsamdaki değişkenleri görememesi sorununu geçici olarak aşmak için kullanılıyor
- Normal Python script'lerinde aynı kod düzgün çalışıyor
- Manim'in gömülü interaktif ortamında
NameErroroluşabiliyor - Sorun, yerel değişkenlerin global değişken sözlüğüne eklenmesiyle geçiliyor
- Gerçek kütüphane kodunda böyle bir yaklaşım uygun olmaz; ancak sahne geliştirmeye yönelik geçici interaktif oturumlarda risk görece düşük
- Daha iyi yöntem, fonksiyonun ihtiyaç duyduğu değişkenleri argüman olarak açıkça alması
- Eğrilerin zamanla kaybolmasını sağlamak için
FadeOutkullanılabiliyorplayiçindekirun_time, evolution time ile eşleştirilirse eğri bu süre boyunca yavaşça saydamlaşıyor
- Noktanın arkasında iz bırakma efekti
TracingTailile uygulanıyor- Tek bir noktayı takip eden kuyruk üretilebiliyor
time_traceddeğeri 1 saniyeden 3 saniyeye çıkarılırsa daha uzun bir iz görülüyor- 10 noktanın her birine kuyruk eklenirse çoklu yörüngelerin dağılımı daha net hale geliyor
3D kamera ve denklem işleme
- Manim sahneleri varsayılan olarak 3D koordinatlara sahip olabiliyor; ancak 3Blue1Brown sahnelerinin çoğu eğitsel nedenlerle 2D kara tahta gibi görünecek şekilde kuruluyor
- Lorenz attractor için 3D gerekli olduğundan 3D eksenler ekleniyor
- 3D görüntüde derinlik hissini korumak için kameranın yavaşça dönmesi ya da hareket etmesi faydalı
- Grant, mevcut kamera konumunu panoya kaydeden bir kısayol kullanıyor
- Kamera çerçevesi,
frame.animate.reorient(...)biçiminde belirli bir konuma animasyonla taşınıyor
- Denklemler, LaTeX nesneleri olarak sahneye eklenebiliyor
- MathPix kullanıldığında ekrandaki denklemler OCR ile okunup LaTeX ya da SVG olarak alınabiliyor
- 3D sahnede denklemi ekrana sabitlemek için
fix_in_framekullanılıyor
- LaTeX denklemlerindeki belirli değişkenler renklendirilebiliyor
- Örnekte
x,y,zfarklı renklerle atanıyor - Metni matematiksel bileşenlere ayırıp vurgulama ya da dönüştürme özelliği, matematik anlatımında yararlı
- Örnekte
- Manim'de string eşleşmesine göre çalışan özel transform türleri de var
A^2,B^2gibi terimler sonraki satırda aynı string konumlarına doğal biçimde taşınabiliyor- String tabanlı eşleme, anagram benzeri animasyonlarda harfleri karşılık gelen konumlara gönderen efektler de üretebiliyor
flash around,indicategibi animasyonlarla denklemin belirli harfleri ya da terimleri vurgulanabiliyor
Render alma ve gerçek üretim akışı
- Sahne istenen hale geldiğinde Manim komutuyla Python dosyası ve sahne adı belirtilerek render alınıyor
pre-run, tüm animasyonu gerçek kullanım öncesinde gözden geçirme aşaması- Toplam süreyi tahmin etmeye yardımcı oluyor
- Render'ın ortasında değil, öncesinde hata yakalamayı kolaylaştırıyor
W, dosyaya yazma seçeneği; Finder ile ilgili seçenekler ise macOS Finder'da çıktı dosyasını açmak için kullanılıyor- Nihai sonuç MP4 dosyası olarak render ediliyor
- Grant genelde 4K render aldığı için işlem daha uzun sürebiliyor
- Render edilen dosya daha sonra kurgu aracına alınıp düzenleniyor
- Manim'in eski kullanım biçimi daha çok komut satırından sahne render edip MP4 sonucunu kontrol etme döngüsüne dayanıyordu
- Daha sonra OpenGL uygulamasına geçiş dönemine yakın şekilde interaktif shell tabanlı iş akışı ortaya çıktı; kodu seçip anında sonucu görme modeli benimsendi
- Grant'in somut iş akışı, Sublime Text script'lerine ve Terminus eklentisine dayanıyor
- Benzer davranış başka metin editörlerinde de taklit edilebilir
- Visual Studio ailesindeki ortamlarda da benzer bir akış kurulabilir
- Özellik ararken örnek sahnelerden, kütüphanenin
animationklasöründen ve geçmiş video kodlarını içeren3b1b/videosGitHub deposundan yararlanılabiliyor - Grant, Copilot'tan ziyade daha basit otomatik tamamlamayı tercih ediyor
- Manim'de çoğu zaman ne yapmak istediğini zaten biliyor
- İsteği İngilizce yerine kodla ifade etmek ona daha doğal geliyor
1 yorum
Hacker News yorumları
3B1B gerçekten harika işler yapıyor
Kişisel olarak YouTube videolarından inanılmaz fayda gördüm; keşke lisede ya da mühendislik fakültesinde matematik böyle öğretilseydi
https://sinerider.com/ de bakmaya değer
Grant Sanderson’ın 3B1B çalışmalarına zaman zaman yardım eden bir arkadaşının yaptığı bir oyun; LineRider gibi parkur kuruyorsunuz ama bunu formüllerle yapıyorsunuz, mükemmel bir matematik eğitim oyunu
Hem 3B1B hem de SineRider, fonksiyon bileşimine dair sezgisel anlayışım üzerinde en büyük etkiye sahip oldu
Gerçek zamanlı olarak render motorundaki bir bug'ı fark edip bir geçici çözüm bulduğu sahne etkileyiciydi
https://youtu.be/rbu7Zu5X1zI?feature=shared&t=693
Yine de etkileyici bir iş
Konumu ve sebebi bilip canlı yayında bir geçici çözüm düşünebilmesi, kendi araçlarını iyileştirmeye zaman yatırdığı anlamına geliyor; hem de arada sırada değil, aktif biçimde
Bence hâlâ çok havalı
Sağ alttaki Python etkileşimli REPL'in nasıl çalıştığını merak etmiştim
Düzenleme: Görünüşe göre tamamen özel bir iş akışıymış: https://github.com/3b1b/videos?tab=readme-ov-file#workflow
Yıllarca sadece sesini duyup yüzünü görmedikten sonra yüzünü görünce, bir anda uncanny valley'nin tam ortasına düşmüşüm gibi hissettirdi, komik
Son birkaç videoda sunucu, röportajcı ve anlatıcı gibi davranıyordu
veratasium gibi, üreticinin bazı videoları devralması da garip hissettiriyor
Gerçekten büyük bir ifşa olacaksa o da AvE olurdu
O dönem video yorumlarının önemli bir kısmı kanal adı ve ikonuyla ilgiliydi; gerçekten de bir gözü öyle görünüyor
Yine de böyle niş kanallar içinde bile zevkler epey ayrışıyor gibi
Sesi gerçekten çok iyi. Sakin ve rahatlatıcı; ev işi yaparken arka planda açıp yine de bir şeyler öğrenebiliyorsun
Böyle üreticiler takdiri hak ediyor
Son hologram videosu, YouTube’da gördüğüm videolar arasında kalite açısından en üst sıralarda yer alıyor
Bu araçla bridging algorithm[1] üzerine bir açıklayıcı video yapılması harika olurdu
2016’dan beri Pol.is gibi araçları kullanan katılımcı demokrasi süreçlerinde bu algoritmanın kullanılma biçiminin hayranıyım ve arkasındaki matematiğe dair anlayışı artırmaya katkı sunmak istiyordum
Summer of Math Exposition[2] sırasında Manim’i bilseydim kesinlikle ben de katılırdım
[1]: https://bridging.systems/
[2]: https://some.3b1b.co/
Web sitem profilimde var; bir gün yaparsan sosyal medyadan link gönderirsen sevinirim
Manim bağlantısı: https://github.com/3b1b/manim
Her videosuna giren üretim miktarı gerçekten şaşırtıcı. YouTube play button'ı hak ediyor
Bloglarda olduğu gibi, şansın yaver gitmezse bu emeğin büyük kısmı boşa gidebiliyor. Ama blogların en azından tekrar tekrar görünme şansı var. HN’nin üst sıralarına çıkabilir, X’te ya da başka yerlerde yayılabilir. Tek bir platform içinde bile genelde birden fazla fırsat oluyor
Buna karşılık YouTube’da algoritma fiilen tek seferde karar veriyor. Zaten çok büyük bir abone kitlen yoksa videoyu neredeyse rastgele birkaç kişiye gösteriyor; onlar da tepki vermezse iş orada bitiyor