φυβλαςのβλογ
บล็อกของ phyblas



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

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

บทนี้จะเป็นเรื่องของการหมุนวัตถุ รวมถึงการบิดดัดวัตถุโดยใช้วิธีการคูณเมทริกซ์




การหมุนวัตถุด้วยเมธอด .rotate()

วัตถุคลาส MObject นั้นมีเมธอด .rotate() ซึ่งเอาไว้ใช้หมุนวัตถุตามมุมที่กำหนดเป็นเรเดียน

.rotate() สามารถใช้กับ .animate เพื่อทำเป็นภาพเคลื่อนไหวได้ ตัวอย่างเช่น ลองเอาข้อความมาหมุน 90 องศา
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('หมุน',color='#9ad6c0',size=5)
        self.play(
            text.animate.rotate(np.radians(90)),
            run_time=1.5
        )






การกำหนดจุดหมุน

หากไม่ได้กำหนดจุดหมุนจะเป็นการหมุนรอบกลางวัตถุ แต่หากต้องการกำหนดจุดหมุนก็ทำได้โดยใส่คีย์เวิร์ด about_point เช่น
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('หมุนหมุน',color='#c09ad6',size=3)
        point = np.array([3,1.5,0])
        self.play(
            text.animate.rotate(np.radians(120),about_point=point),
            run_time=1.5
        )






การเปลี่ยนแกนหมุน

ปกติแล้วถ้าไม่ได้กำหนดแกนหมุนจะเป็นการหมุนรอบแกน z คือหมุนในระนาบ xy สองมิติ แต่สามารถเปลี่ยนแกนหมุนให้ดูเป็นการหมุนในสามมิติได้

แกนหมุนกำหนดโดยคีย์เวิร์ด axis หากไม่ได้ใส่จะเป็นค่าตั้งต้นคือ [0,0,1] (ก็คือแกน z)

ลองเปลี่ยนแกนหมุนเป็นแกน x ดูได้ดังนี้
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('หมุนแนวตั้ง',color='#a9d69a',size=3)
        axis = np.array([1,0,0])
        self.play(
            text.animate.rotate(np.radians(-135),axis=axis),
            run_time=1.5
        )



อีกตัวอย่าง ลองใช้แกน y เป็นแกนหมุน
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('หมุนแนวนอน',color='#d6a49a',size=3)
        axis = np.array([0,1,0])
        self.play(
            text.animate.rotate(np.radians(-225),axis=axis),
            run_time=1.5
        )



หรืออาจลองตั้งแกนหมุนให้เอียง
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('แมงหมุน',color='#d69abc',size=3)
        text2 = mnm.Text('แมงมุม',color='#c6d69a',size=3)
        axis = np.array([0,1,1])
        self.play(
            text1.animate.rotate(np.radians(-90),axis=axis),
            text2.animate.rotate(np.radians(120),axis=axis),
            run_time=1.5
        )






คลาส Rotating

อีกวิธีที่ใช้ในการทำภาพเคลื่อนไหวหมุนวัตถุคือใช้คลาส Rotating ผลที่ได้จะคล้ายกับใช้ .animate.rotate() แต่ว่า Rotating จะเป็นการหมุนวัตถุไปเรื่อยๆจริงๆ ในขณะที่ .animate.rotate() นั้นจริงๆแล้วเป็นแค่การเปลี่ยนสภาพให้เลื่อนไปอยู่ในตำแหน่งหลังจากหมุนแล้วเท่านั้น ดังนั้นหากให้ .animate.rotate() เป็นมุม 360 องศาจะไม่มีการเคลื่อนไหวใดๆ แต่ถ้าใช้ Rotating จะเกิดการหมุนวนรอบจริงๆ

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

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('หมุนวนรอบ',color='#a89ad6',size=3)
        axis = np.array([0,1,0])
        self.play(
            mnm.Rotating(text,np.radians(-360),axis=axis),
            run_time=2
        )






เมธอด .flip()

กรณีที่หมุน 180 องศารอบแกน y คือมีแกนเป็น [0,1,0] อาจใช้เมธอด .flip()
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('พลิก',color='#9ad6c1',size=3)
        self.play(
            text.animate.flip(),
            run_time=1.5
        )






การคูณเมทริกซ์ด้วยคลาส ApplyMatrix

คลาส ApplyMatrix ใช้แปลงวัตถุโดยให้ตำแหน่งใหม่ถูกคูณด้วยเมทริกซ์ที่ใส่เข้ากับตำแหน่งเก่า

ให้ เป็นตำแหน่ง x,y เดิม

และ เป็นตำแหน่ง x,y ใหม่

ส่วน คือตัวเมทริกซ์ที่จะเอามาคูณ

การคำนวณจำเป็นดังนี้



ดังนั้นจะได้ค่าตำแหน่งใหม่เป็น



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

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('บิดเฉือน',color='#d09ad6',size=4)
        matr = [[1,0.5],
                [0.5,1]]
        self.play(
            mnm.ApplyMatrix(matr,text),
            run_time=1.5
        )



เกี่ยวกับเรื่องการคูณเมทริกซ์เพื่อแปลงภาพนั้นอาจอ่านรายละเอียดเพิ่มเติมได้ในเนื้อหาที่อธิบายการแปลงภาพด้วย opencv https://phyblas.hinaboshi.com/oshi07



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




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

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

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

หมวดหมู่

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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文