คำสั่งจัดการกับโพลิกอนนั้นมีอยู่มากมายหลายชนิด ในที่นี้จะขอแนะนำจากที่ใช้บ่อยที่สุด นั่นคือ polyExtrudeFacet()

polyExtrudeFacet() เป็นคำสั่งที่ใช้ดึงผิวโพลิกอนให้ยื่นออกมา เกิดเป็นผิวโพลิกอนใหม่ซึ่งสามารถนำมาแปลงรูปต่อได้อย่างอิสระ

ยกตัวอย่าง ลองสร้างลูกบาศก์ขึ้นมา แล้วก็กดเลือกผิวหน้าบนสุดแล้วใช้คำสั่งนี้
mc.polyCube(w=10,h=10,d=10)
mc.select('.f[1]')
mc.polyExtrudeFacet()



ดูภายนอกจะเห็นว่าไม่มีการเปลี่ยนแปลงอะไร แค่ผิวหน้าบนสุดถูกเลือกอยู่เท่านั้น แต่หากลองสั่งเคลื่อนย้ายดู
mc.move(10,10,-10,r=1)

ก็จะเห็นว่าผิวตรงนี้ถูกยื่นออกมา



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

ลองพิมพ์ตามนี้เพื่อสร้างใหม่โดยเพิ่มส่วนท้ายที่ print องค์ประกอบต่างๆออกมา
mc.polyCube(w=10,h=10,d=10)
mc.select('.f[1]')
ef = mc.polyExtrudeFacet()
attr = mc.listAttr(ef[0],k=1)
attrsn = mc.listAttr(pef,k=1,sn=1)
for i in range(len(attr)):
    print(attr[i],attrsn[i])

จะได้รายการองค์ประกอบของผิวยื่นมาทั้งหมดทั้งชื่อเต็มและชื่อย่อ ซึ่งมีเยอะมาก

ในที่นี้ขอยกมาบางส่วนที่ใช้บ่อย ได้แก่
移動translatetตำแหน่ง แบ่งเป็น tx ty tz
回転rotateroมุมหมุน แบ่งเป็น rx ry rz
スケールscalesมาตราส่วน แบ่งเป็น sx sy sz
ピボットpivotpvtพีว็อต แบ่งเป็น pvx pvy pvz
ローカル移動localTranslateltตำแหน่งสัมพัทธ์ แบ่งเป็น ltx lty ltz
ローカル回転localRotatelrมุมหมุนสัมพัทธ์ แบ่งเป็น  lrx lry lrz
ローカル スケールlocalScalelsมาตราส่วนสัมพัทธ์ แบ่งเป็น  lsx lsy lsz
オフセットoffsetoffอ็อฟเซ็ต
フェースの一体性の維持keepFacesTogetherkftรักษาให้หน้าอยู่ติดกัน
文割数divisionsdส่วนแบ่ง

t (translate), ro (rotate) และ s (scale) นั้นคือค่าการเลื่อนตำแหน่ง มุมหมุน และมาตราส่วนซึ่งเทียบกับวัตถุ เป็นค่าทั้ง ๓ ที่คุ้นเคยกันดีอยู่แล้ว

ยกตัวอย่าง สร้างวัตถุขึ้นมาแล้วยื่นผิวหนึ่งออกไปตามแกน x
mc.polySphere(r=10,sx=8,sy=8)
mc.select('.f[46]')
ef = mc.polyExtrudeFacet()
mc.setAttr(ef[0]+'.tx',5)



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

ตัวอย่างข้างต้นสามารถเขียนใหม่ได้สั้นๆเป็น
mc.polySphere(r=10,sx=8,sy=8)
mc.select('.f[46]')
mc.polyExtrudeFacet(tx=5)

ผลที่ได้จะเหมือนเดิม

นอกจากนี้แล้วคือ นอกจากกดเลือกผิวด้วย select() แล้วค่อยใช้ polyExtrudeFacet() ต่ออีกที เราสามารถใส่หน้าที่ต้องการยื่นเป็นอาร์กิวเมนต์ในฟังก์ชัน polyExtrudeFacet() ได้เลย

กล่าวคือถ้าพิมพ์
mc.polySphere(r=10,sx=8,sy=8)
mc.polyExtrudeFacet('.f[46]',tx=5)

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

อนึ่ง การดึงผิวโดยใช้การแก้องค์ประกอบนั้นอาจให้ผลเหมือนกับการใช้ move() แต่จะต่างกันตรงที่ผลของการเลื่อนนั้นจะถูกเก็บไว้ในโหนดด้วย ดังนั้นจึงน่าใช้วิธีนี้มากกว่า โดยเฉพาะหากต้องการทำเป็นภาพเคลื่อนไหวก็สามารถทำได้

ต่อมาลองทำกับแฟล็ก ro และ s ไปพร้อมกันด้วย คราวนี้ยื่นแล้วก็มีการขยายพร้อมกับหมุนไปด้วย
mc.polySphere(r=10,sx=8,sy=8)
mc.polyExtrudeFacet('.f[46]',tx=5,rx=90,s=[1,2,2])



นอกจาก t ro s ซึ่งเป็นค่าในแนวแกนแล้ว ยังมี lt (localTranslate) lr (localRotate) ls (localScale) ซึ่งจะต่างกันตรงที่ว่า lt lr ls เป็นการเปลี่ยนแปลงเทียบกับวัตถุหรือว่าเทียบกับตัวผิวที่ทำการยื่น

สำหรับตำแหน่งสัมพัทธ์นั้นแกนที่ตั้งฉากกับผิวยื่นจะเป็นแกน z ดังนั้นหากใส่ค่า ltz เป็นบวกไปผิวก็จะยื่นออก แต่ถ้าใส่ค่าติดลบผิวก็จะบุ๋มลงไป
mc.polySphere(r=10,sx=8,sy=8)
mc.polyExtrudeFacet('.f[46]',ltz=5)
mc.polyExtrudeFacet('.f[44]',ltz=-5)



ความแตกต่างระหว่าง lt กับ t นั้นจะชัดเจนยิ่งขึ้นเมื่อใช้กับหลายหน้าพร้อมกัน เมื่อใช้ lt จะเห็นว่าแต่ละหน้าเลื่อนไปตามทิศของตัวเองซึ่งไม่เหมือนกัน แต่ถ้าใช้ t จะยื่นไปทางเดียวกันตลอด
mc.polySphere(r=10,sx=8,sy=8)
mc.polyExtrudeFacet('.f[22]','.f[28]','.f[46]',ltz=5)



ส่วนเรื่องการหมุนนั้นก็เช่นกัน ro คือมุมที่หมุนบิดไปเมื่อเทียบกับระนาบของวัตถุเดิมแต่  lr คือมุมที่หมุนบิดไปเมื่อเทียบกับระนาบของผิวหน้าที่ทำการยื่น
mc.polySphere(r=10,sx=8,sy=8)
mc.polyExtrudeFacet('.f[22]','.f[28]','.f[46]',ltz=5,lrz=45)



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

ลองใส่แฟล็กกำหนดจุดพีว็อตไว้ที่ z=30 พร้อมกันนั้นก็ใส่มาตราส่วนแกน z ให้เป็น 0 ด้านที่ยื่นออกมาก็จะยื่นไปจรดตำแหน่ง z=30
mc.polySphere(r=10,sx=8,sy=8)
mc.polyExtrudeFacet('.f[19]','.f[22]','.f[27]','.f[30]',ltz=5,pvt=[0,0,30],sz=0)



ส่วน off (offset) คือค่าการหุบเข้าของผิว ถ้าใส่ค่า off เป็นบวกผิวที่ยื่นจะแคบลง ถ้าใส่เป็นลบผิวจะกว้างขึ้น
mc.polySphere(r=10,sx=8,sy=8)
mc.polyExtrudeFacet('.f[38]','.f[46]',off=-2,ltz=5)
mc.polyExtrudeFacet('.f[36]','.f[44]',off=2,ltz=5)



kft (keepFacesTogether) เป็นตัวกำหนดว่าในกรณีที่ยื่นมากกว่าหนึ่งหน้าจะให้ผิวของหน้าที่ยื่นออกมา นั้นติดกันไปด้วยกันหรือไม่ โดยปกติจะถูกตั้งเป็น kft=1 คือจะติดกันไปตลอด แต่หากต้องการให้แยกก็ให้พิมพ์ kft=0

ลองพิมพ์
mc.polySphere(r=10,sx=8,sy=8)
mc.polyExtrudeFacet('.f[32:39]',ltz=5)
mc.polyExtrudeFacet('.f[8:15]',ltz=5,kft=0)



จะเห็นว่าด้านบนไปด้วยกันในขณะที่ด้านล่างแยกออกจากกัน

ส่วน d (divisions) คือจำนวนท่อนที่ถูแบ่งย่อยตอนที่ยื่นออกมา

และยังมีองค์ประกอบอีกหลายอย่างที่ไม่ได้กล่าวถึง



จากองค์ประกอบต่างๆที่สามารถปรับแก้ค่าได้ทำให้สามารถประยุกต์เพื่อสร้างอะไรได้หลายอย่างมาก

ลองสร้างปล้องไผ่ดูโดยการใช้แฟล็ก off และ ltz ปรับอ็อฟเซ็ตและตำแหน่งสัมพัทธ์แกน z แล้ววนซ้ำไปเรื่อยๆ
mc.polyCylinder(r=4,h=12,sx=24,sy=0,sz=0,n='phai')
mc.select('.f[25]')
for i in range(7):
    mc.polyExtrudeFacet(off=-0.5,ltz=0.5)
    mc.polyExtrudeFacet(off=0.7,ltz=0.5)
    mc.polyExtrudeFacet(ltz=12)



และลองสร้าง UFO รูปร่างประหลาดขึ้นมาจากการใช้แฟล็กหลายตัวร่วมกันในส่วนต่างๆ
mc.polySphere(r=10,sx=16,sy=16)
mc.polyExtrudeFacet('.f[96:127]',ltz=6,sy=0)
mc.polyExtrudeFacet('.f[240:255]',pvt=[0,15,0],s=[0,0,0])
mc.polyExtrudeFacet('.f[176:223]',lsx=0,lsy=0,ltz=2,kft=0)
mc.polyExtrudeFacet('.f[67]','.f[71]','.f[75]','.f[79]',pvy=-10,sy=0,ltz=5)
mc.select('.f[128:175]')
mc.polyExtrudeFacet(off=0.5,kft=0)
mc.polyExtrudeFacet(ltz=-1)



นอกจาก polyExtrudeFacet() แล้วก็ยังมี polyExtrudeEdge() และ polyExtrudeVertex() ซึ่งก็ใช้ดึงโพลิกอนให้ยื่นออกมาเช่นกัน แต่เป็นการดันที่เส้นขอบและจุด



อ้างอิง