2 puan yazan GN⁺ 2024-10-13 | 1 yorum | WhatsApp'ta paylaş
  • 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 construct metodunun içinde bulunuyor
  • Daire, dikdörtgen, metin gibi nesneler ekrana ekleniyor; play metodu ile Write, Transform gibi animasyonlar çalıştırılıyor
  • Nesnelerin çoğu varsayılan olarak ekranın ortasına yerleşiyor; to_edge, shift gibi 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 world metnindeki ilk harf olan H, 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
  • Transform varsayı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
    • linear kullanıldığında başlangıç ve bitiş daha sert hissediliyor
    • Matematiksel zaman akışını olduğu gibi göstermek gereken durumlarda linear gerekli
  • Bu ince ayarlar, yalnızca “hareket eden sahne” ile “izlemesi iyi görünen sahne” arasındaki farkı yaratıyor
  • Write gibi 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 integrate araç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
  • Lorenz denkleminin durumu x, y, z koordinatlarından oluşuyor ve her andaki türevleri hesaplayan bir fonksiyonla ifade ediliyor
  • Sayısal çözüm sonucunda zaman değerleri ile x, y, z değ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
  • 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_corners kullanılıyor
  • Eksenlerin koordinat sistemini Manim koordinat sistemine dönüştürmek için coords_to_point fonksiyonunun kısa hali olan c2p kullanı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, z koordinat listeleri ayrılıp fonksiyona aktarılıyor

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 z koordinatını küçük bir epsilon kadar 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 VGroup kullanı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 ShowCreation ile ç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 NameError oluş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 FadeOut kullanılabiliyor
    • play içindeki run_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 TracingTail ile uygulanıyor
    • Tek bir noktayı takip eden kuyruk üretilebiliyor
    • time_traced değ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_frame kullanılıyor
  • LaTeX denklemlerindeki belirli değişkenler renklendirilebiliyor
    • Örnekte x, y, z farklı renklerle atanıyor
    • Metni matematiksel bileşenlere ayırıp vurgulama ya da dönüştürme özelliği, matematik anlatımında yararlı
  • Manim'de string eşleşmesine göre çalışan özel transform türleri de var
    • A^2, B^2 gibi 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, indicate gibi 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 animation klasöründen ve geçmiş video kodlarını içeren 3b1b/videos GitHub 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

 
GN⁺ 2024-10-13
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

    • Ben de benzer hissediyorum. Yalnız birçok insan için matematik ancak biraz daha ileriki yaşlarda gerçekten takdir ediliyor ve o zaman da insan böyle kanallara çekiliyor gibi geliyor
  • 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

    • Bana daha çok, arka planda üzerinde çalıştığı yeni render mantığının sınırlarını zaten biliyormuş ve basit, üst seviye bir geçici çözümü de önceden aklında varmış gibi göründü
      Yine de etkileyici bir iş
    • Büyük şirketlerde böyle kundakçı-itfaiyeci tipi mühendisler bazen öne çıkar. Çünkü kendi yarattıkları bug'ı çok görünür bir yerde düzeltirler
    • O bug'ı biliyordu ama bu yazılım geliştirme onun asıl işi değil; asıl işi video üretmek
      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

    • YouTube’da tamamen ticarileşmemiş az sayıdaki harika üreticiden biri gibi görünüyor. Aklıma Mark Rober geliyor
  • 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

    • İzlediğim epey üretici son zamanlarda yüzünü göstermeye başladı gibi geliyor. Aklıma gelen büyük örnek Real Engineering’in sunucusu
      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
    • Mezuniyet konuşmasını izlersen daha da şaşırabilirsin. Örneğin: https://youtu.be/z7GVHB2wiyg
    • 2020’de kapanma döneminde insanların insani bağ duygusunu korumasına yardımcı olmak için yüzünü göstermeye başlamıştı
      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
    • Daha önce Matt Parker ve Brady Haran(Numberphile) videolarında da birkaç kez görünmüştü; bunu görmemiş olmana şaşırdım
      Yine de böyle niş kanallar içinde bile zevkler epey ayrışıyor gibi
    • Özellikle anlatım sesi, gündelik şekilde çekilmiş bir kişinin sesinden daha yüksek ses kalitesine sahip oluyor; bu küçük fark bile oldukça garip hissettirebiliyor
  • 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

    • Böyle bir sesin başarıda büyük payı vardır diye düşünüyorum. İster YouTube olsun ister podcast
    • Bu adam doğuştan bir eğitmen. Ona sadece içerik üreticisi demek, toplumsal değerini tam yansıtmıyor
    • Benim zevkime göre fazla genizden geliyor. somehow bu, içindeki titizliği biraz azaltıyormuş gibi hissettiriyor
  • 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/

    • Böyle bir şey olduğunu bilmiyordum. Link için teşekkürler; şu an makaleyi okuyorum ve bir açıklayıcı video yaparsan kesin izlemek isterim
      Web sitem profilimde var; bir gün yaparsan sosyal medyadan link gönderirsen sevinirim
    • İçinde gerçekte ne tür bir matematik olduğunu merak ediyorum. [1] bağlantısını takip ettim ama neredeyse hiç matematiksel içerik bulamadım
    • Yaparsan izlerim. pol.is hayranıyım
  • Manim bağlantısı: https://github.com/3b1b/manim

  • Her videosuna giren üretim miktarı gerçekten şaşırtıcı. YouTube play button'ı hak ediyor

    • YouTube’un üzücü yanı da tam bu. Yüksek kaliteli video üretmek akıl almaz derecede emek istiyor; iyi çizilmiş bir blog yazısı hazırlamaktan birkaç büyüklük mertebesi daha fazla
      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