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



maya python เบื้องต้น บทที่ ๓: การจัดวางวัตถุ
เขียนเมื่อ 2016/03/10 16:04
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่แล้วเราได้เรียนรู้วิธีการสร้างวัตถุขึ้นมาแล้ว แต่วัตถุที่สร้างมานั้นทั้งหมดถูกวางอยู่ที่จุดกึ่งกลางจุดเดิมจุดเดียว ทั้งหมด ดังนั้นในบทนี้จะพูดถึงการทำให้วัตถุไปอยู่ที่จุดอื่น

ฟังก์ชันที่ใช้ในการย้ายตำแหน่งวัตถุคือ 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() ไม่ได้มีแค่ ๓ ตัว ยังมีอีกตัวหนึ่งคือชื่อของวัตถุที่ต้องการเลื่อนซึ่งใช้ในกรณีที่ไม่ได้กด เลือกวัตถุอยู่ แต่จะยังไม่พูดถึง ขอไปพูดถึงในบทที่ ๖

นอกจากนี้ยังมีแฟล็กอยู่อีกหลายตัว ซึ่งก็จะทยอยกล่าวถึงไปเรื่อยๆในบทถัดๆไป ในที่นี้เน้นแค่พื้นฐานที่จำเป็นเพื่อจะไปต่อเรื่องอื่นๆต่อไปได้ก่อน



ผ่านมา ๓ บท ตอนนี้สามารถสร้างวัตถุขึ้นได้ แล้วก็สามารถจัดวางตำแหน่งตามที่ต้องการได้แล้ว

คำสั่งแค่สร้างกับเลื่อนวัตถุนี้เป็นสิ่งที่ทำได้ง่ายๆโดยไม่จำเป็นต้องมาเขียนโค้ด อย่างไรก็ตาม ตอนหน้าเราจะเริ่มทำในสิ่งที่ต้องใช้วิธีการเขียนโค้ดเท่านั้นจึงจะสามารถ ทำได้โดยง่าย นั่นคือสิ่งที่เรียกว่า "กระบวนการทำซ้ำ"

อ้างอิง

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


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

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

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

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> 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)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文