φυβλαςのβλογ
phyblasのブログ



manim บทที่ ๑: บทนำ
เขียนเมื่อ 2021/03/12 00:01
แก้ไขล่าสุด 2022/02/02 20:56




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 แทน เป็นต้น

นอกจากนี้ยังมีความเปลี่ยนแปลงอีกมากมายหลายจุดที่ทำให้โค้ดของเวอร์ชันเก่าๆใช้งานในเวอร์ชันปัจจุบันโดยตรงไม่ได้ จำเป็นต้องแก้ให้เข้ากับเวอร์ชันใหม่ ดังนั้นตรงจุดนี้ก็ต้องระวังด้วยเช่นกัน หากศึกษาโค้ดจากเว็บที่เขียนไว้ตั้งแต่เวอร์ชันเก่า



อ่านบทถัดไป >> บทที่ ๒





-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> manim

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目次

日本による名言集
モジュール
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
機械学習
-- ニューラル
     ネットワーク
ภาษา javascript
ภาษา mongol
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  記事を検索

  おすすめの記事

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文