ต่อจาก
บทที่ ๘
บทนี้จะเป็นเรื่องของการแปลงร่างจากวัตถุหนึ่งไปเป็นอีกวัตถุหนึ่ง
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
)
อ่านบทถัดไป >>
บทที่ ๑๐