φυβλαςのβλογ
phyblas的博客



manim บทที่ ๙: การแปลงร่างไปมาระหว่างวัตถุ
เขียนเมื่อ 2021/03/12 00:09
แก้ไขล่าสุด 2021/09/28 16:42

ต่อจาก บทที่ ๘

บทนี้จะเป็นเรื่องของการแปลงร่างจากวัตถุหนึ่งไปเป็นอีกวัตถุหนึ่ง




Transform

คลาส Transform ไว้ใช้แปลงจากวัตถุหนึ่งไปเป็นอีกวัตถุหนึ่ง โดยจะมีการพิจารณาส่วนต่างแล้วหาวิธีการแปลงที่เหมาะสมโดยอัตโนมัติ

ตัวอย่างการใช้
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('พีคาชู',color='#88ffbb',size=3)
        text2 = mnm.Text('ไรชู',color='#bb88ff',size=3)
        self.play(
            mnm.Transform(text1,text2),
            run_time=2
        )



กรณีที่ต้องการให้หลังแปลงแล้ววัตถุเดิมยังคงอยู่ด้วยก็ทำได้โดยใช้คู่กับเมธอด .copy() แบบนี้
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.VGroup(
            mnm.Text('อีวุย',color='#f8c991',size=1.8),
            mnm.Text('เชาเวอร์ส',color='#91c6f8',size=2.2),
            mnm.Text('ธันเดอร์ส',color='#f8f491',size=2.2),
            mnm.Text('บูสเตอร์',color='#f8a291',size=2.2),
        )
        text.arrange(mnm.DOWN)
        self.add(text[0])
        self.play(
            mnm.Transform(text[0].copy(),text[1]),
            run_time=1
        )
        self.play(
            mnm.Transform(text[0].copy(),text[2]),
            run_time=1
        )
        self.play(
            mnm.Transform(text[0].copy(),text[3]),
            run_time=1
        )



ลองเทียบกับกรณีที่ไม่ใช้ .copy() แบบนี้ตัวเดิมจะหายไป แล้วกลายไปเป็นตัวใหม่
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.VGroup(
            mnm.Text('เมตามอน',color='#e191f8',size=1.8),
            mnm.Text('ฟรีเซอร์',color='#91c6f8',size=2.2),
            mnm.Text('ธันเดอร์',color='#f8f491',size=2.2),
            mnm.Text('ไฟร์',color='#f8a291',size=2.2),
        )
        text.arrange(mnm.DOWN)
        self.add(text[0])
        self.play(
            mnm.Transform(text[0],text[1]),
            run_time=1
        )
        self.play(
            mnm.Transform(text[0],text[2]),
            run_time=1
        )
        self.play(
            mnm.Transform(text[0],text[3]),
            run_time=1
        )






ReplacementTransform

คลาส ReplacementTransform จะคล้ายกับ Transform แต่ต่างกันตรงที่หลังจากแปลงแล้วตัววัตถุเดิมจะไม่ได้ย้ายไปตำแหน่งใหม่จริงๆแต่ยังอยู่ที่เดิม แค่ถูกซ่อนไว้ แล้วแสดงวัตถุอีกตัวที่อยู่ในตำแหน่งใหม่แทน

ลองเขียนให้ได้ผลคล้ายตัวอย่างที่แล้วโดยใช้ ReplacementTransform ได้ดังนี้
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.VGroup(
            mnm.Text('๑',color='#f6b3c9',size=4),
            mnm.Text('๒',color='#beb3f6',size=4),
            mnm.Text('๓',color='#b3f6cb',size=4),
            mnm.Text('๔',color='#f6f4b3',size=4),
        )
        text.arrange_in_grid(n_cols=2)
        self.add(text[0])
        self.play(
            mnm.ReplacementTransform(text[0],text[1]),
            run_time=1
        )
        self.play(
            mnm.ReplacementTransform(text[1],text[2]),
            run_time=1
        )
        self.play(
            mnm.ReplacementTransform(text[2],text[3]),
            run_time=1
        )



แต่ถ้าหากใช้คู่กับ .copy() แบบนั้นผลของ ReplacementTransform กับ Transform จะไม่ต่างกัน




FadeTransform

FadeTransform จะคล้ายกับ ReplacementTransform แต่ต่างกันตรงที่ใช้วิธีการปรับความทึบแสงให้ค่อยๆเลือนหายไปแล้วตัวใหม่ค่อยๆปรากฏ

ลองดูตัวอย่าง เปรียบเทียบกับกรณี ReplacementTransform จะเห็นว่าต่างกันที่รูปแบบการแปลง
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.VGroup(
            mnm.Text('๑',color='#f6b3c9',size=4),
            mnm.Text('๒',color='#beb3f6',size=4),
            mnm.Text('๓',color='#b3f6cb',size=4),
            mnm.Text('๔',color='#f6f4b3',size=4),
        )
        text.arrange_in_grid(n_cols=2)
        self.add(text[0])
        self.play(
            mnm.FadeTransform(text[0],text[1]),
            run_time=1
        )
        self.play(
            mnm.FadeTransform(text[1],text[2]),
            run_time=1
        )
        self.play(
            mnm.FadeTransform(text[2],text[3]),
            run_time=1
        )






TransformMatchingShapes

TransformMatchingShapes จะคล้ายกับ FadeTransform แต่จะมีการเทียบหาส่วนประกอบที่ตรงกันแล้วทำการย้ายแปลงตามความเหมาะสม

ตัวอย่าง
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('ยาดอน',color='#ff9ada',size=4)
        text2 = mnm.Text('ยาโดรัน',color='#c09aff',size=4)
        text3 = mnm.Text('ยาโดคิง',color='#ff9ab9',size=4)
        text4 = mnm.Text('คิงดรา',color='#9ac2ff',size=4)
        self.play(
            mnm.TransformMatchingShapes(text1,text2),
            run_time=1
        )
        self.play(
            mnm.TransformMatchingShapes(text2,text3),
            run_time=1
        )
        self.play(
            mnm.TransformMatchingShapes(text3,text4),
            run_time=1
        )
        self.wait(0.5)



สำหรับวัตถุ Tex อาจใช้คลาส TransformMatchingTex ซึ่งจะอธิบายในบทที่ ๑๗




การแปลงไปหมุนไป

คลาส Transform สามารถใส่คีย์เวิร์ด path_arc เพื่อทำให้หมุนไปด้วยเวลาที่ย้ายไปตำแหน่งใหม่

การใส่ให้ใส่ค่ามุมที่จะหมุนเป็นหน่วยเรเดียน ตัวอย่างเช่นลองให้หมุนทำมุม 90 องศา
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.VGroup(
            mnm.Text('ก',color='#f6b3c9',size=5),
            mnm.Text('ข',color='#beb3f6',size=5),
            mnm.Text('ค',color='#b3f6cb',size=5),
            mnm.Text('ง',color='#f6f4b3',size=5),
        )
        text.arrange_in_grid(n_cols=2)
        self.add(text[0])
        self.play(
            mnm.Transform(text[0],text[1],path_arc=np.radians(90)),
            run_time=1
        )
        self.play(
            mnm.Transform(text[0],text[2],path_arc=np.radians(90)),
            run_time=1
        )
        self.play(
            mnm.Transform(text[0],text[3],path_arc=np.radians(90)),
            run_time=1
        )



อนึ่ง ในที่นี้ใช้ฟังก์ชัน np.radians() ของ numpy ช่วยในการแปลงจากองศาเป็นเรเดียน

กรณีที่ path_arc เป็น -180 องศา (-π) อาจใช้ ClockwiseTransform แทนได้ เช่น
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.VGroup(
            mnm.Text('ด',color='#f6b3c9',size=5),
            mnm.Text('ต',color='#beb3f6',size=5),
            mnm.Text('ถ',color='#b3f6cb',size=5),
            mnm.Text('ท',color='#f6f4b3',size=5),
        )
        text.arrange_in_grid(n_cols=2)
        self.add(text[0])
        self.play(
            mnm.ClockwiseTransform(text[0],text[1]),
            run_time=1
        )
        self.play(
            mnm.ClockwiseTransform(text[0],text[2]),
            run_time=1
        )
        self.play(
            mnm.ClockwiseTransform(text[0],text[3]),
            run_time=1
        )



ในทำนองเดียวกัน กรณีที่ path_arc เป็น 180 องศา (-π) อาจใช้ CounterclockwiseTransform แทนได้ ดังนี้
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.VGroup(
            mnm.Text('บ',color='#f6b3c9',size=5),
            mnm.Text('ป',color='#beb3f6',size=5),
            mnm.Text('ผ',color='#b3f6cb',size=5),
            mnm.Text('พ',color='#f6f4b3',size=5),
        )
        text.arrange_in_grid(n_cols=2)
        self.add(text[0])
        self.play(
            mnm.CounterclockwiseTransform(text[0],text[1]),
            run_time=1
        )
        self.play(
            mnm.CounterclockwiseTransform(text[0],text[2]),
            run_time=1
        )
        self.play(
            mnm.CounterclockwiseTransform(text[0],text[3]),
            run_time=1
        )






การสลับตำแหน่งหลายตัวด้วย CyclicReplace

คลาส CyclicReplace เอาไว้ย้ายตำแหน่งสลับระหว่างวัตถุ ๒ ตัวขึ้นไป

ตัวอย่างการใช้กับวัตถุ ๓ ตัว
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('๑',color='#d1afe6',size=7)
        text2 = mnm.Text('๒',color='#afe6d7',size=7)
        text3 = mnm.Text('๓',color='#d3e6af',size=7)
        vg = mnm.VGroup(text1,text2,text3)
        vg.arrange(mnm.RIGHT)
        self.play(
            mnm.CyclicReplace(text1,text2,text3),
            run_time=1.5
        )



สามารถวนกลับไปมาหลายรอบจนกลับมาจุดเดิมได้ เช่นลองใช้วัตถุ ๔ ตัว วน ๔ ครั้งจนกลับมาที่เดิม
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.VGroup(
            mnm.Text('หนึ่ง',color='#e6afdc',size=2),
            mnm.Text('สอง',color='#afcde6',size=2),
            mnm.Text('สาม',color='#c9e6af',size=2),
            mnm.Text('สี่',color='#e6c9af',size=2),
        )
        text.arrange_in_grid(n_cols=2)
        for i in range(4):
            self.play(
                mnm.CyclicReplace(*text),
                run_time=1
            )





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





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

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

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

หมวดหมู่

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

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

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