ใน
บทที่ ๑๘ ได้พูดถึงการรวมโพลิกอนเป็นกลุ่มไปแล้ว แต่การรวมเป็นกลุ่มแบบนั้นเป็นแค่การรวมกันแบบหลวมๆ ในบทนี้จะแนะนำการรวมโพลิกอนหลายชิ้นเป็นโพลิกอนชิ้นเดียวกัน
คำสั่งที่ใช้รวมโพลิกอนคือฟังก์ชัน 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)
อ้างอิง