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



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

คำสั่งที่ใช้รวมโพลิกอนคือฟังก์ชัน 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
-- คอมพิวเตอร์ >> maya

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

目录

从日本来的名言
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- opencv
-- pytorch
机器学习
-- โครงข่าย
     ประสาทเทียม
maya
javascript
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

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