φυβλαςのβλογ
บล็อกของ phyblas



maya python เบื้องต้น บทที่ ๒๔: การแปลงรูปโพลิกอนอย่างอิสระด้วยการดันยื่นเข้าออก
เขียนเมื่อ 2016/03/11 15:05
แก้ไขล่าสุด 2021/09/28 16:42
คำสั่งจัดการกับโพลิกอนนั้นมีอยู่มากมายหลายชนิด ในที่นี้จะขอแนะนำจากที่ใช้บ่อยที่สุด นั่นคือ 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() ซึ่งก็ใช้ดึงโพลิกอนให้ยื่นออกมาเช่นกัน แต่เป็นการดันที่เส้นขอบและจุด



อ้างอิง

<< บทที่แล้ว      บทถัดไป >>
หน้าสารบัญ


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> mayapython
-- คอมพิวเตอร์ >> 3D >> maya

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文