คำสั่งจัดการกับโพลิกอนนั้นมีอยู่มากมายหลายชนิด ในที่นี้จะขอแนะนำจากที่ใช้บ่อยที่สุด นั่นคือ 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])
จะได้รายการองค์ประกอบของผิวยื่นมาทั้งหมดทั้งชื่อเต็มและชื่อย่อ ซึ่งมีเยอะมาก
ในที่นี้ขอยกมาบางส่วนที่ใช้บ่อย ได้แก่
移動 |
translate |
t |
ตำแหน่ง แบ่งเป็น tx ty tz |
回転 |
rotate |
ro |
มุมหมุน แบ่งเป็น rx ry rz |
スケール |
scale |
s |
มาตราส่วน แบ่งเป็น sx sy sz |
ピボット |
pivot |
pvt |
พีว็อต แบ่งเป็น pvx pvy pvz |
ローカル移動 |
localTranslate |
lt |
ตำแหน่งสัมพัทธ์ แบ่งเป็น ltx lty ltz |
ローカル回転 |
localRotate |
lr |
มุมหมุนสัมพัทธ์ แบ่งเป็น lrx lry lrz |
ローカル スケール |
localScale |
ls |
มาตราส่วนสัมพัทธ์ แบ่งเป็น lsx lsy lsz |
オフセット |
offset |
off |
อ็อฟเซ็ต |
フェースの一体性の維持 |
keepFacesTogether |
kft |
รักษาให้หน้าอยู่ติดกัน |
分割数 |
divisions |
d |
ส่วนแบ่ง |
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() ซึ่งก็ใช้ดึงโพลิกอนให้ยื่นออกมาเช่นกัน แต่เป็นการดันที่เส้นขอบและจุด
อ้างอิง