manim คืออะไร ใช้ทำอะไรได้
manim เป็นมอดูลของไพธอนที่เอาไว้ใช้ทำภาพเคลื่อนไหวโดยเน้นไปที่การอธิบายสมการหรือภาพทางคณิตศาสตร์ เช่นวาดรูปร่างต่างๆพร้อมใส่สมการอธิบายประกอบรวมถึงวาดกราฟ ทั้งหมดถูกออกแบบมาให้แสดงการเคลื่อนไหวได้สะดวก และทำได้ทั้งในสองมิติและสามมิติ
โดยภาพรวมแล้วโค้ด manim นั้นเขียนง่ายกะทัดรัด เขียนแค่สั้นๆไม่ซับซ้อนมากก็สามารถสร้างภาพเคลื่อนไหวสวยๆออกมาได้แล้ว
ภาพที่สร้างขึ้นมานี้อาจทำเป็นวีดีโอไว้อัปลง youtube หรือ facebook หรือนำไปใส่ลงในสไลด์ ppt เวลานำเสนองานหรือสอนหนังสือ หรือทำเป็นภาพ gif แปะลงในเว็บ ฯลฯ
เว็บหลักอธิบายการใช้งานของ manim >>
https://3b1b.github.io/manim/index.html
หน้าหลักของ manim ใน github >>
https://github.com/3b1b/manim
สำหรับตัวอย่างภาพที่สร้างจาก manim พร้อมโค้ดประกอบสามารถเข้าไปดูได้ที่ >>
manim example scenes
วิธีการติดตั้ง
การติดตั้งทำได้ง่ายโดยใช้ pip
pip install manim
นอกจากนี้แล้วยังต้องมีการติดตั้ง
OpenGL (ตัวสร้างภาพ)
FFmpeg (ตัวเขียน mp4) รวมถึงตัวเขียน
LaTeX ไว้ในเครื่องด้วย ซึ่งรายละเอียดจะไม่กล่าวถึงในนี้
หลังติดตั้งเสร็จลองรันคำสั่ง manimgl ในคอมมานด์ไลน์
manimgl
หากรันแล้วมีหน้าต่างสีดำแบบนี้ปรากฏขึ้นโดยไม่มีปัญหาอะไรก็แสดงว่าการติดตั้งเรียบร้อย
(ภาพนี้เป็นใน mac แต่ถ้าเป็นใน windows ลักษณะหน้าต่างก็จะต่างออกไป)
เริ่มต้นการใช้งาน
เพื่อแสดงการใช้งาน ขอเริ่มจากยกตัวอย่าง โดยให้ทำการสร้างไฟล์ kumo.py สั้นๆง่ายๆขึ้นมาดังนี้
import manimlib as mnm
class Kumodesuga(mnm.Scene):
def construct(self):
text = mnm.Text('แมงมุมแล้วไง\n\nข้องใจเหรอคะ?',size=2.5,color='#dad1e2')
self.play(mnm.Write(text),run_time=2)
จากนั้นก็ไปที่คอมมานด์ไลน์ พิมพ์คำสั่ง manimgl ตามด้วยชื่อไฟล์
manimgl kumo.py
แล้วก็จะปรากฏหน้าต่างที่มีภาพเคลื่อนไหวที่แสดงการเขียนข้อความแบบนี้ออกมา
กรอบที่ปรากฏจะมีขนาดเท่ากับค่าตั้งต้น เป็นจอขนาดเล็ก 640×360
(อย่างไรก็ตาม ภาพที่แสดงเป็นตัวอย่างในหน้านี้ได้จากการทำเป็น gif และได้ย่อส่วนลงเป็น 480×270 เพื่อให้แสดงผลง่ายและประหยัดพื้นที่)
ขนาดหน้าจอสามารถคลิกลากเพื่อยืดหดได้ตามที่ต้องการ แต่สัดส่วนของภาพก็จะเปลี่ยนไปตามสัดส่วนหน้าต่างด้วย
หากกด q หรือ esc ก็จะเป็นการปิดหน้าต่างลง
ไฟล์ .py ที่ใช้รันในคำสั่ง manimgl นี้จะต้องประกอบด้วยส่วนนิยามคลาสที่รับทอดจากคลาส Scene โดยตั้งชื่อคลาสเป็นอะไรก็ได้ตามที่ต้องการ (ในตัวอย่างนี้ตั้งเป็น Kumodesuga)
และภายในส่วนนิยามคลาสนั้นจะต้องมีเขียนนิยามเมธอด construct ซึ่งจะเป็นตัวกำหนดเนื้อหารายละเอียดของภาพที่ต้องการสร้าง
ตัวอย่างนี้อธิบายคร่าวๆง่ายๆก็คือสร้างออบเจ็กต์ข้อความ text (จากคลาส Text) โดยกำหนดขนาด size=2.5 สี color='#dad1e2' จากนั้นใช้เมธอด self.play() เพื่อเขียน text ตัวนี้โดยใช้ Write และกำหนดเวลาการเคลื่อนไหวเป็น run_time=2 คือ ๒ วินาที
สำหรับฟังก์ชันและเมธอดและคลาสต่างๆที่เขียนอยู่ในโค้ดตัวอย่างนี้จะอธิบายรายละเอียดในบทถัดๆไป แต่จากตัวอย่างนี้ก็จะเห็นได้ว่าแค่เขียนสั้นๆเท่านี้ก็ได้ภาพเคลื่อนไหวออกมาแล้ว เป็นมอดูลที่ใช้งานง่ายและสะดวกมากทีเดียว
ส่วนรายละเอียดของคำสั่ง manimgl นั้นจะอธิบายใน
บทที่ ๒
หมายเหตุข้อควรระวัง
หากไปดูตัวอย่างในเว็บไซต์หลักของ manim จะเห็นว่าเขาใช้วิธีการ import * แบบนี้
from manimlib import *
แต่วิธีการ import * นั้นไม่ใช่วิธีที่ที่ดีนัก ที่จริงนักเขียนไพธอนจำนวนมากเลี่ยงการใช้วิธีนี้เพราะทำให้โค้ดเข้าใจยาก และทำให้เกิดความยุ่งยากมากขึ้นในการ debug
ดังนั้นในที่นี้จะใช้การ import as แบบนี้แทน
import manimlib as mnm
โดยข้อแตกต่างก็คือจะทำให้ทุกฟังก์ชันหรือคลาสของ manim ต้องเติม mnm. นำหน้า
เช่นถ้าไปดูตัวอย่างที่เว็บหลักจะเห็นว่า Scene, Text, Write ที่ใช้ในตัวอย่างนั้นเขาเขียนลงไปตรงๆแบบนี้
Scene
Text
Write
แต่ในบทเรียนนี้จะขอเขียนแบบนี้ทั้งหมด
mnm.Scene
mnm.Text
mnm.Write
โดยมี mnm. นำหน้า ซึ่งข้อดีคือทำให้แยกแยะได้ว่าออบเจ็กต์พวกนี้มาจากมอดูล manim ลดปัญหาความสับสน
ดังนั้นหากนำโค้ดมาจากเว็บหลัก จะต้องทำการเติม mnm. ลงด้านหน้าออบเจ็กต์ต่างๆจากมอดูล manim ทั้งหมด ไม่เช่นนั้นจะเกิดข้อผิดพลาดได้
นอกจากนี้ manim ยังมีความเปลี่ยนแปลงไปมากเมื่ออัปเวอร์ชันใหม่ ทำให้หากดูตัวอย่างเวอร์ชันเก่าๆจะเห็นว่าโค้ดที่เขียนมีความต่างออกไปพอสมควร เช่นในส่วน import จะถูกเขียนเป็นแบบนี้
from manimlib.imports import *
แต่ในเวอร์ชันปัจจุบัน .imports ถูกยกเลิกไปแล้ว จากที่เดิมเขียนเป็น manimlib.imports ก็จะเหลือแค่เป็น manimlib เฉยๆ ดังนั้นหากเอาโค้ดจากพวกตัวอย่างเก่าๆก็จำเป็นต้องปรับแก้ตามนั้นด้วย
และยังเรื่องที่ว่าในตัวอย่างเก่าอาจมีการใช้คลาส TextMobject และ TexMobject ซึ่งปัจจุบันเลิกใช้และเปลี่ยนมาเป็น TexText กับ Tex แทน เป็นต้น
นอกจากนี้ยังมีความเปลี่ยนแปลงอีกมากมายหลายจุดที่ทำให้โค้ดของเวอร์ชันเก่าๆใช้งานในเวอร์ชันปัจจุบันโดยตรงไม่ได้ จำเป็นต้องแก้ให้เข้ากับเวอร์ชันใหม่ ดังนั้นตรงจุดนี้ก็ต้องระวังด้วยเช่นกัน หากศึกษาโค้ดจากเว็บที่เขียนไว้ตั้งแต่เวอร์ชันเก่า
อ่านบทถัดไป >>
บทที่ ๒