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



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

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

ในบทที่แล้วได้แสดงถึงวิธีการทำภาพเคลื่อนไหวเบื้องต้นไปแล้ว สำหรับในบทนี้จะว่าด้วยเรื่องของการปรับขนาดวัตถุ




การย่อขยายวัตถุด้วยเมธอด .scale()

การย่อหรือขยายขนาดวัตถุทำได้โดยใช้เมธอด .scale() โดยใส่ค่าจำนวนเท่าของขนาดเดิมที่ต้องการขยาย

และเช่นเดียวกับเมธอด .shift() หรือเมธอดที่แนะนำไปก่อนหน้านี้ คือสามารถเติม .animate นำหน้าไปเป็น .animate.scale() แล้วใช้ใน self.play() ได้ ซึ่งก็จะเป็นการทำภาพเคลื่อนไหวซึ่งแสดงขั้นตอนการย่อขยาย

ตัวอย่าง ลองทำภาพเคลื่อนไหวแสดงการขยายขนาดวัตถุ ๗ เท่า
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('ขยาย',color='#EE7733')
        self.play(
            text.animate.scale(7),
            run_time=1.5
        )



สำหรับการย่อขนาดให้ใส่ค่าน้อยกว่า 1 ลงไป เช่น
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('ย่อส่วน',color='#bbff33')
        text.scale(8) # ขยายออกไปก่อน
        self.play(
            text.animate.scale(0.2),
            run_time=1.5
        )






การยืดเฉพาะแนวตั้งหรือนอนโดยใช้ .stretch

กรณีที่ต้องการยืดหรือหดแค่แนวตั้งหรือแนวนอนให้ใช้เมธอด .stretch() วิธีใช้ก็คล้ายกับ .scale แต่นอกจากใส่จำนวนเท่าที่จะยืดขยายแล้ว ให้ใส่เลขระบุแนวไปด้วย ถ้าแนวนอนเป็น 0 แนวตั้งเป็น 1

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

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('สูงขึ้น',color='#bb33dd')
        text2 = mnm.Text('กว้างขึ้น',color='#77bbdd')
        self.play(
            text1.animate.stretch(6,1),
            text2.animate.stretch(5,0),
            run_time=1.5
        )



บีบหด
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('แคบลง',color='#efa3b7')
        text2 = mnm.Text('เตี้ยลง',color='#daefa3',size=5)
        text1.stretch(6,0)
        self.play(
            text1.animate.stretch(0.1,0),
            text2.animate.stretch(0.2,1),
            run_time=1.5
        )






การกำหนดจุดใจกลางในการย่อขยายยืดหด

ปกติถ้าใช้ .scale หรือ .stretch() จะทำให้เกิดการย่อขยายหรือยืดหดจากจุดกึ่งกลางของภาพ แต่หากต้องการเปลี่ยนเป็นกำหนดจุดกึ่งกลางเอาเองก็ทำได้โดยใช้ใส่คีย์เวิร์ด about_point

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

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('ขยายไปทางขวาล่าง',color='#d3a3ef')
        text2 = mnm.Text('ยืดไปทางซ้าย',color='#efd3a3')
        point1 = np.array([-3,1.5,0])
        point2 = np.array([2,0,0])
        self.play(
            text1.animate.scale(2,about_point=point1),
            text2.animate.stretch(3,0,about_point=point2),
            run_time=1.5
        )






การเปลี่ยนขนาดภาพโดยกำหนดขนาดความกว้างหรือความสูงด้วย .set_width() หรือ .set_height()

หากต้องการเปลี่ยนขนาดภาพให้กว้างหรือยาวตามที่ต้องการก็ทำได้โดยใช้เมธอด .set_width() หรือ .set_height()

หากใช้ .set_width() จะเป็นการกำหนดความกว้างที่ต้องการ ส่วนความสูงก็จะถูกปรับให้ได้สัดส่วนตามนั้น

หากใช้ .set_height() จะเป็นการกำหนดความสูงที่ต้องการ ส่วนความกว้างก็จะถูกปรับให้ได้สัดส่วนตามนั้น

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

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('ขยายแล้วก็ย่อ',color='#ddffaa')
        point = np.array([0,-4,0])
        self.play(
            text.animate.set_width(12),
            run_time=1
        )
        self.play(
            text.animate.set_height(1,about_point=point),
            run_time=1.5
        )



กรณีที่ต้องการปรับขนาดเฉพาะแค่ความกว้างหรือความสูงอย่างใดอย่างหนึ่งโดยไม่เกี่ยวข้องกันให้ใส่ stretch=True
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('ปรับความกว้าง',color='#d3e3fa')
        text2 = mnm.Text('ปรับความสูง',color='#bffaa3')
        self.play(
            text1.animate.set_width(10,stretch=True),
            text2.animate.set_height(7,stretch=True),
            run_time=1.5
        )



หรืออาจเขียนอีกแบบ คือโดยใช้ .stretch_to_fit_width() และ .stretch_to_fit_height() เช่น ตัวอย่างที่แล้วอาจเขียนใหม่ได้เป็น
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('ปรับความกว้าง',color='#d3e3fa')
        text2 = mnm.Text('ปรับความสูง',color='#bffaa3')
        self.play(
            text1.animate.stretch_to_fit_width(10),
            text2.animate.stretch_to_fit_height(7),
            run_time=1.5
        )

ซึ่งก็จะได้ผลเหมือนเดิม




การพลิกภาพ

หากใช้ .stretch() แล้วใส่ค่าสัดส่วนเป็น -1 ก็จะเท่ากับเป็นการกลับภาพ เช่น
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text1 = mnm.Text('พลิกแนวนอน',color='#d3e3fa',size=3)
        text2 = mnm.Text('พลิกแนวตั้ง',color='#bffaa3',size=3)
        self.play(
            text1.animate.stretch(-1,0),
            text2.animate.stretch(-1,1),
            run_time=1.5
        )



ถ้าจะพลิกทั้งแนวตั้งและแนวนอนก็อาจใช้ .scale()
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('พลิกไม่ใช่พริก',color='#efa3eb',size=3)
        self.play(
            text.animate.scale(-1),
            run_time=2
        )





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





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

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

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

หมวดหมู่

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

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

สารบัญ

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

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

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文