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



maya python เบื้องต้น บทที่ ๘: สร้างรูปทรงต่างๆให้หลากหลาย
เขียนเมื่อ 2016/03/10 17:31
แก้ไขล่าสุด 2021/09/28 16:42
ในบทแรกสุดได้แนะนำรูปทรงซึ่งง่ายสุดไปสองอย่างแล้ว นั่นคือทรงสี่เหลี่ยมและทรงกลม สำหรับในตอนนี้จะมาลองสร้างวัตถุอื่นๆหลากหลายขึ้นไปอีก นอกจากนี้จะแนะนำองค์ประกอบอื่นๆอีกมากขึ้น

รูปทรงอื่นๆทีจะแนะนำนั้นได้แก่
polyCylinder() ทรงกระบอก
polyCone() ทรงกรวย
polyPrism() ทรงปริซึม
polyPyramid() ทรงพีรามิด
polyPlane() พื้นระนาบสี่เหลี่ยม

จะเห็นว่าทั้งหมดนี้มีคำว่า poly นำหน้า คำสั่งเหล่านี้ทั้งหมดสำหรับสร้างวัตถุเป็นโพลิกอน แต่ว่าที่จริงแล้วนอกเหนือจากนี้ก็ยังมีคำสั่งที่ใช้ในการสร้างวัตถุชนิด "พื้นผิว NURBS" ซึ่งก็จะกล่าวถึงในตอนถัดๆไป อย่างไรก็ตามโดยทั่วไปแล้วโพลิกอนถูกใช้บ่อยกว่าพื้นผิวมากเนื่องจากความ สะดวกในการใช้งาน ดังนั้นจึงจะกล่าวถึงโพลิกอนเป็นหลัก

และจะสังเกตว่าหลังคำว่า poly นั้นตัวแรกต้องเป็นตัวพิมพ์ใหญ่เสมอ ถ้าพิมพ์ตัวเล็กจะไม่ทำงาน ต้องระวังด้วย ส่วนคำว่า poly นั้นจะพิมพ์ p เป็นตัวพิมพ์เล็กหรือใหญ่ก็ได้

polyCylinder() กับ polyCone() เป็นฟังก์ชันคำสั่งสร้างทรงกระบอกและทรงกรวย ตามลำดับ มีแฟล็กเหมือนกันหมด ได้แก่
h (height) ความสูง ค่าเป็นจำนวนจริงที่มากกว่า 0 ค่าตั้งต้นคือ 2
r (radius) รัศมี ค่าเป็นจำนวนจริงที่มากกว่า 0 ค่าตั้งต้นคือ 1
sx (subdivisionsX) จำนวนส่วนที่แบ่งตามแนวเส้นรอบวง ค่าเป็นจำนวนเต็ม มีค่าตั้งแต่ 3 ขึ้นไป ค่าตั้งต้นคือ 20
sy (subdivisionsY) จำนวนส่วนที่แบ่งตามแนวตั้ง ค่าเป็นจำนวนเต็ม มีค่าตั้งแต่ 1 ขึ้นไป ค่าตั้งต้นคือ 1
sz (subdivisionsZ) จำนวนส่วนที่แบ่งตามแนวรัศมี ค่าเป็นจำนวนเต็ม มีค่าตั้งแต่ 0 ขึ้นไป ค่าตั้งต้นคือ 1

ตัวอย่าง
i=1
while(i<6):
    j=1
    while(j<6):
        k=1
        while(k<6):
            mc.polyCylinder(sx=i*5,sy=j,sz=k)
            mc.move(3*i,3*j,10*k)
            mc.polyCone(sx=i*5,sy=j,sz=k)
            mc.move(3*i+20,3*j,10*k)
            k+=1
        j+=1
    i+=1

ลองดูแล้วเทียบรูปทรงต่างๆที่ปรากฏขึ้นมา ซึ่งแต่ละอันมีขนาดเท่ากันแต่จำนวนส่วนที่แบ่งตามแนวต่างๆไม่เท่ากัน



สำหรับ sx นั้นถ้าหากมีค่าน้อยเกินไปวัตถุจะดูเหมือนไม่ค่อยกลม กลายเป็นเหมือนกับปริซึมหรือพีรามิดไป

polyPrism() เป็นฟังก์ชันคำสั่งสร้างทรงปริซึม แฟล็กเกี่ยวกับรูปร่างมีดังนี้
ns (numberOfSides) จำนวนด้าน ค่าเป็นจำนวนเต็ม มีค่าตั้งแต่ 3 ขึ้นไป ค่าตั้งต้นคือ 3
w (sideLength) ความกว้างของแต่ละด้าน ค่าเป็นจำนวนจริงบวก ค่าตั้งต้นคือ 0
l (length) ความสูง (ความยาว) ของแท่งปริซึม ค่าเป็นจำนวนจริงบวก ค่ำตั้งต้นคือ 2
sh (subdivisionsHeight) จำนวนส่วนที่แบ่งตามความสูง ค่าเป็นจำนวนเต็มมีค่าตั้งแต่ 1 ขึ้นไป ค่าต้นคือ 1
sc (subdivisionsCaps) จำนวนส่วนที่แบ่งตามแนวรัศมีที่ฐาน ค่าเป็นจำนวนเต็มมีค่าตั้งแต่ 0 ขึ้นไป ค่าตั้งต้นคือ 0

ตัวอย่าง ลองวนซ้ำสร้างปริซึมที่มีจำนวนด้านไม่เท่ากันขึ้นมาเปรียบเทียบกัน
i=3
while(i<9):
    mc.polyPrism(ns=i,sc=i-3)
    mc.move(i*4,0,0)
    i+=1



polyPyramid() เป็นฟังก์ชันคำสั่งสร้างทรงพีรามิด แฟล็กเกี่ยวกับรูปร่างได้แก่
ns (numberOfSides) จำนวนด้าน ค่าเป็นจำนวนเต็ม มีค่าตั้งแต่ 3 ขึ้นไป ค่าตั้งต้นคือ 3
w (sideLength) ความกว้างของแต่ละด้าน ค่าเป็นจำนวนจริงบวก ค่าตั้งต้นคือ 0
sh (subdivisionsHeight) จำนวนส่วนที่แบ่งตามความสูง ค่าเป็นจำนวนเต็มมีค่าตั้งแต่ 1 ขึ้นไป ค่าต้นคือ 1
sc (subdivisionsCaps) จำนวนส่วนที่แบ่งตามแนวรัศมีที่ฐาน ค่าเป็นจำนวนเต็มมีค่าตั้งแต่ 0 ขึ้นไป ค่าตั้งต้นคือ 0

แฟล็กของพีรามิดจะคล้ายๆกับปริซึม ต่างกันตรงที่ไม่มี l ซึ่งคือความสูง นั่นเพราะความสูงจะเท่ากับความกว้างของด้าน

ส่วน polyPlane() เป็นฟังก์ชันคำสั่งสร้างระนาบสี่เหลี่ยม แฟล็กเกี่ยวกับรูปร่างได้แก่
w (width) ความกว้าง (ขนาดในแกน x) ค่าเป็นจำนวนจริงบวก ค่าตั้งต้นคือ 1
h (height) ความยาว (ขนาดในแกน z) ค่าเป็นจำนวนจริงบวก ค่าตั้งต้นคือ 1
sx (subdivisionsX) จำนวนส่วนที่แบ่งในแนวแกน x ค่าเป็นจำนวนเต็มตั้งแต่ 1 ขึ้นไป ค่าตั้งต้นคือ 10
sy (subdivisionsY) จำนวนส่วนที่แบ่งในแนวแกน y ค่าเป็นจำนวนเต็มตั้งแต่ 1 ขึ้นไป ค่าตั้งต้นคือ 10

ระนาบที่ได้จะมีอยู่ด้านเดียว หันขึ้นด้านบน

นอกจากนี้ก็ยังมีรูปทรงอื่นๆอีกเช่น
polyPipe() สร้างท่อ
polyTorus() สร้างทรงโดนัท
polyHelix() สร้างทรงเกลียว
เป็นต้น

ตอนนี้เราสามารถสร้างวัตถุขึ้นมาได้หลายชนิดแล้ว โดยที่สามารถปรับรูปร่างได้หลากหลาย

อย่างไรก็ตามก็ยังมีอีกอย่างหนึ่งซึ่งควรจะสามารถปรับได้แต่ยังไม่ได้พูดถึง นั่นคือตำแหน่งที่วัตถุหัน

ถ้าสังเกตมาจนถึงตอนนี้จะเห็นว่าวัตถุทั้งหมดที่สร้างขึ้นจะตั้งตรงโดยที่มีแกน y เป็นแกนหมุน สำหรับกรวยและพีรามิดจะหันปลายแหลมไปด้านบนตลอด

แต่ความจริงแล้วเราสามารถเปลี่ยนทิศที่รูปทรงนั้นหันไปได้ ด้วยการเติมแฟล็กเพิ่มเข้าไปอีกตัว นั่นคือ ax (axis) ซึ่งใช้ได้กับฟังก์ชันสร้างรูปทรงทั้งหมดที่กล่าวมาแล้ว
ax นั้นรับค่าเว็กเตอร์ชี้ทิศที่ต้องการให้เป็นแกนเป็นตัวแปรชนิดลิสต์ของจำนวนจริง ๓ ตัว เช่น
ax=[1,1,1]
mc.polyCylinder(ax=ax)

จะได้ทรงกระบอกที่หันไปในทิศเดียวกับเวกเตอร์ (1,1,1)



ลองใช้กับทรงกรวย หมุนดูให้เห็นหลายๆทิศเทียบกัน
i=0
while(i<6):
    mc.polyCone(ax=[5-i,i,0])
    mc.move(0,0,2*i)
    i+=1

ลองเปรียบเทียบทิศทางที่หันของทรงกรวยแต่ละอันดูจะพอเห็นภาพขึ้นมาได้



แฟล็ก ax นี้สนใจแค่ทิศของเว็กเตอร์ โดยไม่สนขนาด ดังนั้นหากสัดส่วนของค่าแต่ละพิกัดเท่ากันแล้วไม่ว่าจะค่ามากหรือน้อยวัตถุ ก็หันไปทิศเดียวกัน ดังนั้น
mc.polyCone(ax=[1,1,0])

และ
mc.polyCone(ax=[50,50,0])

ต่างได้วัตถุที่หันไปทางเดียวกัน เป็นต้น

โดยปกติแล้วถ้าไม่มีการใส่แฟล็กนี้ค่าตั้งต้นก็คือ [0,1,0] นั่นคือหันไปตามแกน y ด้านบวก ก็คือหันหัวขึ้น

ถ้าหากใส่เป็น ax=[1,0,0] ก็จะหันไปตามแนวแกน x

และถ้าใส่ ax=[0,0,1] ก็จะหันไปตามแนวแกน z เป็นต้น

ขอยกอีกตัวอย่างเพื่อให้เห็นภาพ เป็นการสร้างพีรามิดที่หันไปทั้ง ๖ ด้าน
t = [[2,0,0],[0,2,0],[0,0,2],[-2,0,0],[0,-2,0],[0,0,-2]]
i=0
while(i<6):
    mc.polyPyramid(ax=t[i],w=2,ns=4)
    mc.move(t[i][0],t[i][1],t[i][2])
    i+=1



ค่าต่างๆที่เราใส่ลงไปในแฟล็กตอนที่สร้างรูปทรงเหล่านี้ขึ้น หลังจากที่รูปทรงถูกสร้างขึ้นมาแล้วก็ไม่ได้หายไปไหน สามารถเปิดดูได้จากในแชนเนลบ็อกซ์ (チャネルボックス,  channel box) และ แอตทริบิวต์อีดิเตอร์ (アトリビュートエディタ, attribute editor) ซึ่งอยู่ในแถบทางฝั่งขวาทั้งสองอัน



ลองสร้างวัตถุสักอย่างแล้วก็กดเปิดแอตทริบิวต์อีดิเตอร์

เช่น ลองกดสร้างทรงปริซึมห้าด้าน
mc.polyPrism(ns=5,l=2,w=1,sh=3,sc=2,n='hadan')



จะเห็นว่ามีแถบให้เลือกอยู่หลายอัน แต่ละอันแทนสิ่งที่เรียกว่า "โหนด" อันแรกจะเห็นเป็นชื่อของวัตถุที่เราตั้งนั้นคือโหนดหลักของตัววัตถุ ซึ่งแสดงถึงคุณสมบัติภาพรวมของตัววัตถุ



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

เมื่อกดดูที่อันแรกคือโหนดหลักของวัตถุจะเห็นค่าที่แสดงตำแหน่ง มุมที่หมุน และมาตราส่วน

ตำแหน่งเริ่มต้นจะอยู่ที่ (0,0,0) แต่ถ้ามีการเคลื่อนย้ายวัตถุ เช่นด้วยการใช้ฟังก์ชัน move() ก็จะมีค่าเปลี่ยนแปลงไป หรือสามารถกดคลิกทีตัวเลขแล้วพิมพ์แก้ค่าได้เลย ส่วนค่าอื่นๆเช่นมุมที่หมุน และมาตรส่วนก็สามารถปรับค่าได้เช่นกัน แต่ตอนนี้จะยังไม่พูดถึง

ส่วนอันที่สองจะเห็นเป็นชื่อของวัตถุตามด้วย Shape ตรงส่วนนี้เป็นโหนดหนึ่งของวัตถุซึ่งถูกสร้างขึ้นมาพร้อมกัน ทำหน้าที่กำหนดรูปร่างของวัตถุตอนที่เรนเดอร์ ซึ่งตรงส่วนนี้จะขอยังไม่พูดถึงละเอียด

และส่วนอันที่ ๓ จะเป็นส่วนแสดงโหนดที่เก็บข้อมูลของรูปทรงที่ก่อตัวเป็นวัตถุนี้ ชื่อที่เห็นนี้ถูกตั้งโดยอัตโนมัติโดยไม่เกี่ยวกับชื่อวัตถุที่ตั้ง และไม่สามารถกำหนดตอนสร้างวัตถุได้ แต่ถ้าอยากเปลี่ยนก็สามารถทำได้ด้วยฟังก์ชัน rename()

สำหรับกรณีนี้ชื่อที่ได้คือ polyPrism1



พอลองคลิกเข้ามาดูก็จะเห็นค่าองค์ประกอบต่างๆแสดงอยู่ตามภาพ นี่เป็นกรณีของทรงปริซึม
長さ Length ความยาว
サイドの長さ Side Length ความกว้างของแต่ละด้าน
サイドの数 Number of Sides จำนวนด้าน
高さの分割数 Height divisions จำนวนส่วนที่แบ่งตามแนวความสูง
キャップの分割数 Cap divisions จำนวนส่วนที่แบ่งตามแนวรัศมี
Axis แกนหัน ประกอบด้วย ๓ ตัวเลข แทนองค์ประกอบในทิศ x y z

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

นอกจากนี้ก็ยังสามารถดูและแก้ค่าได้ผ่านทาง  channel box ด้วย เพียงแต่จะมีรายละเอียดน้อยกว่า

หากต้องการทราบค่าเหล่านี้ด้วยการใช้ฟังก์ชันในไพธอนโดยที่ไม่ต้องมาเปิดดู attribute editor ก็สามารถทำได้ด้วยฟังก์ชัน getAttr() และหากต้องการเปลี่ยนค่าเหล่านี้ก็สามารถทำได้ด้วยการใช้ฟังก์ชัน setAttr()

ทั้งสองฟังก์ชันนี้จะอธิบายในบทถัดๆไป ตอนนี้จะยังไม่พูดถึง



โดยปกติเวลาที่ใช้ฟังก์ชันสร้างรูปทรงในการสร้างวัตถุขึ้นมาจะมีสิ่งที่เรียก ว่า "ประวัติศาสตร์" ซึ่งบอกให้รู้ว่าวัตถุนั้นมีจุดกำเนิดเริ่มสร้างมายังไง โดยจะเก็บไว้ในโหนดตามที่เห็นได้ใน attribute editor นี้ และทำให้สามารถกลับไปแก้ด้วยการเปลี่ยนค่าองค์ประกอบต่างๆของรูปทรงนั้นๆ

แต่หากมั่นใจว่าจะไม่มีการกลับมาแก้ตรงนี้อีกแล้วก็สามารถลบโหนดนี้ออกได้ โดยการเพิ่มแฟล็กลงไปอีกอย่างในตอนที่สร้าง แฟล็กนั้นคือ ch (constructionHistory)

ลองลบปริซึมอันเดิมแล้วพิมพ์
mc.polyPrism(ns=5,l=2,w=1,sh=3,sc=2,n='hadan',ch=0)

ผลที่ได้จะได้รูปทรงเหมือนเดิมทุกอย่าง แต่หากดูใน attribute editor จะเห็นว่าแถบโหนดของรูปทรงหายไป เหลืออยู่เพียง ๔ แถบเท่านั้น พอเป็นแบบนี้แล้วก็จะไม่สามารถแก้ไขรูปทรงได้



การใส่ ch=0 (ch=False) ลงไปมีความหมายว่าเราไม่ต้องการให้เก็บประวัติศาสตร์การสร้างไว้ วัตถุที่ได้จะไม่จำว่าตัวมันกำเนิดมาจากทรงปริซึม

โดยปกติถ้าไม่ได้ ใส่แฟล็ก ch ลงไปค่าตั้งต้นของแฟล็ก ch คือ 1 (True) หมายความว่าจะมีการเก็บประวัติการสร้างไว้ตลอดหากเราไม่ได้ระบุให้ ch=0



ตอนนี้ได้แนะนำฟังก์ชันสร้างรูปทรงต่างๆไปเยอะแล้ว อีกทั้งแนะนำแฟล็กที่สำคัญไปหลายอย่าง ทำให้สร้างรูปทรงพื้นฐานได้หลากหลายในระดับหนึ่ง ที่เหลือก็คือนำรูปทรงพื้นฐานเหล่านี้ไปแปลงรูปต่อเพื่อให้เป็นรูปร่างที่ ต้องการต่อไป



อ้างอิง

<< บทที่แล้ว      บทถัดไป >>
หน้าสารบัญ


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

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

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

หมวดหมู่

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

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

สารบัญ

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

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

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文