วัตถุต่างๆที่ถูกสร้างขึ้นในในโปรแกรมมายาจะประกอบไปด้วยองค์ประกอบหลายๆอย่างซึ่งก่อตัวขึ้นมาเป็นวัตถุนั้นอย่างที่เป็นอยู่
เช่นทรงกรวยจะประกอบด้วย ส่วนสูง, รัศมี, แกนหัน, ฯลฯ ซึ่งเป็นตัวกำหนดว่ามันจะมีรูปร่างเป็นยังไง
ค่าเหล่านั้นสามารถดูได้จาก
แอตทริบิวต์อีดิเตอร์ (アトリビュートエディタ, attribute editor) ดังที่ได้กล่าวไปใน
บทที่ ๘ แล้ว
ลองสร้างวัตถุตามตัวอย่างนี้
mc.polyCube(w=9.5,h=10.5,d=8.5,sx=2,sy=2,sz=2,n='klong')
เข้ามาดูแอตทริบิวต์อีดิเตอร์จะพบว่ามีค่าอะไรต่างๆที่สามารถปรับค่าได้มากมาย ทั้งในโหนดหลักของวัตถุและโหนดย่อย
หากอยากรู้ว่าวัตถุหนึ่งมีองค์ประกอบอะไรบ้างสามารถทำได้ด้วยฟังก์ชัน listAttr() โดยใส่ชื่อของวัตถุที่ต้องการดูลงในวงเล็บ เช่น
print(mc.listAttr('klong'))
จะได้ผลออกมาเป็นลิสต์ที่มีตัวแปรชนิดสายอักขระซึ่งแสดงชื่อขององค์ประกอบต่าง รวมแล้วเป็นร้อยๆ
จะเป็นว่าวัตถุชิ้นหนึ่งๆมีองค์ประกอบต่างๆมากมาย ซึ่งเราคงจะไม่พูดถึงทั้งหมด ในที่นี้จะขอพูดถึงเพียงส่วนเล็กๆที่สำคัญๆเท่านั้น
ลองเพิ่มแฟล็กลงไปตัวหนึ่งคือ k (keyable)
print(mc.listAttr('klong',k=1))
ผลที่ได้จะเห็นว่าเหลือองค์ประกอบเพียง ๑๐ ตัวเท่านั้น
[u'visibility', u'translateX', u'translateY', u'translateZ', u'rotateX', u'rotateY', u'rotateZ', u'scaleX', u'scaleY', u'scaleZ']
ความหมายของแฟล็ก k คือ หาก k=1 จะเป็นการจำกัดวงให้แสดงเฉพาะแค่องค์ประกอบที่สามารถคีย์ได้เท่านั้น
คีย์ได้ในที่นี้หมายถึงสามารถปรับค่าให้แปรเปลี่ยนได้ตามเวลาได้ด้วยการตั้งคีย์เฟรม ซึ่งจะอธิบายในบทหลังจากนี้ไปอีก
องค์ประกอบเหล่านั้นได้แก่ ตำแหน่ง, มุมหมุน, มาตรส่วน และ สภาพการมองเห็น โดยที่สามอย่างแรกแบ่งย่อยตามแกน x,y,z ดังนั้นโดยรวมแล้วจึงมี ๑๐ อัน
ชื่อทั้งหมดที่ปรากฏนี้เป็นชื่อยาว แต่หากต้องการชื่อย่อก็สามารถทำได้ด้วยการเพิ่มแฟล็กลงไปอีกตัว คือ sn (shortnames)
print(mc.listAttr('klong',k=1,sn=1))
จะได้ผลเป็น
[u'v', u'tx', u'ty', u'tz', u'rx', u'ry', u'rz', u'sx', u'sy', u'sz']
ซึ่งเป็นชื่อย่อขององค์ประกอบทั้ง ๑๐ นี้
หากดูที่
แชนเนลบ็อกซ์ (チャネルボックス, channel box) ก็จะเห็นองค์ประกอบทั้ง ๑๐ ตัวนี้วางเรียงกันอยู่ ดังนี้
ชื่อในรายการ |
ชื่อเต็ม |
ชื่อย่อ |
ความหมาย |
移動X |
translateX |
tx |
ตำแหน่งในแกน x |
移動Y |
translateY |
ty |
ตำแหน่งในแกน y |
移動Z |
translateZ |
tz |
ตำแหน่งในแกน z |
回転X |
rotateX |
rx |
มุมหมุนในแกน x |
回転Y |
rotateY |
ry |
มุมหมุนในแกน y |
回転Z |
rotateZ |
rz |
มุมหมุนในแกน z |
スケールX |
scaleX |
sx |
มาตราส่วนในแกน x |
スケールY |
scaleY |
sy |
มาตราส่วนในแกน y |
スケールZ |
scaleZ |
sz |
มาตราส่วนในแกน z |
可視性 |
visibility |
v |
สภาพการมองเห็น (ตัวบอกว่าวัตถุแสดงอยู่หรือซ่อนอยู่ มีค่าเป็น 1 หรือ 0) |
ค่า เหล่านี้สามารถปรับได้ด้วยฟังก์ชัน setAttr() โดยใส่อาร์กิวเมนต์ ๒ ตัว คือชื่อขององค์ประกอบที่ต้องการเปลี่ยนค่า และตามด้วยค่าที่ต้องการป้อนเข้าไป เช่น
mc.setAttr('klong.tx',3)
แบบนี้วัตถุ klong จะถูกย้ายไปในตำแหน่ง x=3
ชื่อ องค์ประกอบนั้นต้องประกอบด้วยชื่อของวัตถุที่ต้องการแล้วตามด้วยจุด จากนั้นจึงตามด้วยชื่อขององค์ประกอบนั้น โดยจะเป็นชื่อเต็มหรือชื่อย่อก็ได้อย่างตัวอย่างนี้ถ้าพิมพ์เป็น
mc.setAttr('klong.translateX',3)
ก็ให้ผลในลักษณะเดียวกัน
นอกจากนี้หากวัตถุที่ต้องการแก้องค์ประกอบนั้นเป็นวัตถุที่ถูกเลือกอยู่ก็ไม่ จำเป็นต้องใส่ชื่อวัตถุ ใส่แค่ชื่อจุดแล้วตามด้วยองค์ประกอบก็พอ เช่น
mc.select('klong')
mc.setAttr('.tx',3)
นอกจากนี้หากต้องการแก้ค่าของทั้งสามแกนพร้อมกันก็สามารถทำได้โดย
mc.setAttr('klong.t',3,4,5)
หรือ
mc.setAttr('klong.translate',3,4,5)
องค์ประกอบ t (translate) รวม tx ty tz ไว้ด้วยกันในตัวเดียว
จะ เห็นว่าการย้ายตำแหน่งของวัตถุด้วยฟังก์ชัน setAttr() นั้นก็ให้ผลไม่ต่างจากการใช้ฟังก์ชัน move() ที่ต่างกันก็คือเป็นการย้ายโดยตรงหรือโดยอ้อมเท่านั้น สามารถเลือกใช้ตามความสะดวก
ส่วนองค์ประกอบอื่นๆที่เหลือ เช่น มุมหมุน และมาตราส่วน ก็มีลักษณะคล้ายๆกับตำแหน่ง เพียงแต่ตอนนี้ยังไม่ได้อธิบายถึงเกี่ยวกับเรื่องนี้ แต่จะพูดถึงในบทถัดๆไป
กรณีที่ใช้ตัวแปรเก็บชื่อของวัตถุ แทนที่จะตั้งชื่อโดยตรงก็สามารถใช้เครื่องหมาย + เพื่อเชื่อมได้ เช่น
chue = mc.polyCube(w=9.5,h=10.5,d=8.5,sx=2,sy=2,sz=2)
mc.setAttr(chue[0]+'.tx',3)
ฟังก์ชันที่ตรงกันข้ามกับ setAttr() ก็คือ getAttr() ฟังก์ชันนี้มีไว้หาค่าขององค์ประกอบที่เราต้องการ
print(mc.getAttr('klong.tx'))
เช่นเดียวกับ setAttr() คือจะใช้ชื่อเต็มหรือชื่อย่อก็ได้ แล้วก็ถ้าเลือกวัตถุอยู่แล้วก็แค่พิมพ์จุดตามด้วยชื่อองค์ประกอบ
mc.select('klong')
print(mc.getAttr('.tx'))
ถ้าจะดูตำแหน่งทั้ง ๓ แกนพร้อมกันก็ใส่ .t
print(mc.getAttr('klong.t'))
นอกจากโหนดหลักของวัตถุแล้ว คราวนี้ลองมาดูโหนดที่เก็บข้อมูลรูปทรงของวัตถุกันบ้าง ลองดูของทรงสี่เหลี่ยมอันเดิม
chue = mc.polyCube(w=9.5,h=10.5,d=8.5,sx=2,sy=2,sz=2,n='klong')
print(mc.listAttr(chue[1],k=1,sn=1))
จะเห็นว่าคราวนี้ใช้เป็น chue[1] ซึ่งคือโหนดที่เก็บชื่อโหนดรูปทรงวัตถุ
จะได้
[u'axx', u'axy', u'axz', u'w', u'h', u'd', u'sw', u'sh', u'sd']
รวมทั้งหมดมี ๙ ตัวซึ่งเป็นองค์ประกอบ
ชื่อในรายการ |
ชื่อเต็ม |
ชื่อย่อ |
ความหมาย |
幅 |
width |
w |
ขนาดตามแนวแกน x |
高さ |
height |
h |
ขนาดตามแนวแกน y |
深度 |
depth |
d |
ขนาดตามแนวแกน z |
幅の分割数 |
subdivisionsWidth |
sw |
จำนวนที่แบ่งตามแนวแกน x |
高さの分割数 |
subdivisionsHeight |
sh |
จำนวนที่แบ่งตามแนวแกน y |
深度の分割数 |
subdivisionsDepth |
sd |
จำนวนที่แบ่งตามแนวแกน z |
軸 |
axis |
ax |
แกนหัน |
โดยที่แกนหันนั้นแบ่งย่อยออกเป็น ๓ แกน เป็น axx axy axz
สามารถใช้ setAttr() และ getAttr() ได้ในลักษณะเดียวกัน เช่น
mc.setAttr(chue[1]+'.w',20)
print(mc.getAttr(chue[1]+'.w'))
ตอนนี้กล่าวถึงไปแค่องค์ประกอบหลักๆซึ่งสามารถคีย์ได้และเป็นกลุ่มที่น่าจะได้ใช้บ่อยที่สุดไปแล้ว แต่ที่จริงยังมีองค์ประกอบอีกจำนวนมากมายที่ไม่ได้พูดถึง
และนอกจากองค์ประกอบมาตรฐานที่มีอยู่แล้วยังสามารถเพิ่มองค์ประกอบที่เราต้องการลงไปใหม่เองได้อีกด้วย
อ้างอิง