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

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



อ้างอิง