ต่อจาก
บทที่ ๕
ในบทที่แล้วได้แสดงถึงวิธีการทำภาพเคลื่อนไหวเบื้องต้นไปแล้ว สำหรับในบทนี้จะว่าด้วยเรื่องของการปรับขนาดวัตถุ
การย่อขยายวัตถุด้วยเมธอด .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
)
อ่านบทถัดไป >>
บทที่ ๗