วิธีสร้างแอนิเมชันของ 3Blue1Brown [วิดีโอ]
(youtube.com)- งาน visualization ของ 3Blue1Brown ถูกเขียนเป็นโค้ดด้วย ไลบรารี Python Manim ที่ Grant Sanderson สร้างขึ้น และวิดีโอนี้ติดตามเวิร์กโฟลว์การผลิตจริงร่วมกับ Ben Sparks
- Manim แยกออกเป็นเวอร์ชันสำหรับสภาพแวดล้อมการผลิตส่วนตัวของ Grant และ Manim Community ที่เสริมความแข็งแรงด้านเอกสาร เทสต์ และการรับมือ issue โดยผู้เริ่มต้นมักเหมาะกับเวอร์ชัน community
- การทำงานใกล้เคียงกับการเชื่อม Sublime Text เข้ากับเทอร์มินัล Python เพื่อรันชิ้นโค้ดได้ทันที และใช้ checkpoint paste แคชสถานะกลางทางเพื่อทดลองซ้ำ ๆ
- เดโมคำนวณ Lorenz attractor ด้วย SciPy จากนั้นผสมเส้นโค้ง จุด updater กล้อง 3D และเอฟเฟกต์ภาพติดตา เพื่อแสดงให้เห็นว่าเงื่อนไขเริ่มต้นที่ใกล้กันค่อย ๆ แยกออกจากกันอย่างไร
- ฉากสุดท้ายจะตรวจสอบข้อผิดพลาดและความยาวด้วย pre-run ก่อน แล้วจึงเรนเดอร์เป็น MP4 จากนั้นนำเข้าเครื่องมือตัดต่อเพื่อไปสู่กระบวนการผลิตวิดีโอ YouTube
จุดเริ่มต้นของ Manim และสองสายเวอร์ชัน
- เครื่องมือหลักของแอนิเมชัน 3Blue1Brown คือ ไลบรารี Python Manim ที่ Grant Sanderson สร้างขึ้นเอง
- Manim ประกอบทุกฉากด้วยการเขียนโปรแกรม และพัฒนามาเป็น เครื่องมือเฉพาะทาง ที่เข้ากับวิธีผลิตงานของ 3Blue1Brown
- Grant เขียนโค้ด Python ขึ้นช่วงใกล้จบปริญญาตรีเพื่อ visualize ฟังก์ชันคณิตศาสตร์ในรูปแบบการแปลงให้ดีขึ้น และโค้ดนี้เริ่มต้นพร้อมกับวิดีโอแรกของช่อง
- เมื่อวิดีโอมีมากขึ้น เครื่องมือก็ถูกปรับปรุง และเครื่องมือที่ดีขึ้นก็ทำให้สร้างวิดีโอที่ซับซ้อนยิ่งขึ้นได้ เป็นวงจรต่อเนื่องกัน
- เอฟเฟกต์ภาพในวิดีโอโฮโลแกรมล่าสุด หากเป็นเมื่อ 2–3 ปีก่อนคงทำได้ยากกว่านี้มาก แต่ด้วย การปรับปรุงเวิร์กโฟลว์ ตลอดหลายปี ทำให้ความยากในการผลิตลดลง
Manim Community และเวอร์ชันส่วนตัวของ Grant
- Grant เปิดเผยโค้ดที่ใช้ในวิดีโอและตัว Manim เองไว้บน GitHub มาโดยตลอด
- อย่างไรก็ตาม เมื่อการผลิตวิดีโอควบคู่ไปกับการดูแลโอเพนซอร์ส การตอบ issue และ Pull Request จึงยังไม่เพียงพอ
- ชุมชนจึง fork repository เพื่อสร้างเครื่องมือที่มั่นคงกว่า และเวอร์ชันนี้คือ Manim Community
- การตอบ issue และ Pull Request คล่องตัวกว่า
- มีเทสต์และเอกสารพร้อมกว่า
- โดยทั่วไปแนะนำสำหรับคนที่เริ่มต้นใหม่
- ในเดโมของวิดีโอใช้เวอร์ชันที่ Grant ใช้เองโดยตรง
- ในช่วงไม่กี่ปีที่ผ่านมาได้รับการปรับปรุงให้ interactive มากขึ้นและทำงานเร็วขึ้น
- ผู้ใช้ที่ให้ความสำคัญกับเอกสารและเทสต์จะเหมาะกับเวอร์ชัน community มากกว่า
วิธีผลิตงานด้วยการเขียนโค้ดแล้วตรวจดูทันที
- แต่ละฉากของ Manim เขียนเป็น Python class และโค้ดที่จะเรนเดอร์อยู่ในเมธอด
construct - เพิ่มวัตถุอย่างวงกลม สี่เหลี่ยม และข้อความลงบนหน้าจอ แล้วใช้เมธอด
playเพื่อรันแอนิเมชันอย่างWrite,Transform - วัตถุส่วนใหญ่โดยค่าเริ่มต้นจะอยู่กลางจอ และเปลี่ยนตำแหน่งด้วยการปรับอย่าง
to_edge,shift - สภาพแวดล้อมการทำงานของ Grant ใช้ Sublime Text ร่วมกับเทอร์มินัล Python
- เมื่อคัดลอกบรรทัดโค้ดไปรันในเทอร์มินัล จะสะท้อนผลกับฉากปัจจุบันทันที
- คีย์ลัดใน Sublime ช่วยอัตโนมัติกระบวนการคัดลอกโค้ดที่เลือกแล้วสั่งรัน
- เทอร์มินัลเชื่อมอยู่กับฉากปัจจุบัน จึงตรวจดูผลการแก้ไขได้ทันที
- สำหรับฉากยาว ๆ ความสามารถในการทดลองซ้ำเฉพาะช่วงกลางโดยไม่ต้องรันโค้ดทั้งหมดใหม่ทุกครั้งเป็นเรื่องสำคัญ
- ตัวอย่างวิดีโอโฮโลแกรมเป็นโค้ด Python ยาวที่สร้าง MP4 ความยาว 4 นาที 30 วินาที
- ฉากยาวใช้บริบทและตัวแปร local ร่วมกันจำนวนมาก การเก็บไว้ในไฟล์เดียวจึงมีประโยชน์
checkpoint pasteจะแคชสถานะของฉาก ณ ตำแหน่งคอมเมนต์ที่กำหนด ย้อนกลับไปสถานะนั้น แล้วรันโค้ดที่เลือก- วิธีนี้ใกล้เคียงกับเวิร์กโฟลว์ลูกผสมระหว่างไฟล์ข้อความล้วนกับ Jupyter notebook
ความรู้สึกพื้นฐานของแอนิเมชัน Manim
- หนึ่งในปรัชญาสำคัญของ Manim คือ “อะไรก็สามารถแปลงเป็นอะไรก็ได้”
- เช่น สามารถสร้างฉากที่แปลงตัวอักษรแรก
Hของข้อความhello worldให้เป็นวงกลมได้- แม้ไม่ได้เพิ่มวงกลมเข้าไปในฉากโดยตรง ก็สามารถกำหนดไว้เป็นเป้าหมายของการแปลงได้
- ข้อความเป็นกลุ่มของอักขระ จึงสามารถดึงอักขระแต่ละตัวออกมาปรับแต่งได้
- โดยค่าเริ่มต้น
Transformใช้ rate function ที่นุ่มนวล- ค่าเริ่มต้นคือ
smoothซึ่งดูเป็นการเคลื่อนไหวที่ลื่นไหลบนพื้นฐาน cubic bezier - หากใช้
linearจุดเริ่มและจุดจบจะรู้สึกแข็งกว่า - ในกรณีที่ต้องแสดงการดำเนินไปของเวลาทางคณิตศาสตร์ตามจริง จำเป็นต้องใช้
linear
- ค่าเริ่มต้นคือ
- การปรับรายละเอียดเหล่านี้สร้างความแตกต่างระหว่าง “ฉากที่ขยับได้” กับ “ฉากที่ดูดี”
- แอนิเมชันที่คุ้นเคยจากวิดีโอ 3Blue1Brown อย่าง
Writeก็เรียกใช้ได้ผ่านฟังก์ชัน built-in ของ Manim
เดโม Lorenz attractor
- ตัวอย่างหลักของเดโมคือ Lorenz attractor
- เป็นรูปทรงที่มาจากสมการเชิงอนุพันธ์สามมิติ
- กำหนดด้วยกฎเชิงกำหนดว่าจุดในพื้นที่ 3D เปลี่ยนไปตามเวลาอย่างไร
- เมื่อเปลี่ยนเงื่อนไขเริ่มต้นหลายแบบ จะได้ผลลัพธ์ทางภาพที่น่าสนใจ
- Grant ขอให้ ChatGPT เขียนฟังก์ชัน Python ตอนสร้างส่วนคำนวณทางคณิตศาสตร์
- ใช้
integrateของ SciPy และฟังก์ชันแก้ปัญหาค่าเริ่มต้น - โค้ดที่สร้างขึ้นอิงกับการเรนเดอร์ด้วย Matplotlib แล้วจึงปรับให้เข้ากับ Manim ภายหลัง
- ใช้
- สถานะของสมการ Lorenz มีพิกัด
x,y,zและแทนด้วยฟังก์ชันที่คำนวณอนุพันธ์ ณ ทุกขณะ - ผลลัพธ์จากการแก้เชิงตัวเลขออกมาเป็นค่าเวลาและค่า
x,y,zโดย Grant ใส่ wrapper ครอบไว้ให้จัดการง่ายขึ้น- การแทนค่าฝั่ง SciPy ปฏิบัติกับ
yคล้ายเอาต์พุต ทำให้อาจสับสนได้บ้าง - ปรับอาร์เรย์สถานะและรูปแบบ transpose ให้เป็นแบบที่ตนเองใช้งานสะดวก
- การแทนค่าฝั่ง SciPy ปฏิบัติกับ
- เมื่อกำหนดเงื่อนไขเริ่มต้นเป็น
(0, 0, 0)ค่าทั้งหมดออกมาเป็น 0 จึงไม่เหมาะสม และหลังเปลี่ยนพิกัดหนึ่งเป็น 10 ก็เกิดจุดที่น่าสนใจขึ้น - ใน Manim ใช้
set_points_as_cornersเพื่อเปลี่ยนจุดที่คำนวณได้ให้เป็นเส้นโค้ง - ใช้
c2pซึ่งเป็นชื่อย่อของcoords_to_pointเพื่อแปลงระบบพิกัดของแกนให้เป็นระบบพิกัดของ Manim - ไวยากรณ์
*ของ Python ใช้เมื่อต้องการคลี่ iterable แล้วส่งเป็นอาร์กิวเมนต์ของฟังก์ชัน- ในตัวอย่าง แยกรายการพิกัด
x,y,zแล้วส่งให้ฟังก์ชัน
- ในตัวอย่าง แยกรายการพิกัด
ฉากที่เงื่อนไขเริ่มต้นใกล้กันแยกออกจากกัน
- แก่นของการ visualize Lorenz attractor คือการที่เงื่อนไขเริ่มต้นที่อยู่ใกล้กันมาก ตอนแรกเคลื่อนที่คล้ายกัน แต่ภายหลังแยกออกจากกัน
- Grant สร้างรายการเงื่อนไขเริ่มต้น แล้วตั้งค่าให้พิกัด
zต่างกันเล็กน้อยด้วยepsilon- ตอนแรกเริ่มจาก 2 เงื่อนไข
- จากนั้นเพิ่มเป็น 10 เงื่อนไข
- ใช้
VGroupเพื่อเก็บเส้นโค้งหลายเส้น- หากบอกข้อมูลว่าเป็นกลุ่มวัตถุแบบเวกเตอร์ จะช่วยให้เรนเดอร์ได้เร็วขึ้น
- ที่ปลายเส้นโค้งแต่ละเส้นติด glow dot ไว้
GlowDotเป็นวัตถุที่สร้างไว้เพื่อแสดงจุดที่เคลื่อนไหวให้น่าดูทางสายตา- แต่ละจุดมี updater ติดอยู่ เพื่อย้ายไปยังปลายเส้นโค้งในทุกเฟรม
zipใช้เมื่อวนผ่านรายการที่สัมพันธ์กันแบบขนาน เช่น จุดกับเส้นโค้ง หรือสถานะกับสี- หากความยาวของสองรายการไม่เท่ากัน จะหยุดเมื่อถึงจุดสิ้นสุดของฝั่งที่สั้นกว่า
- ใช้
color_gradientสร้างสีจำนวนเท่ากับจำนวนสถานะเพื่อให้ความยาวตรงกัน
- เมื่อวาดเส้นโค้งด้วย
ShowCreationหากใช้ smoothing ค่าเริ่มต้น การดำเนินไปของเวลาจริงอาจถูกบิดเบือน ดังนั้นในส่วนที่ต้องแสดงพลวัตตามจริงจึงใช้ linear rate function - เงื่อนไขเริ่มต้นที่ใกล้กันในช่วงแรกแทบจะเคลื่อนไปด้วยกัน แต่เมื่อเวลาผ่านไปจะกระจายเหมือนอยู่คนละตำแหน่งโดยสิ้นเชิง
- Lorenz attractor ถูก扱เป็น strange attractor ที่ไม่ใช่เพียงจุดหรือคาบ แต่ถูกดึงเข้าสู่รูปทรงเฉพาะ ขณะเดียวกันตำแหน่งที่แน่นอนก็ไวต่อเงื่อนไขเริ่มต้น
โค้ดอ้อมในโหมด interactive และเอฟเฟกต์ฉาก
- ระหว่างเดโมมีโค้ด “ต้องคำสาป” อย่าง
globals().update(locals())ปรากฏขึ้น - โค้ดนี้เป็นทางเลี่ยงชั่วคราวเพื่อหลบปัญหาในสภาพแวดล้อม IPython embed ของ Manim ที่ฟังก์ชันมองไม่เห็นตัวแปรในสโคปภายนอก
- ในสคริปต์ Python ทั่วไป โค้ดเดียวกันทำงานได้ปกติ
- ในสภาพแวดล้อม interactive แบบ embedded ของ Manim อาจเกิด
NameError - จึงเลี่ยงปัญหาโดยใส่ตัวแปร local เข้าไปในพจนานุกรมตัวแปร global
- หากเป็นโค้ดไลบรารีจริง วิธีนี้ไม่เหมาะสม แต่ในเซสชัน interactive ชั่วคราวสำหรับพัฒนาฉาก ความเสี่ยงค่อนข้างน้อยกว่า
- วิธีที่ดีกว่าคือทำให้ฟังก์ชันรับตัวแปรที่ต้องใช้เป็นอาร์กิวเมนต์อย่างชัดเจน
- หากต้องการให้เส้นโค้งค่อย ๆ หายไปตามเวลา สามารถใช้
FadeOutได้- เมื่อปรับ
run_timeของplayให้ตรงกับ evolution time เส้นโค้งจะค่อย ๆ โปร่งใสลงตลอดช่วงเวลานั้น
- เมื่อปรับ
- เอฟเฟกต์ทิ้งภาพติดตาหลังจุดทำได้ด้วย
TracingTail- สร้างหางที่ตามจุดหนึ่งจุดได้
- หากเพิ่ม
time_tracedจาก 1 วินาทีเป็น 3 วินาที จะเห็นหางจากช่วงเวลาที่ยาวขึ้น - เมื่อติดหางให้จุดทั้ง 10 จุด จะเห็นการกระจายของหลายวิถีได้ชัดเจนขึ้น
กล้อง 3D และการจัดการสมการ
- ฉาก Manim โดยพื้นฐานสามารถมีพิกัด 3D ได้ แต่ฉากส่วนใหญ่ของ 3Blue1Brown ถูกจัดให้ดูเหมือนกระดาน 2D ด้วยเหตุผลด้านการสอน
- Lorenz attractor ต้องใช้ 3D จึงเพิ่มแกน 3D เข้าไป
- ในจอ 3D เอฟเฟกต์ที่กล้องหมุนหรือเคลื่อนที่ช้า ๆ มีประโยชน์ต่อการคงความรู้สึกเชิงลึก
- Grant ใช้คีย์ลัดที่บันทึกตำแหน่งกล้องปัจจุบันลงคลิปบอร์ด
- ใช้รูปแบบ
frame.animate.reorient(...)เพื่อทำแอนิเมชันเฟรมกล้องไปยังตำแหน่งเฉพาะ
- สามารถเพิ่มสมการเป็นวัตถุ LaTeX ในฉากได้
- หากใช้ MathPix จะ OCR สมการบนหน้าจอแล้วได้เป็น LaTeX หรือ SVG
- หากต้องการตรึงสมการไว้กับหน้าจอในฉาก 3D ให้ใช้
fix_in_frame
- ตัวแปรบางตัวในสมการ LaTeX สามารถใส่สีได้
- ในตัวอย่างกำหนดสีต่างกันให้
x,y,z - ความสามารถในการแยกข้อความออกเป็นองค์ประกอบทางคณิตศาสตร์เพื่อเน้นหรือแปลง มีประโยชน์ต่อการอธิบายคณิตศาสตร์
- ในตัวอย่างกำหนดสีต่างกันให้
- Manim ยังมี transform พิเศษที่จับคู่ตามสตริงด้วย
- พจน์อย่าง
A^2,B^2จะเลื่อนไปยังตำแหน่งของสตริงเดียวกันในบรรทัดถัดไปอย่างเป็นธรรมชาติ - การจับคู่ตามสตริงยังสร้างเอฟเฟกต์แบบแอนิเมชัน anagram ที่ส่งตัวอักษรไปยังตำแหน่งที่สอดคล้องกันได้
- พจน์อย่าง
- สามารถใช้แอนิเมชันอย่าง
flash around,indicateเพื่อเน้นอักขระหรือพจน์เฉพาะในสมการ
การเรนเดอร์และเวิร์กโฟลว์การผลิตจริง
- เมื่อพอใจกับฉากแล้ว จะใช้คำสั่ง Manim ระบุไฟล์ Python และชื่อฉากเพื่อเรนเดอร์
pre-runคือขั้นตอนการไล่ดูภาพรวมก่อนนำแอนิเมชันทั้งชุดไปใช้จริง- ประเมินความยาวทั้งหมด
- ช่วยจับข้อผิดพลาดล่วงหน้า แทนที่จะเจอระหว่างเรนเดอร์ช่วงกลาง
Wเป็นตัวเลือกสำหรับเขียนเป็นไฟล์ และตัวเลือกเกี่ยวกับ Finder ใช้สำหรับแสดงไฟล์ผลลัพธ์ใน macOS Finder- ผลลัพธ์สุดท้ายถูกเรนเดอร์เป็นไฟล์ MP4
- Grant มักเรนเดอร์เป็น 4K จึงอาจใช้เวลานานกว่า
- ไฟล์ที่เรนเดอร์แล้วจะถูกนำเข้าเครื่องมือตัดต่อเพื่อแก้ไขต่อ
- วิธีใช้ Manim แบบเดิมส่วนใหญ่คือวนซ้ำระหว่างการเรนเดอร์ฉากจาก command line แล้วเปิดดู MP4
- ต่อมาในช่วงใกล้เคียงกับการเปลี่ยนมาใช้ implementation แบบ OpenGL เกิดเวิร์กโฟลว์บน interactive shell ทำให้เปลี่ยนเป็นการไฮไลต์โค้ดแล้วดูผลลัพธ์ทันที
- เวิร์กโฟลว์เฉพาะของ Grant พึ่งพาสคริปต์ของ Sublime Text และส่วนขยาย Terminus
- ใน text editor อื่นก็สามารถเลียนแบบพฤติกรรมคล้ายกันได้
- สภาพแวดล้อมตระกูล Visual Studio ก็สามารถสร้าง flow รูปแบบเดียวกันได้
- เมื่อต้องการค้นหาฟีเจอร์ สามารถใช้ฉากตัวอย่าง โฟลเดอร์
animationของไลบรารี และ GitHub repository3b1b/videosที่มีโค้ดวิดีโอเก่า ๆ - Grant ชอบการเติมโค้ดอัตโนมัติแบบเรียบง่ายมากกว่า Copilot
- ใน Manim เขามักรู้อยู่แล้วว่าต้องการพฤติกรรมแบบใด
- การสื่อคำขอเป็นโค้ดให้ความรู้สึกเป็นธรรมชาติกว่าการบอกเป็นภาษาอังกฤษ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
3B1B กำลังทำงานที่ยอดเยี่ยมจริง ๆ
ส่วนตัวแล้วผมได้รับประโยชน์มหาศาลจากวิดีโอ YouTube ของเขา และอยากให้โรงเรียนมัธยมหรือคณะวิศวกรรมศาสตร์สอนคณิตศาสตร์กันแบบนี้
https://sinerider.com/ ก็น่าดูเหมือนกัน
เป็นเกมที่ทำโดยเพื่อนคนหนึ่งซึ่งบางครั้งช่วยงาน 3B1B ของ Grant Sanderson เป็นเกมการศึกษาคณิตศาสตร์ที่ยอดเยี่ยม คล้าย LineRider ที่ให้สร้างแทร็ก แต่สร้างด้วย สมการ
ทั้ง 3B1B และ SineRider มีอิทธิพลต่อความเข้าใจเชิงสัญชาตญาณของผมเรื่องการประกอบฟังก์ชันมากกว่าสิ่งอื่นใด
ฉากที่เขาเจอ บั๊ก ของเอนจินเรนเดอร์แบบเรียลไทม์ แล้วหาวิธีเลี่ยงได้ด้วยนั้นน่าประทับใจมาก
https://youtu.be/rbu7Zu5X1zI?feature=shared&t=693
ถึงอย่างนั้นก็ยังเป็นงานที่น่าประทับใจ
การที่เขารู้ตำแหน่งและสาเหตุ แล้วคิดวิธีเลี่ยงแบบไลฟ์ได้ แปลว่าเขาลงเวลาไปกับการปรับปรุงเครื่องมือของตัวเอง และไม่ได้ทำแค่นาน ๆ ครั้ง แต่ทำอย่างจริงจัง
ผมก็ยังมองว่าเท่อยู่ดี
ผมสงสัยว่า Python interactive REPL ที่อยู่มุมขวาล่างทำงานอย่างไร
แก้ไข: ดูเหมือนจะเป็นเวิร์กโฟลว์ที่ปรับแต่งเองทั้งหมด: https://github.com/3b1b/videos?tab=readme-ov-file#workflow
ตลกดีที่พอได้เห็นหน้า หลังจากฟังแต่เสียงมาหลายปีโดยไม่เคยเห็นหน้า จู่ ๆ ก็รู้สึกเหมือนตกลงไปกลาง uncanny valley
ในวิดีโอล่าสุดบางอัน เขาทำตัวเหมือนพิธีกร ผู้สัมภาษณ์ และผู้บรรยาย
กรณีที่ครีเอเตอร์มารับหน้าที่ทำบางวิดีโอแทนแบบ veratasium ก็รู้สึกแปลกเหมือนกัน
ถ้าจะนับการเปิดตัวครั้งใหญ่จริง ๆ ก็คงเป็น AvE
ตอนนั้นคอมเมนต์จำนวนมากในวิดีโอพูดถึงชื่อช่องและไอคอน และจริง ๆ แล้วตาข้างหนึ่งของเขาก็มีลักษณะแบบนั้น
แต่ถึงอย่างนั้น แม้ในหมู่ช่องเฉพาะทางแบบนี้ รสนิยมก็ดูจะแตกต่างกันพอสมควร
เสียง ของเขาดีมากจริง ๆ สงบและฟังสบาย ถึงเปิดไว้ข้าง ๆ ตอนทำงานบ้านก็ยังได้เรียนรู้อะไรบางอย่าง
ครีเอเตอร์แบบนี้สมควรได้รับการยอมรับ
วิดีโอโฮโลแกรม ล่าสุดจัดว่าเป็นหนึ่งในวิดีโอ YouTube ที่มีคุณภาพดีที่สุดเท่าที่ผมเคยดูมา
ถ้าใช้เครื่องมือนี้ทำวิดีโออธิบาย อัลกอริทึม bridging[1] ก็คงดีมาก
ผมเป็นแฟนวิธีที่อัลกอริทึมนี้ถูกใช้ในกระบวนการประชาธิปไตยแบบมีส่วนร่วมผ่านเครื่องมืออย่าง Pol.is มาตั้งแต่ปี 2016 และอยากช่วยเพิ่มความเข้าใจเกี่ยวกับคณิตศาสตร์ที่เป็นพื้นฐานของมัน
ถ้าผมรู้จัก Manim ตอนที่มี Summer of Math Exposition[2] ผมคงกระโดดลงไปทำแน่นอน
[1]: https://bridging.systems/
[2]: https://some.3b1b.co/
เว็บไซต์ของผมอยู่ในโปรไฟล์ ถ้าวันหนึ่งคุณทำขึ้นมา ช่วยส่งลิงก์มาทางโซเชียลมีเดียด้วยนะ
ลิงก์ Manim: https://github.com/3b1b/manim
ผมทึ่งกับ ปริมาณงานผลิต ที่ใส่ลงไปในวิดีโอแต่ละอันของเขา มหาศาลจริง ๆ สมควรได้ปุ่ม Play ของ YouTube
เช่นเดียวกับบล็อก ถ้าไม่มีโชคช่วย ความพยายามจำนวนมากก็สูญเปล่า แต่บล็อกอย่างน้อยยังมีโอกาสถูกเห็นหลายครั้ง อาจขึ้นหน้าแรก HN หรือแพร่บน X หรือที่อื่น ๆ ได้ แม้ในแพลตฟอร์มเดียวกันก็มักมีโอกาสหลายรอบ
ในทางกลับกัน บน YouTube อัลกอริทึมแทบจะตัดสินแค่ครั้งเดียว ถ้ายังไม่มีผู้ติดตามมหาศาลอยู่แล้ว ระบบจะสุ่มโชว์วิดีโอให้คนไม่กี่คนดู และถ้าพวกเขาไม่ตอบสนอง ก็จบแค่นั้น