ใน
บทที่แล้วเราได้เรียนรู้วิธีการสร้างวัตถุขึ้นมาแล้ว แต่วัตถุที่สร้างมานั้นทั้งหมดถูกวางอยู่ที่จุดกึ่งกลางจุดเดิมจุดเดียว ทั้งหมด ดังนั้นในบทนี้จะพูดถึงการทำให้วัตถุไปอยู่ที่จุดอื่น
ฟังก์ชันที่ใช้ในการย้ายตำแหน่งวัตถุคือ move()
ขอยกตัวอย่าง โดยเริ่มต้นพิมพ์ตามนี้
import maya.cmds as mc
mc.polyCube(w=2,h=2,d=3)
mc.move(2,5,3)
แบบนี้แล้วก็จะปรากฏทรงสี่เหลี่ยมขนาด (2,2,3) ที่ตำแหน่ง x=2,y=5,z=3
โดยปกติแล้ววัตถุที่ถูกสร้างขึ้นใหม่จะมีจุดศูนย์กลางอยู่ที่จุด (0,0,0) คือจุดกึ่งกลาง หรือจุดกำเนิดนั่นเอง ดังนั้นหากต้องการให้มันไปอยู่จุดอื่นก็ต้องย้ายมันหลังจากที่สร้างไปแล้ว อีกที
ฟังก์ชัน move() จะทำการย้ายวัตถุที่เลือกอยู่ไปยังตำแหน่งที่ระบุไว้ ในที่นี่จะทำการย้ายวัตถุที่เพิ่งสร้างเสร็จทันทีเนื่องจากวัตถุที่เพิ่งสร้างเสร็จจะอยู่ในสภาพถูกเลือกอยู่แล้ว
แต่ถ้าใครที่พิมพ์ฟังก์ชัน polyCube() เพื่อสร้างวัตถุขึ้นมาก่อนแล้ว จะพิมพ์ move() ต่อไปเลยก็ได้ เพียงแต่ต้องระวังว่าวัตถุนั้นจะต้องอยู่ในสภาพถูกเลือกอยู่ ไม่เช่นนั้นจะไม่มีการเคลื่อนย้ายใดๆ
สิ่งสำคัญที่น่าสังเกตก็คือ สิ่งที่อยู่ภายในวงเล็บของฟังก์ชันนี้คือค่าตัวเลขซึ่งไม่มีตัวแปร (แฟล็ก) ใดๆ มารองรับ ซึ่งจะแตกต่างจากฟังก์ชัน polyCube() ซึ่งต้องมี w=,h=,d=
ค่าตัวเลขที่อยู่ภายในวงเล็บของฟังก์ชัน move() นั้นเรียกว่า
อาร์กิวเมนต์ (argument) เป็นตัวแปรหลักที่ระบุตายตัวอยู่แล้วว่าจะต้องใส่อะไรลงไปบ้าง จึงไม่ต้องมีตัวแปรมาเป็นตัวรับ แต่จะต้องใส่ให้ถูกต้องตามลำดับ จะสลับกันไม่ได้เลย
อย่างกรณีของ move() นั้นอาร์กิวเมนต์ลำดับที่ ๑, ๒, ๓ เป็นตำแหน่งในแกน x, แกน y และ z ตามลำดับ
แต่ไม่ใช่ว่าจะต้องใส่อาร์กิวเมนต์ทั้งหมดจึงจะทำงาน ในแต่ละฟังก์ชันมีกำหนดจำนวนอาร์กิวเมนต์สูงสุดและต่ำสุดอยู่ สำหรับ move() นั้นอาจไม่ต้องมีอาร์กิวเมนต์เลยสักตัวเลยก็ได้ เช่นพิมพ์ mc.move() ผลที่ได้ก็คือวัตถุจะได้ไปอยู่ที่ตำแหน่ง (0,0,0) เพราะอาร์กิวเมนต์ที่ไม่ได้ระบุค่าจะถือว่าได้รับค่าเป็นค่าตั้งต้น ในทีนี้คือ 0
หรือกรณีใส่แค่ตัวเดียวมันจะเป็นการระบุค่าการเคลื่อนที่ในแนวแกน x อย่างเดียวส่วนแนวแกน y และ z จะเป็น 0
และก็ไม่ใช่ว่าฟังก์ชันที่มีอาร์กิวเมนต์แล้วจะไม่มีแฟล็ก ทุกฟังก์ชันล้วนมีแฟล็กอยู่ทั้งนั้น ขึ้นอยู่กับว่าจะใส่หรือเปล่า ทั้งแฟล็กและอาร์กิวเมนต์เป็นสิ่งที่จะใส่ก็ได้ไม่ใส่ก็ได้ ขึ้นกับเงื่อนไขของฟังก์ชัน
หากจะใส่แฟล็กลงไปในฟังก์ชันที่มี อาร์กิวเมนต์อยู่แล้ว จะต้องใส่ไว้ข้างหลังต่อจากอาร์กิวเมนต์ตัวสุดท้าย เช่น ในที่นี้จะขอแนะนำแฟล็กที่สำคัญตัวหนึ่งก่อน นั่นคือ r(relative)
เพื่อให้เห็นภาพลองทำตามดูโดยให้กดเลือกวัตถุที่ถูกย้ายตำแหน่งไปแล้วในตัวอย่างข้างต้น (ใครลบไปแล้วก็สร้างใหม่) จากนั้นพิมพ์
mc.move(0,0,2,r=1)
เสร็จ แล้วก็จะพบว่าวัตถุเลื่อนไปตามแนวแกน z อีก ๒ หน่วย หากลองพิมพ์ซ้ำใหม่ก็จะเห็นมันเลื่อนไปอีก ๒ หน่วย ถ้าลองเปลี่ยนเป็น mc.move(0,0,-2, r=1) มันก็จะเลื่อนกลับไป
สามารถใช้วิธีการใช้เมาส์ ลากคลุมโค้ดแล้วค่อยกด ctrl+enter ข้อความจะไม่หายไป กดซ้ำได้เรื่อยๆ แล้วจะเห็นวัตถุเลื่อนไปเรื่อยๆทุกครั้งที่กด
ทีนี้ลองใหม่โดยเปลี่ยนเป็น
mc.move(0,0,2,r=0)
คราวนี้จะพบว่าวัตถุถูกย้ายไปอยู่ตำแหน่ง (0,0,2) แทนที่จะเป็นการย้ายตามแกน z ๒ หน่วย
แฟล็ก r ในที่นี้เป็นตัวระบุว่าเราจะเคลื่อนที่แบบสัมบูรณ์หรือสัมพัทธ์ ถ้าระบุ r=0 จะเป็นสัมบูรณ์ ก็คือย้ายไปยังตำแหน่งที่เทียบกับจุดกึ่งกลาง แต่ถ้า r=1 จะเป็นสัมพัทธ์ คือเทียบกับตำแหน่งเดิม
โดยทั่วไปแล้วหากไม่ระบุ แฟล็ก r มันจะเท่ากับ 0 โดยอัตโนมัติ ดังนั้น r=0 จึงไม่มีความจำเป็นต้องเขียน โดยทั่วไปจะเขียนเมื่อ r=1 เท่านั้น
แฟล็ก ประเภทนี้เป็นประเภทที่รับค่าแค่สองชนิด คือจริงกับเท็จ ถ้าเป็นจริงใส่ 1 ถ้าเป็นเท็จใส่ 0 สำหรับชื่อแฟล็ก r ในที่นี้ย่อมาจาก relative ซึ่งแปลว่าสัมพัทธ์ จึงมีความหมายเป็นการระบุว่าเราต้องการให้มันเคลื่อนที่แบบสัมพันธ์จริงหรือ เปล่า ถ้าเท็จมันก็จะไม่เคลื่อนที่แบบบสัมพัทธ์ ก็คือจะเป็นแบบสัมบูรณ์
อนึ่ง 0 และ 1 นี้ความจริงแล้วใช้เขียนแทนค่าความจริงเท็จ False และ True (ขึ้นต้นตัวพิมพ์ใหญ่เสมอ) จะเขียนแบบไหนก็ได้
ปกติแล้วเลข 0 จะใช้แทน False ส่วน True นั้นจะใช้ตัวเลขอะไรก็ได้นอกจาก 0 แทนได้หมด แต่ที่มักใช้คือ 1
(รายละเอียดเกี่ยวกับเรื่องนี้อ่านในบทเรียนภาษาไพธอนเบื้องต้นบทที่ ๖
https://phyblas.hinaboshi.com/tsuchinoko06)
เพื่อความกะทัดรัดในที่นี้จึงจะใช้ 0 และ 1 ตลอด แทนที่ False และ True
กรณีที่ต้องการให้เคลื่อนที่แค่เฉพาะในแนวแกนบางแกน ก็สามารถใช้แฟล็กระบุได้ โดยแฟล็กที่เกี่ยวข้องมีทั้งหมด ๖ ตัว ดังนี้
x (moveX)
y (moveY)
z (moveZ)
xy (moveXY)
xz (moveXZ)
yz (moveYZ)
แฟล็กทั้งหมดนี้รับค่าเป็นตัวแปรชนิดจริงเท็จ คือมีค่าเป็น 1 หรือ 0 (True หรือ False) เท่านั้น
โดยทั่วไปแล้วถ้าไม่ระบุมันจะมีค่าเป็น 0 ซึ่งเป็นค่าตั้งต้นทั้งหมด เวลาที่ใช้งานมักจะใส่แค่อันใดอันหนึ่งให้เป็น 1 ไม่มีการใช้พร้อมกัน
ความหมายของแฟล็กเหล่านี้ก็จะตรงตัวตามอักษร เช่นถ้า y=1 หมายความว่าเราจะเลื่อนแค่ตามแนวแกน y ส่วนแนว x กับ z ไม่ยุ่ง ในขณะที่ถ้า yz=1 จะหมายถึงเลื่อนแกน y กับ z ไม่เลื่อน x
อาร์กิวเมนต์ที่ต้องการจะมีจำนวนเท่ากับจำนวนแนวแกนพิกัดที่ต้องการย้าย เช่นถ้า y=1 จะใส่อาร์กิวเมนต์แค่ตัวเดียว
ดูตัวอย่างเพื่อความเข้าใจ อาจลองคัดลอกไปรันทีละบรรทัดแล้วดูผลตาม
mc.move(5,z=1) # เลื่อนไปที่ตำแหน่ง z=5 ส่วน x และ y คงเดิม
mc.move(3,7,yz=1) # เลื่อนไปที่ตำแหน่ง y=3,z=7 ส่วน x คงเดิม
mc.move(3,yz=1) # เลื่อนไปที่ตำแหน่ง y=3,z=0 ส่วน x คงเดิม (เมื่ออาร์กิวเมนต์ระบุไม่ครบ ค่าที่ขาดจะเท่ากับ 0 ทันที)
mc.move(yz=1) # เลื่อนไปที่ตำแหน่ง y=0,z=0 ส่วน x คงเดิม (ไม่ระบุอาร์กิวเมนต์เลย ตัวที่เกี่ยวข้องจะเป็น 0 ทั้งหมด)
mc.move(3,7,5,yz=1) # เลื่อนไปที่ตำแหน่ง y=3,z=7 ส่วน x คงเดิม (อาร์กิวเมนต์ตัวที่ ๓ ไม่ทำงาน จะใส่หรือไม่ก็มีค่าเท่ากัน)
mc.move(4,9,8,y=1) # เลื่อนไปที่ตำแหน่ง y=4 ส่วน x และ z คงเดิม (อาร์กิวเมนต์ตัวที่ ๒ และ ๓ ไม่ทำงาน)
แฟล็กเหล่านี้สามารถใช้ร่วมกับแฟล็ก r ได้ เช่น
mc.move(5,z=1,r=1) # เลื่อนไปตามแนวแกน z เป็นระยะ ๕ หน่วย
mc.move(3,7,yz=1,r=1) # เลื่อนไปตามแนวแกน y เป็นระยะ ๓ หน่วย และ z ๗ หน่วย
อนึ่ง แท้จริงแล้วอาร์กิวเมนต์ของฟังก์ชัน move() ไม่ได้มีแค่ ๓ ตัว ยังมีอีกตัวหนึ่งคือชื่อของวัตถุที่ต้องการเลื่อนซึ่งใช้ในกรณีที่ไม่ได้กด เลือกวัตถุอยู่ แต่จะยังไม่พูดถึง ขอไปพูดถึงในบทที่ ๖
นอกจากนี้ยังมีแฟล็กอยู่อีกหลายตัว ซึ่งก็จะทยอยกล่าวถึงไปเรื่อยๆในบทถัดๆไป ในที่นี้เน้นแค่พื้นฐานที่จำเป็นเพื่อจะไปต่อเรื่องอื่นๆต่อไปได้ก่อน
ผ่านมา ๓ บท ตอนนี้สามารถสร้างวัตถุขึ้นได้ แล้วก็สามารถจัดวางตำแหน่งตามที่ต้องการได้แล้ว
คำสั่งแค่สร้างกับเลื่อนวัตถุนี้เป็นสิ่งที่ทำได้ง่ายๆโดยไม่จำเป็นต้องมาเขียนโค้ด อย่างไรก็ตาม ตอนหน้าเราจะเริ่มทำในสิ่งที่ต้องใช้วิธีการเขียนโค้ดเท่านั้นจึงจะสามารถ ทำได้โดยง่าย นั่นคือสิ่งที่เรียกว่า "กระบวนการทำซ้ำ"
อ้างอิง