3Blue1Brown एनीमेशन कैसे बनते हैं [वीडियो]
(youtube.com)- 3Blue1Brown की visualization को Grant Sanderson द्वारा बनाई गई Python लाइब्रेरी Manim से code किया जाता है, और वीडियो Ben Sparks के साथ वास्तविक production workflow को follow करता है
- Manim, Grant के निजी production environment और docs·tests·issue response को अधिक मज़बूत बनाने वाले Manim Community में बँटा हुआ है, और शुरुआती लोगों के लिए आमतौर पर community version अधिक उपयुक्त है
- काम करने का तरीका Sublime Text और Python terminal को जोड़कर code snippets को तुरंत चलाने और checkpoint paste से बीच की state को cache करके बार-बार experiment करने के काफ़ी करीब है
- डेमो में Lorenz attractor को SciPy से calculate करने के बाद curve, dot, updater, 3D camera और trail effect को मिलाकर यह दिखाया जाता है कि पास-पास की initial conditions कैसे अलग हो जाती हैं
- अंतिम scene को pre-run से error और length जाँचने के बाद MP4 में render किया जाता है, और फिर उसे editing tool में डालकर YouTube वीडियो production process आगे बढ़ती है
Manim की शुरुआत और उसके दो branch version
- 3Blue1Brown animation का मुख्य tool Grant Sanderson द्वारा खुद बनाई गई Python लाइब्रेरी Manim है
- Manim में हर scene को programming के ज़रिए बनाया जाता है, और यह 3Blue1Brown के production style के अनुरूप एक custom tool के रूप में विकसित हुआ है
- Grant ने undergraduate के आख़िरी दौर में mathematical functions को transformations के रूप में बेहतर visualize करने के लिए Python code लिखा था, और यही code चैनल के पहले वीडियो के साथ शुरू हुआ
- जैसे-जैसे वीडियो बढ़ते गए, tool बेहतर होता गया, और बेहतर tool ने फिर और जटिल वीडियो बनाना संभव किया
- हाल के hologram वीडियो के visual effects 2~3 साल पहले कहीं ज़्यादा कठिन होते, लेकिन कई वर्षों के workflow improvement की वजह से production कठिनाई कम हुई
Manim Community और Grant का निजी version
- Grant, वीडियो में इस्तेमाल किया गया code और Manim खुद, दोनों GitHub पर public करते रहे हैं
- लेकिन वीडियो production और open source management साथ-साथ चलते रहने से issues और Pull Requests पर पर्याप्त response देना आसान नहीं था
- community ने ज़्यादा मज़बूत tool बनाने के लिए repository को fork किया, और यही version Manim Community है
- issues और Pull Requests पर response अधिक सक्रिय है
- tests और documentation बेहतर तरीके से तैयार हैं
- शुरुआत करने वालों के लिए आमतौर पर यही recommended है
- वीडियो डेमो में Grant द्वारा सीधे इस्तेमाल किया जाने वाला version इस्तेमाल होता है
- पिछले कुछ वर्षों में इसे अधिक interactive और तेज़ चलने वाला बनाया गया है
- जिन लोगों के लिए documentation और tests महत्वपूर्ण हैं, उनके लिए community version अधिक उपयुक्त है
code लिखकर तुरंत जाँचने वाला production style
- Manim का हर scene एक Python class के रूप में लिखा जाता है, और
constructmethod के अंदर render होने वाला code रहता है - circle, rectangle, text जैसे objects को screen पर add किया जाता है, और
playmethod सेWrite,Transformजैसे animations चलाए जाते हैं - ज़्यादातर objects default रूप से screen के center में रखे जाते हैं, और
to_edge,shiftजैसे operations से उनकी position बदली जाती है - Grant का work environment, Sublime Text और Python terminal को साथ इस्तेमाल करने पर आधारित है
- code line को copy करके terminal में चलाने पर उसका असर तुरंत current scene में दिखता है
- Sublime shortcut, चुने गए code को copy करके run करने की प्रक्रिया automate करता है
- terminal current scene से जुड़ा रहता है, इसलिए बदलाव का परिणाम तुरंत देखा जा सकता है
- लंबे scene में पूरा code हर बार दोबारा चलाने के बजाय बीच के हिस्से पर बार-बार experiment करने वाली सुविधा महत्वपूर्ण होती है
- hologram वीडियो का उदाहरण 4 मिनट 30 सेकंड का MP4 बनाने वाला लंबा Python code था
- लंबे scene में बहुत सारा context और local variables share होते हैं, इसलिए उन्हें एक ही file में रखना उपयोगी था
checkpoint pasteकिसी खास comment position पर scene state को cache करता है, फिर उसी state पर लौटकर चुना गया code चलाता है- यह तरीका pure text file और Jupyter notebook के बीच के hybrid workflow जैसा है
Manim animation का बुनियादी एहसास
- Manim की एक महत्वपूर्ण philosophy यह है कि “कुछ भी किसी भी चीज़ में transform हो सकता है”
- उदाहरण के लिए
hello worldtext के पहले अक्षरHको circle में transform करने वाला scene बनाया जा सकता है- circle को scene में सीधे add किए बिना भी उसे transformation target के रूप में define किया जा सकता है
- text, characters के group की तरह होता है, इसलिए individual letters को निकालकर manipulate किया जा सकता है
Transformdefault रूप से smooth rate function का उपयोग करता है- default value
smoothहै, जो cubic bezier आधारित मुलायम movement जैसा दिखता है linearइस्तेमाल करने पर शुरुआत और अंत ज़्यादा सख़्त महसूस होते हैं- जहाँ mathematical time progression को वैसा ही दिखाना ज़रूरी हो, वहाँ
linearचाहिए
- default value
- इसी तरह की बारीक tuning, सिर्फ़ “चलता हुआ scene” और “अच्छा दिखने वाला scene” के बीच फ़र्क बनाती है
Writeजैसे 3Blue1Brown वीडियो में परिचित animations भी Manim built-in function के रूप में call किए जा सकते हैं
Lorenz attractor डेमो
- डेमो का मुख्य उदाहरण Lorenz attractor है
- यह 3-dimensional differential equations से आने वाला रूप है
- यह 3D space में किसी point के समय के साथ बदलने के तरीके को deterministic rules से तय करता है
- initial conditions को कई तरह से बदलने पर दिलचस्प visual result मिलते हैं
- Grant ने mathematical calculation वाला हिस्सा बनाते समय ChatGPT से Python function लिखने को कहा
- SciPy के
integrateऔर initial value problem solver function का इस्तेमाल हुआ - तैयार code Matplotlib rendering को आधार बनाकर था, जिसे बाद में Manim के हिसाब से adjust किया गया
- SciPy के
- Lorenz equation की state को
x,y,zcoordinates से व्यक्त किया जाता है, और हर moment पर derivative निकालने वाले function से इसे लिखा जाता है - numerical solution का output time values और
x,y,zvalues के रूप में आता है, और Grant ने इसे आसान ढंग से handle करने के लिए एक wrapper रखा- SciPy की तरफ़ की notation में
yको output की तरह treat किया जाता है, जिससे थोड़ा confusion हो सकता है - state array और transposed form को उन्होंने अपने उपयोग के हिसाब से ढाला
- SciPy की तरफ़ की notation में
- initial condition को
(0, 0, 0)रखने पर सभी values 0 आईं, इसलिए यह उपयुक्त नहीं था; एक coordinate को 10 करने पर रोचक points बने - Manim में calculated points को curve में बदलने के लिए
set_points_as_cornersका उपयोग किया जाता है - axis coordinate system को Manim coordinate system में बदलने के लिए
coords_to_pointके short formc2pका उपयोग किया जाता है - Python का
*syntax iterable को function arguments के रूप में unpack करके भेजने के लिए इस्तेमाल होता है- उदाहरण में
x,y,zcoordinate lists को अलग करके function में भेजा गया
- उदाहरण में
पास-पास की initial conditions के अलग होने वाला scene
- Lorenz attractor visualization का मुख्य बिंदु यह है कि बहुत पास की initial conditions शुरू में लगभग एक जैसी चलती हैं, लेकिन बाद में अलग हो जाती हैं
- Grant initial conditions की एक list बनाते हैं और
zcoordinate को छोटेepsilonसे अलग सेट करते हैं- शुरुआत में 2 conditions से शुरू किया जाता है
- बाद में इसे 10 conditions तक बढ़ाया जाता है
- कई curves को रखने के लिए
VGroupका उपयोग किया जाता है- vectorized object group होने की जानकारी देने से rendering तेज़ हो सकती है
- हर curve के end point पर glow dot लगाया जाता है
GlowDotऐसा object है जिसे moving point को visually बेहतर दिखाने के लिए बनाया गया है- हर dot पर updater लगा होता है, जो हर frame में उसे curve के end point तक ले जाता है
zipका उपयोग dot और curve, या state और color जैसी corresponding lists पर parallel iteration के लिए किया जाता है- अगर दो list की length अलग हो, तो iteration छोटी list के ख़त्म होने पर रुक जाती है
color_gradientसे states की संख्या जितने colors बनाकर length match की जाती है
ShowCreationसे curve draw करते समय अगर default smoothing इस्तेमाल हो, तो वास्तविक time progression distort हो सकती है; इसलिए dynamics को ज्यों का त्यों दिखाने वाले हिस्सों में linear rate function का उपयोग किया जाता है- पास-पास की initial conditions शुरुआत में लगभग साथ चलती हैं, लेकिन समय बीतने पर वे पूरी तरह अलग positions में फैल जाती हैं
- Lorenz attractor को सिर्फ़ simple point या period नहीं, बल्कि एक ऐसे strange attractor के रूप में देखा जाता है जो किसी खास shape की ओर खिंचता है, फिर भी exact position initial conditions के प्रति sensitive रहती है
interactive mode के workaround code और scene effects
- डेमो में
globals().update(locals())जैसा “cursed” code भी आता है - यह code, Manim के IPython embed environment में function द्वारा outer scope के variables न देख पाने की समस्या से बचने के लिए एक अस्थायी workaround है
- सामान्य Python script में वही code ठीक से चलता है
- Manim के embedded interactive environment में
NameErrorआ सकता है - local variables को global variable dictionary में डालकर समस्या को टाला जाता है
- वास्तविक library code में ऐसा तरीका उचित नहीं होगा, लेकिन scene development के अस्थायी interactive session में इसका जोखिम अपेक्षाकृत कम है
- बेहतर तरीका यह है कि function को जिन variables की ज़रूरत है, उन्हें arguments के रूप में साफ़-साफ़ दिया जाए
- curve को समय के साथ गायब करना हो तो
FadeOutइस्तेमाल किया जा सकता हैplayकाrun_time, evolution time से match कर दिया जाए तो curve उसी अवधि में धीरे-धीरे transparent होता है
- dot के पीछे trail छोड़ने वाला effect
TracingTailसे बनाया जाता है- यह किसी एक dot का पीछा करने वाली tail बना सकता है
time_tracedको 1 सेकंड से 3 सेकंड करने पर लंबी tail दिखाई देती है- 10 dots में से हर एक पर tail लगाने से कई trajectories के फैलने का दृश्य और साफ़ दिखता है
3D camera और equations handling
- Manim scene default रूप से 3D coordinates रख सकते हैं, लेकिन ज़्यादातर 3Blue1Brown scenes शैक्षिक कारणों से 2D blackboard जैसे दिखते हैं
- Lorenz attractor के लिए 3D की ज़रूरत होती है, इसलिए 3D axes जोड़े जाते हैं
- 3D screen में depth बनाए रखने के लिए camera का धीरे-धीरे rotate या move होना उपयोगी है
- Grant current camera position को clipboard में save करने वाला shortcut इस्तेमाल करते हैं
frame.animate.reorient(...)के रूप में camera frame को किसी निश्चित position तक animate किया जाता है
- equations को LaTeX objects के रूप में scene में add किया जा सकता है
- MathPix का उपयोग करके screen पर मौजूद equation को OCR से पढ़कर LaTeX या SVG में बदला जा सकता है
- 3D scene में equation को screen पर fixed रखने के लिए
fix_in_frameइस्तेमाल किया जाता है
- LaTeX equation के specific variables को रंग दिया जा सकता है
- उदाहरण में
x,y,zको अलग-अलग colors दिए गए हैं - text को mathematical components में बाँटकर highlight या transform करने की सुविधा, mathematical explanation में उपयोगी है
- उदाहरण में
- Manim में string matching पर आधारित खास transform भी हैं
A^2,B^2जैसे terms अगली line में उसी string position तक स्वाभाविक रूप से move हो सकते हैं- string-based matching से anagram animation की तरह अक्षरों को corresponding position पर भेजने वाले effects भी बनाए जा सकते हैं
flash around,indicateजैसे animations से equation के किसी खास character या term को highlight किया जा सकता है
rendering और वास्तविक production workflow
- जब scene पसंद आ जाए, तो Manim command से Python file और scene name specify करके render किया जाता है
pre-runवह चरण है जिसमें पूरी animation को असल उपयोग से पहले एक बार जाँच लिया जाता है- कुल length का अनुमान लगाया जाता है
- यह बीच में rendering रुकने के बजाय पहले से errors पकड़ने में मदद करता है
Wfile में लिखने का option है, और Finder से जुड़े options macOS Finder में result file खोलने के लिए इस्तेमाल होते हैं- अंतिम परिणाम MP4 file के रूप में render होता है
- Grant आमतौर पर 4K में render करते हैं, इसलिए इसमें ज़्यादा समय लग सकता है
- render हुई file को बाद में editing tool में डालकर edit किया जाता है
- पहले Manim का उपयोग ज़्यादातर command line से scene render करके MP4 देखकर दोहराने वाले तरीके में होता था
- बाद में OpenGL implementation की ओर बदलाव के समय के आसपास interactive shell आधारित workflow आया, जिससे code highlight करके तुरंत result देखने वाला तरीका बना
- Grant का specific workflow, Sublime Text scripts और Terminus extension पर निर्भर है
- दूसरे text editors में भी इसी तरह का behavior imitate किया जा सकता है
- Visual Studio family के environment में भी इसी तरह का flow बनाया जा सकता है
- features खोजने के लिए example scenes, library के
animationfolder, और पुराने वीडियो code वाले3b1b/videosGitHub repository का उपयोग किया जा सकता है - Grant, Copilot की तुलना में ज़्यादा simple autocomplete को पसंद करते हैं
- Manim में अक्सर उन्हें पहले से पता होता है कि वे कौन-सा behavior चाहते हैं
- request को English की बजाय code में व्यक्त करना उन्हें अधिक natural लगता है
1 टिप्पणियां
Hacker News की राय
3B1B वाकई कमाल का काम कर रहा है
मुझे व्यक्तिगत रूप से उसके YouTube वीडियो से बहुत मदद मिली है, और काश हाई स्कूल या इंजीनियरिंग कॉलेज में गणित ऐसे पढ़ाया जाता
https://sinerider.com/ भी देखने लायक है
यह Grant Sanderson के 3B1B काम में कभी-कभी मदद करने वाले एक दोस्त द्वारा बनाया गया गेम है; LineRider की तरह ट्रैक बनाते हैं, लेकिन सूत्रों से — एक शानदार गणित-शिक्षा गेम
3B1B और SineRider, दोनों ने function composition की सहज समझ बनाने में सबसे बड़ा असर डाला
रियल-टाइम में rendering engine का bug पकड़ना और उसका workaround भी निकाल लेना वाला हिस्सा प्रभावशाली था
https://youtu.be/rbu7Zu5X1zI?feature=shared&t=693
फिर भी काम प्रभावशाली है
live में उसकी जगह और कारण पहचान कर workaround सोच लेना दिखाता है कि वह अपने tools को बेहतर बनाने में समय लगाता है, और यह कभी-कभार नहीं बल्कि सक्रिय रूप से करता है
यह अब भी काफ़ी शानदार है
मैं सोच रहा था कि नीचे दाईं ओर वाला Python interactive REPL कैसे काम कर रहा था
संपादन: लगता है यह पूरी तरह custom workflow है: https://github.com/3b1b/videos?tab=readme-ov-file#workflow
कई साल तक सिर्फ़ उसकी आवाज़ सुनकर और चेहरा न देखकर, जब चेहरा देखा तो ऐसा लगा जैसे अचानक uncanny valley के बीचोंबीच आ गया हूँ, काफ़ी मज़ेदार था
हाल के कुछ वीडियो में वह host, interviewer और narrator जैसी भूमिका निभा रहा था
veratasium की तरह जब creator कुछ वीडियो अपने ऊपर ले लेता है, वह भी थोड़ा अजीब लगता है
अगर सच में बड़ा reveal हो तो वह AvE होगा
उस समय वीडियो टिप्पणियों का बड़ा हिस्सा चैनल के नाम और icon के बारे में था, और सच में उसकी एक आँख वैसी ही दिखती है
फिर भी, ऐसे niche चैनलों के भीतर भी पसंद काफ़ी बँटी हुई लगती है
उसकी आवाज़ सच में बहुत अच्छी है। शांत और सुकून देने वाली, इसलिए घर का काम करते हुए भी उसे बैकग्राउंड में चलाकर कुछ सीखा जा सकता है
ऐसे creators सराहना के हकदार हैं
उसका नया hologram वीडियो उन सबसे बेहतरीन YouTube वीडियो में से है जो मैंने कभी देखे हैं
इस tool से bridging algorithm[1] पर एक व्याख्यात्मक वीडियो बनता तो कमाल होता
2016 से Pol.is जैसे tools का इस्तेमाल करने वाली participatory democracy प्रक्रियाओं में इस algorithm के उपयोग का मैं प्रशंसक रहा हूँ, और उसकी बुनियादी गणित की समझ बढ़ाने में योगदान देना चाहता था
अगर Summer of Math Exposition[2] के समय मुझे Manim के बारे में पता होता, तो मैं ज़रूर इसमें कूद पड़ता
[1]: https://bridging.systems/
[2]: https://some.3b1b.co/
मेरी website प्रोफ़ाइल में है, तो अगर कभी बनाओ तो social media पर लिंक भेज देना अच्छा होगा
Manim लिंक: https://github.com/3b1b/manim
उसके हर वीडियो में लगने वाला production effort चौंकाने वाला है। वह YouTube play button का हकदार है
ब्लॉग की तरह ही, अगर किस्मत साथ न दे तो उस मेहनत का बड़ा हिस्सा बर्बाद हो जाता है। लेकिन ब्लॉग को कम-से-कम कई बार सामने आने का मौका मिलता है। वह HN के शीर्ष पर पहुँच सकता है, X या कहीं और फैल सकता है। एक ही platform के भीतर भी आम तौर पर कई मौके होते हैं
इसके उलट, YouTube पर algorithm लगभग एक बार ही फ़ैसला करता है। अगर आपके पास पहले से बहुत बड़े subscriber base नहीं है, तो वह वीडियो को लगभग रैंडम तरीके से कुछ लोगों को दिखाता है, और अगर उन्होंने प्रतिक्रिया नहीं दी, तो वहीं बात खत्म