ต่อจาก
บทที่ ๙
บทนี้จะเป็นเรื่องของการหมุนวัตถุ รวมถึงการบิดดัดวัตถุโดยใช้วิธีการคูณเมทริกซ์
การหมุนวัตถุด้วยเมธอด .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
อ่านบทถัดไป >>
บทที่ ๑๑