ในบทที่ผ่านๆมาได้พูดถึงการสร้างรูปทรงต่างๆและทำให้ย่อขยายเปลี่ยนรูปไปได้ ในระดับนึง แต่ว่าก็ยังมีข้อจำกัดของรูปร่างที่ทำได้ เพราะยังอยู่ในขอบเขตของรูปทรงเริ่มต้น ไม่สามารถแก้ไขอะไรได้มากนัก
สำหรับในบทนี้จะพูดถึงการเปลี่ยนแปลงที่โครงสร้างภายใน ซึ่งจะทำให้สามารถเปลี่ยนแปลงรูปร่างของวัตถุได้อย่างอิสระมากขึ้น
วัตถุประเภทโพลิกอนโดยทั่วไปประกอบขึ้นจาก
จุดยอด (頂点, vertex) ต่างๆ โดยมีเส้นลากระหว่างจุดสองจุดเกิดเป็น
เส้นขอบ (エッジ, edge) และเส้นขอบสามอันขึ้นไปล้อมกันเกิดเป็น
หน้า (フェース, face) ขึ้น
จำนวน ของจุดยอด เส้นขอบ และหน้า สามารถหาได้โดยใช้ฟังก์ชัน polyEvaluate() โดยใส่แฟล็กต่างกันได้แก่ v (vertex), e (edge) และ f (face)
v=1 เป็นการหาจำนวนจุดยอด
e=1 เป็นการหาจำนวนเส้นขอบ
f=1 เป็นการหาจำนวนหน้า
ชื่อวัตถุที่ต้องการหาค่านั้นให้ใส่เป็นอาร์กิวเมนต์ของฟังก์ชัน แต่หากไม่ใส่ชื่อวัตถุจะเป็นการหาค่าของวัตถุที่ถูกเลือกอยู่
ยกตัวอย่างทรงสี่เหลี่ยม
mc.polyCube(w=10,h=2,d=5,sx=1,sy=1,sz=1,n='songsiliam')
v = mc.polyEvaluate(v=1)
e = mc.polyEvaluate(e=1)
f = mc.polyEvaluate(f=1)
print("ทรงสี่เหลี่ยมประกอบด้วย %d จุดยอด %d เส้นขอบ %d หน้า"%(v,e,f))
จะเห็นว่าทรงสี่เหลี่ยมที่ไม่มีการแบ่งส่วนย่อยเลยจะประกอบไปด้วย 8 จุดยอด 12 เส้นขอบ และ 6 หน้า
การเข้าถึงจุดยอดแต่ละอันภายในวัตถุทำได้โดยการใส่ชื่อวัตถุแล้วตามด้วย .vtx[หมายเลข]
ลองพิมพ์
mc.select('songsiliam.vtx[2]')
ก็จะเห็นว่าทรงสี่เหลี่ยมที่ถูกสร้างขึ้นนั้นถูกเลือกที่ตัวจุดยอดจุดหนึ่งอยู่
หมายเลขของจุดจะไล่ตั้งแต่ 0 ไปจนถึงเท่ากับจำนวนจุดยอดลบด้วย 1 ดังนั้นสำหรับทรงสี่เหลี่ยมจะประกอบไปด้วย
.vtx[0] .vtx[1] ไปเรื่อยๆถึง .vtx[7]
หากต้องการเลือกพร้อมกันหลายอันที่มีเลขติดกันก็ทำได้โดยใช้ : เช่น
mc.select('songsiliam.vtx[2:5]')
จะเป็นการเลือกจุดยอดพร้อมกัน ๔ อัน
และถ้าอยากเลือกจุดยอดทั้งหมดก็ทำได้โดยใช้ * เช่น
mc.select('songsiliam.vtx[*]')
จุดยอดทุกจุดจะถูกเลือก
สำหรับเส้นขอบสามารถเข้าถึงได้โดยชื่อวัตถุตามด้วย .e[หมายเลข] ส่วนหน้าก็จะเป็น .f[หมายเลข]
สำหรับทรงสี่เหลี่ยมจะมีเส้นขอบ ๑๒ อัน และมีหน้า ๖ หน้า ก็จะประกอบด้วย
.e[0] .e[1] ไปจนถึง .e[11]
.f[0] .f[1] ไปจนถึง .f[5]
โดยที่เส้นขอบหรือหน้าไหนจะเป็นเลขอะไรนั้นก็มีกำหนดตายตัวอยู่แล้วโดยอัตโนมัติ สามารถรู้ได้จากการลองกดเลือกดูแล้วสังเกตเอาได้ รูปทรงแต่ละชนิดก็กำหนดต่างกันออกไป
นอกจากแค่เลือกด้วย select() แล้วยังอาจใช้กังฟังก์ชันอื่นเช่น delete() เพื่อลบ
mc.polyCube(w=10,h=2,d=5,sx=1,sy=1,sz=1)
mc.delete('.f[0:1]','.f[4]')
จะได้ทรงสี่เหลี่ยมที่ถูกลบหน้าไป ๓ หน้า เหลือแค่ ๓ หน้า
ต้องระวังอย่างหนึ่งว่าหากลบหน้าไปแล้ว ตัวเลขชี้หน้าอื่นๆที่เหลืออาจเปลี่ยนแปลงไปหมดได้ ดังนั้นหลังจากลบไปแล้วจะทำอะไรต่อต้องดูเลขชี้หน้าใหม่ทุกครั้ง
ลองสร้างทรงสี่เหลี่ยมขึ้นมาแล้วพิมพ์ mc.delete('.f[0]') ซ้ำไปเรื่อยๆ จะพบว่าหน้าค่อยๆหายไปทีละหน้า ที่เป็นแบบนี้เพราะพอกดลบห้าน .f[0] ไปก็จะมีหน้าอื่นกลายเป็น .f[0] แทน เพราะเป็นเลขตัวแรก ต่อให้เหลือหน้าเดียวยังไงก็ต้องมีวัตถุชื่อ .f[0] แน่นอน
ดังนั้นหากพิมพ์ mc.delete('.f[0]') ไป ๕ ครั้งก็จะเหลือแค่หน้าเดียว อย่างไรก็ตามจะไม่สามารถลบหน้าทั้งหมดจนเหลือศูนย์หน้าได้ หากจะลบก็ทำการลบทั้งวัตถุไปเลย
ด้วยการจัดการกับส่วนประกอบทีละตัวเราสามารถเปลี่ยนแปลงรูปร่างของของวัตถุได้อย่างอิสระ เช่นอาศัยการย้ายจุดยอด
ลองสร้างทรงสี่เหลี่ยมขึ้นมาแล้วย้ายมุมหนึ่งไปจะได้รูปร่างที่แปลกออกไป
mc.polyCube(w=10,h=10,d=10,sx=1,sy=1,sz=1)
mc.move(-4,-4,-4,'.vtx[3]')
หรืออาจทำการย้ายเส้นขอบ ซึ่งก็จะเป็นการย้ายจุดยอดที่เป็นส่วนประกอบของเส้นขอบนั้นพร้อมกันสองจุด หรือถ้าย้ายหน้าก็จะเป็นการย้ายจุดที่เป็นส่วนประกอบของหน้านั้นทั้งหมดที เดียว
อาจทำการหมุนหรือย่อขยายส่วนประกอบเพื่อเคลื่อนย้าย
คำสั่ง move(), rotate() และ scale() เมื่อใช้กับส่วนประกอบย่อยของวัตถุจะเป็นการเคลื่อนย้ายจุดยอดต่างๆ ไม่ใช่การเปลี่ยนแปลงค่าองค์ประกอบต่างๆเช่นมุมหมุนหรือมาตราส่วน
เช่นการใช้ scale() ถ้าค่าน้อยกว่าหนึ่งจะเป็นการลดระยะห่างระหว่างจุดลง ถ้ามากกว่าหนึ่งจะเป็นการเคลื่อนให้ห่างไปมากขึ้น
mc.polyPrism(ns=10,l=4,w=5)
mc.scale(0.3,1.5,0.3,'.e[20]','.e[22]','.e[24]','.e[26]','.e[28]')
จะได้รูปดาว
ลองสร้างทรงกระบอกแล้วจับมาหมุนบิด
mc.polyCylinder(r=5,h=10,sx=18,sy=1,sz=0)
mc.rotate(0,90,0,'.f[19]')
อาจใช้ for เพื่อเข้าถึงส่วนประกอบหลายๆตัว ทำออกมาเป็นรูปสวยๆได้
mc.polyCylinder(r=5,h=10,sx=36,sy=1,sz=2)
for i in range(72,108,2):
mc.move((i-72.)/2,'.vtx[%d:%d]'%(i,i+1),y=1)
หากต้องการเข้าถึงด้านทั้งหมดเพื่อทำอะไรก็อาจใช้ for โดยหาขอบเขตด้วย polyEvaluate() เช่นลอง
import math
mc.polyPlane(w=10,h=10,sx=40,sy=40)
for i in range(mc.polyEvaluate(v=1)):
mc.move(math.sin(0.5*i),'.vtx[%d]'%i,y=1)
ก็จะได้พื้นผิวลูกคลื่นสวยๆมา
หรือทรงกลมหน้าตาคล้ายผลไม้ที่มีผิวขรุขระ
import math
mc.polySphere(r=10,sx=50,sy=50)
for i in range(mc.polyEvaluate(v=1)):
mc.move(math.sin(3*i),'.vtx[%d]'%i,y=1,r=1)
จบบทนี้ไปแล้วเราสามารถสร้างรูปทรงที่หลากหลายได้มากมาย ไม่จำกัดแค่เพียงรูปทรงพื้นฐานอีกต่อไปแล้ว
อ้างอิง