φυβλαςのβλογ
phyblas的博客



manim บทที่ ๑๒: การใส่เส้น
เขียนเมื่อ 2021/03/12 00:12
แก้ไขล่าสุด 2021/09/28 16:42

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

ตั้งแต่บทนี้ไปจนถึงบทที่ ๑๕ จะเป็นเรื่องของการสร้างวัตถุที่เป็นรูปร่างต่างๆ โดยในบทนี้จะเริ่มจากการใส่เส้นตรงและเส้นโค้ง




การวาดเส้นตรง

วัตถุเส้นตรงสามารถสร้างได้ด้วยคลาส Line โดยค่าที่ต้องใส่คือจุดต้นกับจุดปลาย

ลองดูตัวอย่างแสดงการวาดเส้นขึ้นมา
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-5.5,3.5,0])
        p2 = np.array([6.5,-2.5,0])
        sen = mnm.Line(p1,p2)
        self.play(
            mnm.Write(sen),
            run_time=1.5
        )






การปรับตำแหน่งจุดปลายของเส้น

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

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

class Manimala(mnm.Scene):
    def construct(self):
        # จุดต้นปลายเดิม
        p1 = np.array([-5,3,0])
        p2 = np.array([5,-3,0])
        # จุดต้นปลายใหม่
        p3 = np.array([7,0,0])
        p4 = np.array([-7,0,0])
        # สร้างเส้น
        sen = mnm.Line(p1,p2)
        self.play(
            sen.animate.set_points_by_ends(p3,p4),
            run_time=1.5
        )






การปรับขอบของเส้น

ความหนา, สี และความทึบแสงของเส้นสามารถกำหนดได้โดยคีย์เวิร์ด stroke_width, stroke_color (อาจใช้ color เฉยๆแทนได้) และ stroke_opacity ตามลำดับ

นอกจากนี้ยังสามารถปรับค่าภายหลังได้ด้วยเมธอด .set_stroke() ซึ่งสามาถใช้กับ .animation เพื่อทำเป็นภาพเคลื่อนไหวได้

ตัวอย่าง ลองสร้างเส้นโดยกำหนดค่าความหนา, สี และความทึบแสงตั้งต้น จากนั้นก็ทำภาพเคลื่อนไหวให้ค่าเหล่านี้เปลี่ยนแปลงด้วย .animation.set_stroke()
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([6,-3,0])
        p2 = np.array([-6,3,0])
        sen = mnm.Line(p1,p2,
                       stroke_width=10,
                       stroke_color='#71ff92',
                       stroke_opacity=0.2)
        self.play(
            sen.animate.set_stroke(width=70,
                                   color='#b86fe7',
                                   opacity=1),
            run_time=1.5
        )






การวาดเส้นโค้งส่วนของวงกลม

คลาส Line นั้นนอกจากใช้สร้างเส้นตรงแล้วก็ยังใช้สร้างเส้นโค้งได้ โดยใส่มุมความโค้งของเส้นได้ที่คีย์เวิร์ด path_arc

มุมโค้งของเส้นสามารถปรับได้ภายหลังด้วยเมธอด .set_path_arc() ซึ่งก็สามารถใช้กับ .animate เพื่อทำเป็นภาพเคลื่อนไหวได้

ตัวอย่าง ลองทำภาพเคลื่อนไหวที่มีการเปลี่ยนแปลงความโค้งของเส้นไปเรื่อยๆ
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([5,1,0])
        p2 = np.array([-5,-1,0])
        sen = mnm.Line(p1,p2,
                       path_arc=np.radians(120),
                       color='#8583e1',
                       stroke_width=20) 
        self.play(
            sen.animate.set_path_arc(-np.radians(80)),
            run_time=1.5
        )






การวาดเส้นประ

คลาส DashedLine ไว้ใช้วาดเส้นประ วิธีการใช้คล้าย Line แต่จะได้เส้นออกมาเป็นเส้นประ

ความถี่ของเส้นประกำหนดได้ที่คีย์เวิร์ด dash_length

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

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([6.5,3,0])
        p2 = np.array([-6.5,-2.5,0])
        senpra = mnm.DashedLine(
            p1,p2,
            dash_length=0.2,
            color='#d4b1f2',
            stroke_width=19
        )
        self.play(
            mnm.Write(senpra),
            run_time=1.5
        )



อีกตัวอย่าง ลองสร้างภาพเคลื่อนไหวที่เปลี่ยนระหว่าง dash_length มากไปน้อยเพื่อเปรียบเทียบ
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([6,3.5,0])
        p2 = np.array([-6,-3.5,0])
        senpra1 = mnm.DashedLine(
            p1,p2,
            dash_length=0.8
        )
        senpra2 = mnm.DashedLine(
            p1,p2,
            dash_length=0.1
        )
        self.play(
            mnm.Transform(senpra1,senpra2),
            run_time=1.5
        )



สัดส่วนของเส้นต่อช่องว่างกำหนดได้ที่คีย์เวิร์ด positive_space_ratio ยิ่งค่ามากยิ่งมีส่วนของเส้นมาก ช่องว่างน้อย

ตัวอย่าง เปรียบเทียบระหว่าง positive_space_ratio น้อยกับมาก
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([5.5,-3.5,0])
        p2 = np.array([-6,3.5,0])
        senpra1 = mnm.DashedLine(
            p1,p2,
            positive_space_ratio=0.2
        )
        senpra2 = mnm.DashedLine(
            p1,p2,
            positive_space_ratio=0.8
        )
        self.play(
            mnm.Transform(senpra1,senpra2),
            run_time=1.5
        )






การวาดกากบาทขีดทับ

หากมีวัตถุที่ต้องการจะขีดกากบาททับก็ทำได้โดยสร้างคลาส Cross แล้วใส่วัตถุที่ต้องการกา

กากบาทที่สร้างขึ้นมานั้นสามารถปรับสีและความกว้างของเส้นได้ด้วยเมธอด .set_stroke()

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

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('ภาษี',size=7,color='#c27bff')
        kakabat = mnm.Cross(text)
        kakabat.set_stroke(color='#77ffaa',width=30)
        self.add(text)
        self.play(
            mnm.Write(kakabat),
            run_time=1
        )






การวาดเส้นขีดด้านใต้

คลาส Underline เอาไว้ใช้ขีดเส้นด้านใต้วัตถุ หากใช้กับวัตถุที่เป็นกลุ่มเช่นตัวหนังสือสามารถเลือกขีดแค่เฉพาะบางส่วนได้

ตัวอย่างการใช้ เริ่มจากขีดทั้งหมดก่อนแล้วเปลี่ยนเป็นขีดเฉพาะบางส่วน
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        text = mnm.Text('ความหมาย',size=4,color='#ff7bf1')
        # เส้นขีดทั้งหมด
        sentai1 = mnm.Underline(text)
        sentai1.set_stroke(color='#f2a756',width=20)
        # เส้นขีดเฉพาะส่วน
        sentai2 = mnm.Underline(text[4:7])
        sentai2.set_stroke(color='#f2567b',width=30)
        self.add(text)
        self.play(
            mnm.FadeTransform(sentai1,sentai2),
            run_time=1
        )
        self.wait(0.5)





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





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

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

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

หมวดหมู่

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

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

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