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



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

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

เช่น ลองพิมพ์คำสั่งสร้างลูกบาศก์
mc.polyCube()

เราก็จะได้ลูกบาศก์ที่มีขอบเป็นสีเขียว



ถ้ามีการสร้างวัตถุขึ้นมาใหม่ก้อนเดิมจะสูญเสียสภาพถูกเลือก ก้อนสุดท้ายที่สร้างจะอยู่ในสถานะถูกเลือก

แต่ในบางครั้งก็จำเป็นต้องกลับมาจับวัตถุที่สร้างขึ้นมาก่อนหน้า กรณีนั้นต้องกลับมากดเลือกวัตถุเดิมใหม่

การเลือกวัตถุนั้นถ้าควบคุมในหน้าจอก็แค่ใช้เมาส์คลิกง่ายๆ แต่หากจะสั่งเลือกวัตถุด้วยการพิมพ์โค้ดก็สามารถทำได้โดยใช้ฟังก์ชัน select() ซึ่งเป็นคำสั่งสำหรับทำให้วัตถุอยู่ในสถานะถูกเลือก

วิธีการใช้ select() ให้พิมพ์ mc.select('ชื่อวัตถุ')

จะเห็นว่าคำสั่งนี้ต้องระบุ "ชื่อ" ของวัตถุที่เราต้องการเลือก ดังนั้นหากไม่รู้ชื่อก็จะไม่สามารถเลือกได้

ชื่อของวัตถุสามารถดูได้จากเอาต์ไลเนอร์ซึ่งสามารถเปิดดูได้โดยกดที่แถบทางซ้าย ดังรูป



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



พอคลิกที่ชื่อวัตถุก็จะถูกเลือกไปด้วยทำให้เรารู้ว่าชื่อไหนคือวัตถุไหน

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

ดังนั้นในกรณีนี้หากเราพิมพ์
mc.select('pCube1')

ก็จะพบว่า pCube1 อยู่ในสถานะถูกเลือก



อย่างไรก็ตามหากไม่ชอบชื่อที่ถูกตั้งให้โดยอัตโนมัติเราสามารถทำการกำหนดชื่อเองได้ตั้งแต่ตอนที่สร้างวัตถุขึ้นมา

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

การตั้งชื่อให้วัตถุสามารถทำได้โดยตอนที่ใช้ฟังก์ชันสำหรับสร้างวัตถุนั้นให้เพิ่มแฟล็กไปอีกตัว นั่นก็คือแฟล็ก n (name) โดยพิมพ์ n='ชื่อที่ต้องการ'

เช่น ถ้าเราสร้างทรงกลมขึ้นมาอันนึงตั้งใจจะให้มันเป็นไข่มังกรขนาด ๑๕ ซม. เราก็พิมพ์
mc.polySphere(r=7.5,n='khaimangkon')

ถ้าจะสร้างน้ำตาลก้อนขนาด ๑ ซม. ก็พิมพ์
mc.polyCube(w=1,h=1,d=1,n='namtankon')

เป็นต้น



ค่าของแฟล็ก n นี้จำเป็นต้องเป็นตัวแปรชนิดสายอักขระ ชื่อจะตั้งเป็นอะไรก็ได้ แต่ต้องประกอบด้วยตัวอักษรภาษาอังกฤษกับตัวเลขและเครื่องหมาย _ เท่านั้น ใช้ตัวอักษรภาษาไทยไม่ได้ ดังนั้นหากอยากตั้งชื่อเป็นภาษาไทยก็ต้องทับศัพท์เอาเท่านั้น

หลักการเขียนทับศัพท์แบบมาตรฐาน https://en.wikipedia.org/wiki/Royal_Thai_General_System_of_Transcription

เมื่อตั้งชื่อไว้แล้วก็สามารถอ้างอิงถึงไข่มังกรของเราได้ด้วยฟังก์ชัน select() ได้ โดยพิมพ์ mc.select('khaimangkon')

หรือหากต้องการเลือกวัตถุทั้ง ๒ ชิ้นพร้อมกันก็ใส่ชื่อของวัตถุลงไป ๒ อันโดยคั่นด้วย , เช่น
mc.select('khaimangkon','namtankon')

และหากต้องการเลือกหลายชิ้นก็ให้ไล่ใส่ชื่อที่ต้องการลงไปให้หมด จะกี่ชิ้นก็ได้

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

การเลือกวัตถุนั้นมีความสำคัญ เพราะมีฟังก์ชันจำนวนมากมายที่ทำงานกับวัตถุที่ถูกเลือกอยู่เท่านั้น เช่น move() ซึ่งจะทำการย้ายวัตถุที่ถูกเลือก เช่นถ้าพิมพ์ (ก่อนพิมพ์ลบวัตถุที่สร้างก่อนหน้านี้ทั้งหมดก่อน)
mc.polySphere(r=7.5,n='khaimangkon')
mc.polyCube(w=1,h=1,d=1,n='namtankon')
mc.select('khaimangkon')
mc.move(-10,8,10)

โปรแกรมจะย้ายไข่มังกร แทนที่จะย้ายก้อนน้ำตาล แต่ถ้าหากตัดบรรทัด mc.select('khaimangkon') ทิ้งไปวัตถุที่ถูกย้ายก็คือก้อนน้ำตาล ซึ่งเป็นวัตถุที่ถูกสร้างขึ้นมาล่าสุด



อย่างไรก็ตามฟังก์ชัน move สามารถระบุตัววัตถุที่ต้องการเคลื่อนย้ายลงไปได้ โดยไม่จำเป็นต้องเป็นวัตถุที่เลือกอยู่ ทำได้โดยการใส่ชื่อของวัตถุที่ต้องการย้ายลงไปด้านหลังพิกัดที่ต้องการ เช่น
mc.move(10,8,10,'khaimangkon')

คราวนี้จะพบว่าได้ผลเหมือนกับการพิมพ์ mc.select('khaimangkon') ก่อนแล้วค่อยตามด้วย mc.move(10,8,10) แต่ที่ต่างก็คือวัตถุที่ถูกเลือกอยู่คือก้อนน้ำตาล

ชื่อวัตถุซึ่งถูกใส่ลงไปด้านหลังค่าตำแหน่งพิกัดนั้นคืออาร์กิวเมนต์ตัวที่ ๔ ของฟังก์ชัน move() โดยอาร์กิวเมนต์ตัวนี้เป็นชนิดสายอักขระ ซึ่งต่างจาก ๓ ตัวแรกที่เป็นชนิดจำนวนจริง

อย่างไรก็ตามไม่จำเป็นว่าชื่อจะต้องอยู่ ในตำแหน่งที่ ๔ ในกรณีที่ไม่จำเป็นต้องใส่ตำแหน่งพิกัดครบทั้ง ๓ ก็ใส่พิกัดแค่เท่าที่จำเป็นแล้วก็ต่อด้วยชื่อวัตถุ เช่น
mc.move(10,8,'khaimangkon',yz=1)

จะเป็นการย้ายไข่มังกรไปในแนวพิกัด y และ z โดยแนว x ไม่มีการเปลี่ยนแปลง

ที่ต้องเน้นก็คือชื่อของวัตถุจะต้องอยู่ในตำแหน่งหลังจากค่าตำแหน่งพิกัดเสมอ ไม่ว่าจะมีกี่ตัวก็ตาม และหากจะใส่แฟล็กลงไปอีกก็จะต้องใส่ไว้ข้างหลัง เช่น
mc.move(10,10,10,'khaimangkon',r=1)

และก็เช่นเดียวกับฟังก์ชัน select() ฟังก์ชัน move() ก็สามารถใส่ชื่อของวัตถุได้ทีละมากกว่าหนึ่ง เช่น
mc.move(10,10,10,'khaimangkon','namtankon',r=1)

แบบนี้จะเป็นการย้ายทั้งไข่มังกรและน้ำตาลก้อน

แต่ต้องระวังว่าถ้าไม่ใส่แฟล็ก r=1 แล้ว วัตถุทั้งหมดที่ถูกเลือกจะไปอยู่ตำแหน่งเดียวกันหมด ซึ่งอาจจะซ้อนทับกันได้

ฟังก์ชัน delete() เองก็สามารถใส่อาร์กิวเมนต์เป็นชื่อของวัตถุที่ต้องการลบเช่นกัน ในขณะที่หากไม่ใส่อะไรลงไปก็จะเป็นการลบวัตถุที่ถูกเลือกอยู่

เช่นพิมพ์
mc.delete(10,10,10,'khaimangkon','namtankon')

ทั้งไข่มังกรและน้ำตาลก้อนก็จะถูกลบไม่ว่าจะเลือกอะไรอยู่ก็ตาม



กรณีที่ต้องการเปลี่ยนชื่อสามารถทำได้โดยง่ายด้วยฟังก์ชัน rename() โดยใส่ชื่อเก่าแล้วตามด้วยชื่อใหม่ เช่น
mc.polyCube(w=1,h=1,d=1,n='lukbat1')
mc.rename('lukbat1','lukbatleklekluknueng')

ก็จะได้ทรงสี่เหลี่ยมลูกบาศก์ที่ชื่อว่า 'lukbatleklekluknueng'

ฟังก์ชัน select() นั้นนอกจากจะแค่ใส่อาร์กิวเมนต์เป็นชื่อของวัตถุที่ต้องการเลือกแล้ว ยังสามารถใส่แฟล็กเพิ่มเติมลงไปได้หลายตัว ขอยกที่สำคัญมาดังนี้

add (add) ถ้า add=1 จะเพิ่มวัตถุที่ระบุให้อยู่ในสถานะถูกเลือก เทียบเท่ากับการกด shift ค้างแล้วคลิกวัตถุที่ยังไม่ได้ถูกเลือกอยู่

cl (clear) ถ้า cl=1 จะเคลียร์สถานะถูกเลือกออกจากวัตถุทั้งหมด เทียบเท่ากับการคลิกลงบนที่ว่างในหน้าจอควบคุม

d (deselect) ถ้า d=1 จะเอาวัตถุที่ระบุออกจากสถานะถูกเลือก เทียบเท่ากับการกด shift ค้างแล้วคลิกวัตถุที่ทำถูกเลือกอยู่

แฟล็กทั้ง ๓ นี้มีค่าเป็นตัวแปรชนิดจริงเท็จ โดยทั่วไปถ้าไม่ใส่จะเท่ากับใส่ให้มีค่าเป็น 0 คือเป็นเท็จ ถ้าจะให้เป็นจริงก็ใส่ =1

กรณีที่ไม่ใส่แฟล็กอะไรลงไปเลย โดยทั่วไปแล้วจะเป็นการเคลียร์สถานะการถูกเลือกออกทั้งหมดแล้วเลือกเฉพาะวัตถุที่ระบุ

ตัวอย่าง ลองเริ่มจากพิมพ์
mc.polySphere(r=1,n='lukkaeo_lek')
mc.move(0,0,10)
mc.polySphere(r=2,n='lukkaeo_klang')
mc.move(0,0,6)
mc.polySphere(r=3,n='lukkaeo_yai')

เมื่อรันแล้วจะได้ทรงกลม ๓ ลูก โดยที่ lukkaeo_yai ถูกเลือกอยู่



จากนั้นลองพิมพ์
mc.select('lukkaeo_lek')

lukkaeo_lek ก็จะถูกเลือก ส่วน lukkaeo_yai จะหลุดออกจากสถานะถูกเลือก

จากนั้นถ้าพิมพ์
mc.select('lukkaeo_klang','lukkaeo_yai',add=1)

lukkaeo_klang และ lukkaeo_yai จะถูกเลือกเพิ่มเข้ามา โดยที่ lukkaeo_lek ก็ยังถูกเลือกอยู่

จากนั้นพิมพ์
mc.select('lukkaeo_yai',d=1)

lukkaeo_yai ก็จะหลุดออกจากสถานะถูกเลือก

แล้วถ้าพิมพ์
mc.select(cl=1)

วัตถุทั้งหมดก็จะหลุดออกจากสถานะถูกเลือก

ทิ้งท้ายว่า ทั้งการตั้งชื่อให้วัตถุตอนที่เริ่มสร้าง และการแก้ชื่อด้วยฟังก์ชัน rename() หากชื่อใหม่ที่ต้องการตั้งขึ้นนั้นมีอยู่ก่อนแล้วมันก็จะทำการเปลี่ยนชื่อ ให้ใหม่โดยอัตโนมัติ โดยทั่วไปจะเป็นการเพิ่มเลข 1 ต่อท้ายชื่อ แต่ถ้ามีเลข 1 อยู่แล้วก็จะต่อท้ายด้วย 2 แล้วก็จะถูกไล่ไปเรื่อยๆ เช่น
mc.polyCube(w=2,h=1,d=3,n='taohu')
mc.polyCube(w=2,h=1,d=3,n='taohu')
mc.polyCube(w=2,h=1,d=3,n='taohu')
mc.polyCube(w=2,h=1,d=3,n='taohu')

จะได้ทรงสี่เหลี่ยมที่ชื่อ taohu, taohu1, taohu2, taohu3



หากพิมพ์ต่อว่า
mc.rename('taohu','taohu3')

taohu ก็จะเปลี่ยนชื่อเป็น taohu4 แทนที่จะเป็น taohu3 ซึ่งมีอยู่แล้ว



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

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

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



อ้างอิง

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


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

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

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

หมวดหมู่

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

ไทย

日本語

中文