φυβλαςのβλογ
phyblasのブログ



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

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

ตัวอย่าง ลองสร้างทรงกลมหลายๆอันมาเรียงซ้อนกันจนรูปร่างคล้ายครัวซ็องแล้วนำมารวมเป็นโพลิกอนเดียวกัน
for i in range(-5,6):
    mc.polySphere(r=8-abs(i),n='thon%d'%(i+6))
    mc.move(0,0,-15+1.5*abs(i))
    mc.rotate(0,25*i,0,p=[0,0,0])
mc.polyUnite(['thon%d'%i for i in range(1,12)],n='croissant')



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

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

หากปล่อยโหนดเอาไว้เช่นนี้ outliner จะดูรก หากคิดว่าไม่จำเป็นจำต้องกลับไปแก้แต่ละส่วนแบบแยกกันอีกแล้วก็สามารถลบโหนดนี้ทิ้งได้ตอนที่รวม โดยเพิ่มแฟล็ก ch (constructionHistory) เป็น ch=0 วัตถุที่รวมก็จะกลายเป็นชิ้นเดียวกันโดยไม่เหลือประวัติศาสตร์เดิมตอนก่อน แยก

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

เชล (シェル, shell) หมายถึงชิ้นของโพลิกอน กลุ่มของหน้าโพลิกอนที่มีจุดหรือเส้นขอบติดกันจะเรียกว่าเป็นเชลเดียวกัน แต่ถ้าไม่มีการเชือมต่อกันเลยจะถือว่าเป็นคนละเชล

การหาจำนวนเชลสามารถใช้ฟังก์ชัน polyEvaluate() โดยใส่แฟล็ก s (shell)
mc.polyEvaluate(s=1)

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

แต่หากนำจุดนั้นมาหลอมรวมเป็นจุดเดียวกันแล้วมันก็จะกลายเป็นเชลเดียวกันทันที

การหลอมรวมจุดที่ซ้อนทับกันสามารถทำได้โดยใช้ฟังก์ชัน polyMergeVertex() โดยใส่แฟล็กที่ต้องใส่คือ d (distance) คือระยะสูงสุดของจุดที่ต้องการให้หลมรวมกัน จะกำหนดแคบแค่ไหนก็ได้ แต่ต้องให้แคบพอที่จะไม่กระทบต่อจุดยอดที่แค่อยู่ใกล้กันมากแต่ไม่ได้ตั้งใจจะรวม

หลังจากที่หลอมรวมกันแล้วก็จะพบว่าจำนวนเชลลดลง เช่นตัวอย่างนี้ ลองหาจำนวนเชลก่อนรวมกับหลังรวม
for i in range(5):
    mc.polyPlane(w=10,h=10,sx=2,sy=2,n='phaen%d'%(i+1))
    mc.move(i*10,0,i*10)
mc.polyUnite(['phaen%d'%(i+1) for i in range(5)],n='phaentonueang')
print('จำนวนเชลก่อนรวม:%d'%mc.polyEvaluate('phaentonueang',s=1))
mc.polyMergeVertex(d=0.001)
print('จำนวนเชลหลังรวม:%d'%mc.polyEvaluate('phaentonueang',s=1))



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

ลองสร้างโพลิกอนแบบตัวอย่างที่แล้วอีกทีเสร็จแล้วก็รวมกันโดยไม่ใช้ polyMergeVertex() เสร็จแล้วก็แยกกันกลับออกมาทันที
for i in range(5):
    mc.polyPlane(w=10,h=10,sx=2,sy=2,n='phaen%d'%(i+1))
    mc.move(i*10,0,i*10)
mc.polyUnite(['phaen%d'%(i+1) for i in range(5)],n='phaentonueang')
mc.polySeparate()



ชื่อวัตถุตอนที่รวมจะกลายมาเป็นชื่อกลุ่ม ส่วนแผ่นที่แยกออกมาจะไม่ได้คืนชื่อเดิมแต่จะถูกตั้งชื่อใหม่ให้อัตโนมัติ แต่ก็สามารถตั้งชื่อใหม่ได้โดยเติมแฟล็ก n (name)



อ้างอิง

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


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

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

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

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> 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)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文