ในบทที่ผ่านๆมาได้พูดถึงการเคลื่อนย้ายและหมุนวัตถุไปแล้ว นอกจากตำแหน่งและมุมหมุนแล้ว องค์ประกอบที่สำคัญอีกอย่างหนึ่งของวัตถุที่สามารถปรับได้ก็คือขนาด
การ ปรับขนาดของวัตถุนั้นที่จริงสามารถทำได้โดยปรับค่าองค์ประกอบที่เกี่ยวกับ รูปทรง แต่ว่าการปรับด้วยวิธีนี้ขึ้นอยู่กับรูปทรงของวัตถุ ซึ่งถ้าเป็นวัตถุที่ไม่ได้เก็บโหนดรูปทรงวัตถุเอาไว้ก็ไม่สามารถปรับอะไรได้
วิธี การปรับขนาดที่ทำได้ง่ายกว่านั้นและใช้ได้เสมอก็คือการปรับองค์ประกอบมาตร ส่วน ซึ่งเป็นองค์ประกอบหลักอย่างหนึ่งที่ปรากฏในแชนเนลบ็อกซ์ นอกเหนือจากตำแหน่งและมุม
มาตราส่วนแบ่งเป็นองค์ประกอบตามแกน ๓ แกนเช่นเดียวกับตำแหน่งและมุม โดยปกติวัตถุที่เพิ่งถูกสร้างออกมาจะมีค่ามาตราส่วนเป็น 1 ทุกแกน
การปรับมาตราส่วนทำได้โดยใช้ฟังก์ชัน setAttr() โดยจะปรับทีละแกนหรือพร้อมกันทุกแกนก็ได้
หรืออาจทำได้ง่ายกว่านั้นโดยใช้ฟังก์ชัน scale() ซึ่งเป็นคำสั่งสำหรับปรับมาตราส่วนของวัตถุโดยเฉพาะ
การ ปรับมาตราส่วนเฉพาะบางแนวแกนอาจทำให้ได้วัตถุรูปร่างแปลกไปจากรูปทรงพื้นฐาน ที่เคยสร้างได้ เช่นทรงกลมแป้น หรือวัตถุที่ถูกบี้จนแบน หรือดึงยืดออก
เช่นถ้าเอาทรงกลมมาปรับมาตราส่วนเฉพาะแกน y ให้แบนๆก็จะได้วัตถุหน้าตาคล้ายตัวหมากล้อม (โกะ) หรือถ้ายืดออกก็จะได้ทรงรีเหมือนไข่
ลองดูตัวอย่างนี้ สร้างทรงกลมและทรงกรวยขึ้นมาล้อมแล้วบี้ให้แบน ก็กลายเป็นอะไรคล้ายๆดาวกระจาย หรือดอกไม้
mc.polySphere(r=5) # สร้างทรงกลม
mc.scale(1,0.25,1) # บี้ให้แบน
for i in range(6): # วนซ้ำเพื่อสร้างกลีบดอกทั้ง ๖
mc.polyCone(r=2,h=8) # สร้างกรวย
mc.move(0,8,0) # ย้ายไปที่ขอบของวงกลม
mc.rotate(90,60*i,0,p=[0,0,0]) # หมุนให้อยู่ในตำแหน่งที่ต่างกัน
mc.scale(1,1,0.2) # บี้ให้แบน
วัตถุที่เคยปรับมาตราส่วนไปแล้ว หากใช้ฟังก์ชัน scale() โดยใส่แฟล็ก r (relative) เพิ่มเข้าไปเป็น r=1 มาตราส่วนก็จะขยายเป็นจำนวนเท่าของมาตราส่วนในปัจจุบัน
เช่นเดียวกับการหมุน การปรับมาตรส่วนเองก็มีจุดพีว็อตของตัวเองอยู่
ชื่อของจุดพีว็อต = ชื่อของวัตถุ.scalePivot
โดยทั่วไปพีว็อตจะอยู่ที่ใจกลางของวัตถุและย้ายไปด้วยกัน ถ้าจะย้ายก็ใช้คำสั่ง move() ได้เลย
ถ้าไม่ย้ายพีว็อตก็สามารถเพิ่มแฟล็ก p (pivot) ลงไปตอนที่ใช้ฟังก์ชัน scale()
หากลองขยายวัตถุที่อยู่ห่างจากจุดพีว็อตไปมากวัตถุจะถูกย่อขยายไปพร้อมกับ เคลื่อนที่พุ่งเข้าและถอยห่างจุดพีว็อตไปด้วย หากให้นึกภาพแล้วก็เหมือนกับเวลาที่ใช้เลนส์เพื่อขยายวัตถุ ภาพปรากฏห่างก็ยิ่งมีขนาดใหญ่
ลองดูตัวอย่างนี้จะเห็นภาพชัด
for i in range(-5,6):
mc.polyCylinder(r=10,h=1) # สร้างทรงกระบอก
mc.move(0,10,0) # ย้ายขึ้นไปด้านบน
mc.move(0,0,0,'.scalePivot') # ปรับตำแหน่งพีว็อตไปไว้ตรงกลาง
mc.scale(i,i,i) # ขยายด้วยมาตราส่วนเปลี่ยนไปตาม i
ในนี้ให้จุดพีว็อตอยู่ที่ใจกลาง แล้วนำวัตถุที่ถูกสร้างมาขนาดเท่ากันวางอยู่ที่เดียวกันมาขยายด้วยมาตราส่วน ต่างๆ จะได้วัตถุที่ต่างทั้งขนาดและตำแหน่ง
จะเห็นว่าเมื่อมาตราส่วนติดลบวัตถุจะไปอยู่ในทิศฝั่งตรงข้าม
สิ่งที่น่าพูดถึงอีกอย่างก็คือ เวลาที่ปรับมาตราส่วนไปแล้ววัตถุจะจำไว้ว่าตัวมันเดิมทีจริงๆมีขนาดนั้นแล้ว ตอนนี้ขยายมาเท่าไหร่ ถ้าจะเอาไปย่อขยายต่อไปเราก็ต้องจำว่าขนาดของแกนไหนเป็นสัดส่วนที่ถูก เปลี่ยนมาแล้ว
แต่ถ้าหากเราอยากจะใช้ขนาดที่เปลี่ยนมาแล้วนั้นเป็นมาตรฐานละก็สามารถทำได้โดยใช้ฟังก์ชัน makeIdentity()
ฟังก์ชันนี้ใช้สำหรับปรับให้ค่าองค์ประกอบต่างๆซึ่งได้แก่ตำแหน่ง มุมหมุน และมาตราส่วน ค่าต่างๆทั้งหมดนี้จะถูกปรับให้เป็นสภาพเริ่มต้น นั่นหมายความว่า
ตำแหน่ง [tx,ty,tz] = [0,0,0]
มุมหมุน [rx,ry,rz] = [0,0,0]
มาตราส่วน [sx,ty,sz] = [1,1,1]
ดังนั้นโดยทั่วไปแล้วก็คือวัตถุจะกลับมาอยู่ในสภาวะเริ่มต้นทันที เพียงแต่ว่าหากเติมแฟล็กตัวหนึ่ง คือ a (apply) ลงไปก็จะทำให้ผลเปลี่ยนออกไป
หากใส่ a=1 จะมีความหมายว่าให้ทำให้ค่าตำแหน่ง มุมหมุน มาตราส่วน ทั้งหมดนี้กลับเป็นค่าเริ่มต้น โดยที่ไม่มีการเปลี่ยนสภาวะที่เห็นในปัจจุบัน
นั่นหมายความว่าทำให้ สภาพที่เป็นอยู่ในตอนนั้นกลายมาเป็นค่าเริ่มต้นค่าใหม่ ดังนั้นจึงสามารถใช้ประโยชน์ได้เป็นอย่างดี ไม่เพียงแค่เรื่องมาตราส่วน แต่ยังรวมถึงตำแหน่งและมุมหมุน
เช่นลองใช้กับวัตถุที่มีการเปลี่ยนขนาดไปแล้ว แถมยังมีการหมุนแล้วย้ายตำแหน่งด้วย
mc.polySphere(r=1)
mc.scale(1,0.25,1)
mc.rotate(45,0,0)
mc.move(10,5,5)
mc.makeIdentity(a=1)
พอทำแบบนี้ก็จะได้เม็ดโกะที่ตั้งเอียงๆและไม่อยู่ที่ใจกลาง แต่พอลองดูค่าองค์ประกอบก็จะเห็นว่าเป็นค่าตั้งต้นทั้งหมด
แบบนี้แล้วหากต่อจากนี้มีการเคลื่อนย้าย หรือหมุน หรือปรับขนาดอะไรก็ตาม ก็จะเป็นการเปลี่ยนแปลงโดยยึดจากสภาพในตอนนั้น
การทำแบบนี้มีประโยชน์ทำให้อะไรๆสะดวกขึ้น เพราะบางครั้งเราก็ต้องการใช้ตำแหน่งที่ไม่ใช่จุดกึ่งกลางเป็นตำแหน่งอ้างอิง
กรณีที่ต้องการเปลี่ยนแค่ตำแหน่ง มุมหมุน หรือมาตราส่วน อย่างใดอย่างหนึ่ง ก็สามารถทำได้โดยเพิ่มแฟล็ก t (translate), r (rotate), s (scale) โดยถ้าอันไหนให้ =1 ก็จะเปลี่ยนแปลงแค่อันนั้นเอย่างเดียว ส่วนที่เหลือเหมือนเดิม แต่ถ้าไม่ใส่แฟล็กสามอันนี้เลยก็จะเป็นการเปลี่ยนแปลงทั้งสามอย่างหมด
นอกจากนี้การใช้ makeIdentity() ยังมีประโยชน์ตอนที่ต้องการย่อขยายวัตถุที่มีการหมุนไปแล้ว เพราะปกติการเปลี่ยนขนาดด้วยการปรับมาตราส่วนนั้นแกนขึ้นอยู่กับมุมหมุน ถ้าวัตถุทำมุมเอียงอยู่แกน x y z ก็เอียงตามไปด้วย เช่น
mc.polyCube(w=5,h=5,d=5)
mc.rotate(0,0,45)
จะได้ลูกบาศก์ที่เอียง ๔๕ องศาอยู่ แบบนี้ถ้าหากเรายืดขยายออกในแกน x มันก็ควรจะกลายเป็นสี่เหลี่ยมขนมเปียกปูน
แต่ว่าพอพิมพ์
mc.scale(2,1,1)
กลับจะพบว่ามันไม่ได้ขยายตามแกน x จริงๆ นั่นเพราะแกนที่มันใช้ในการขยายนั้นถูกหมุนเอียงไปตามมุมที่เอียงอยู่ แกน x ก็เลยเอียง ๔๕ องศาอยู่
ในกรณีแบบนี้ใช้ makeIdentity() เพื่อทำให้วัตถุเปลี่ยนสภาพการเปลี่ยนแปลงในตอนนั้นไปเป็นค่าเริ่มต้น แกน x ที่ต้องการขยายก็จะเป็นแกน x ตามที่ปรากฏจริง จากนั้นพอขยายก็จะได้ผลตามที่ต้องการ
mc.polyCube(w=5,h=5,d=5)
mc.rotate(0,0,45)
mc.makeIdentity(a=1)
mc.scale(2,1,1)
อ้างอิง