φυβλαςのβλογ
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
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

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