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



maya python เบื้องต้น บทที่ ๒๐: การตัดแต่งส่วนประกอบของโพลิกอน
เขียนเมื่อ 2016/03/11 13:06
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่ผ่านๆมาได้พูดถึงการสร้างรูปทรงต่างๆและทำให้ย่อขยายเปลี่ยนรูปไปได้ ในระดับนึง แต่ว่าก็ยังมีข้อจำกัดของรูปร่างที่ทำได้ เพราะยังอยู่ในขอบเขตของรูปทรงเริ่มต้น ไม่สามารถแก้ไขอะไรได้มากนัก

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

วัตถุประเภทโพลิกอนโดยทั่วไปประกอบขึ้นจากจุดยอด (頂点, vertex) ต่างๆ โดยมีเส้นลากระหว่างจุดสองจุดเกิดเป็นเส้นขอบ (エッジ, edge) และเส้นขอบสามอันขึ้นไปล้อมกันเกิดเป็นหน้า (フェース, face) ขึ้น

จำนวน ของจุดยอด เส้นขอบ และหน้า สามารถหาได้โดยใช้ฟังก์ชัน polyEvaluate() โดยใส่แฟล็กต่างกันได้แก่ v (vertex), e (edge) และ f (face)
v=1 เป็นการหาจำนวนจุดยอด
e=1 เป็นการหาจำนวนเส้นขอบ
f=1 เป็นการหาจำนวนหน้า

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

ยกตัวอย่างทรงสี่เหลี่ยม
mc.polyCube(w=10,h=2,d=5,sx=1,sy=1,sz=1,n='songsiliam')
v = mc.polyEvaluate(v=1)
e = mc.polyEvaluate(e=1)
f = mc.polyEvaluate(f=1)
print("ทรงสี่เหลี่ยมประกอบด้วย %d จุดยอด %d เส้นขอบ %d หน้า"%(v,e,f))

จะเห็นว่าทรงสี่เหลี่ยมที่ไม่มีการแบ่งส่วนย่อยเลยจะประกอบไปด้วย 8 จุดยอด 12 เส้นขอบ และ 6 หน้า



การเข้าถึงจุดยอดแต่ละอันภายในวัตถุทำได้โดยการใส่ชื่อวัตถุแล้วตามด้วย .vtx[หมายเลข]

ลองพิมพ์
mc.select('songsiliam.vtx[2]')

ก็จะเห็นว่าทรงสี่เหลี่ยมที่ถูกสร้างขึ้นนั้นถูกเลือกที่ตัวจุดยอดจุดหนึ่งอยู่



หมายเลขของจุดจะไล่ตั้งแต่ 0 ไปจนถึงเท่ากับจำนวนจุดยอดลบด้วย 1 ดังนั้นสำหรับทรงสี่เหลี่ยมจะประกอบไปด้วย
.vtx[0] .vtx[1] ไปเรื่อยๆถึง .vtx[7]

หากต้องการเลือกพร้อมกันหลายอันที่มีเลขติดกันก็ทำได้โดยใช้ : เช่น
mc.select('songsiliam.vtx[2:5]')

จะเป็นการเลือกจุดยอดพร้อมกัน ๔ อัน



และถ้าอยากเลือกจุดยอดทั้งหมดก็ทำได้โดยใช้ * เช่น
mc.select('songsiliam.vtx[*]')

จุดยอดทุกจุดจะถูกเลือก



สำหรับเส้นขอบสามารถเข้าถึงได้โดยชื่อวัตถุตามด้วย .e[หมายเลข] ส่วนหน้าก็จะเป็น .f[หมายเลข]

สำหรับทรงสี่เหลี่ยมจะมีเส้นขอบ ๑๒ อัน และมีหน้า ๖ หน้า ก็จะประกอบด้วย
.e[0] .e[1] ไปจนถึง .e[11]
.f[0] .f[1] ไปจนถึง .f[5]

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

นอกจากแค่เลือกด้วย select() แล้วยังอาจใช้กังฟังก์ชันอื่นเช่น delete() เพื่อลบ
mc.polyCube(w=10,h=2,d=5,sx=1,sy=1,sz=1)
mc.delete('.f[0:1]','.f[4]')

จะได้ทรงสี่เหลี่ยมที่ถูกลบหน้าไป ๓ หน้า เหลือแค่ ๓ หน้า



ต้องระวังอย่างหนึ่งว่าหากลบหน้าไปแล้ว ตัวเลขชี้หน้าอื่นๆที่เหลืออาจเปลี่ยนแปลงไปหมดได้ ดังนั้นหลังจากลบไปแล้วจะทำอะไรต่อต้องดูเลขชี้หน้าใหม่ทุกครั้ง

ลองสร้างทรงสี่เหลี่ยมขึ้นมาแล้วพิมพ์ mc.delete('.f[0]') ซ้ำไปเรื่อยๆ จะพบว่าหน้าค่อยๆหายไปทีละหน้า ที่เป็นแบบนี้เพราะพอกดลบห้าน .f[0] ไปก็จะมีหน้าอื่นกลายเป็น .f[0] แทน เพราะเป็นเลขตัวแรก ต่อให้เหลือหน้าเดียวยังไงก็ต้องมีวัตถุชื่อ .f[0] แน่นอน

ดังนั้นหากพิมพ์ mc.delete('.f[0]') ไป ๕ ครั้งก็จะเหลือแค่หน้าเดียว อย่างไรก็ตามจะไม่สามารถลบหน้าทั้งหมดจนเหลือศูนย์หน้าได้ หากจะลบก็ทำการลบทั้งวัตถุไปเลย



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

ลองสร้างทรงสี่เหลี่ยมขึ้นมาแล้วย้ายมุมหนึ่งไปจะได้รูปร่างที่แปลกออกไป
mc.polyCube(w=10,h=10,d=10,sx=1,sy=1,sz=1)
mc.move(-4,-4,-4,'.vtx[3]')



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

อาจทำการหมุนหรือย่อขยายส่วนประกอบเพื่อเคลื่อนย้าย

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

เช่นการใช้ scale() ถ้าค่าน้อยกว่าหนึ่งจะเป็นการลดระยะห่างระหว่างจุดลง ถ้ามากกว่าหนึ่งจะเป็นการเคลื่อนให้ห่างไปมากขึ้น
mc.polyPrism(ns=10,l=4,w=5)
mc.scale(0.3,1.5,0.3,'.e[20]','.e[22]','.e[24]','.e[26]','.e[28]')

จะได้รูปดาว



ลองสร้างทรงกระบอกแล้วจับมาหมุนบิด
mc.polyCylinder(r=5,h=10,sx=18,sy=1,sz=0)
mc.rotate(0,90,0,'.f[19]')



อาจใช้ for เพื่อเข้าถึงส่วนประกอบหลายๆตัว ทำออกมาเป็นรูปสวยๆได้
mc.polyCylinder(r=5,h=10,sx=36,sy=1,sz=2)
for i in range(72,108,2):
    mc.move((i-72.)/2,'.vtx[%d:%d]'%(i,i+1),y=1)



หากต้องการเข้าถึงด้านทั้งหมดเพื่อทำอะไรก็อาจใช้ for โดยหาขอบเขตด้วย polyEvaluate() เช่นลอง
import math
mc.polyPlane(w=10,h=10,sx=40,sy=40)
for i in range(mc.polyEvaluate(v=1)):
    mc.move(math.sin(0.5*i),'.vtx[%d]'%i,y=1)

ก็จะได้พื้นผิวลูกคลื่นสวยๆมา



หรือทรงกลมหน้าตาคล้ายผลไม้ที่มีผิวขรุขระ
import math
mc.polySphere(r=10,sx=50,sy=50)
for i in range(mc.polyEvaluate(v=1)):
    mc.move(math.sin(3*i),'.vtx[%d]'%i,y=1,r=1)





จบบทนี้ไปแล้วเราสามารถสร้างรูปทรงที่หลากหลายได้มากมาย ไม่จำกัดแค่เพียงรูปทรงพื้นฐานอีกต่อไปแล้ว



อ้างอิง

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


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

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

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

หมวดหมู่

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

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

目录

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

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

按类别分日志



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

  查看日志

  推荐日志

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