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

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文