φυβλαςのβλογ
บล็อกของ 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
ภาษา 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月

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

ไทย

日本語

中文