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



maya python เบื้องต้น บทที่ ๒: การสร้างรูปทรงพื้นฐาน
เขียนเมื่อ 2016/03/10 15:52
แก้ไขล่าสุด 2021/09/28 16:42
ในบทแรกเราได้แนะนำตัวอย่างการใช้งานไปแล้ว สำหรับในบทนี้จะเริ่มเขียนโค้ด

ให้เริ่มเปิดโปรแกรมมา แล้วเปิดหน้าต่างสคริปต์อีดิเตอร์ขึ้นมา

ก่อนอื่นเริ่มจากคำสั่งที่ง่ายที่สุด นั่นคือเริ่มมาให้พิมพ์ตามนี้ลงในสคริปต์อีดิเตอร์
import maya.cmds as mc
mc.polyCube()

แล้วก็กด ctrl+enter (ใน mac เป็น command+enter) โด้ดจะถูกรัน

จากนั้นก็จะมีสี่เหลี่ยมลูกบาศก์ปรากฏขึ้นมาอันหนึ่งตรงกลางฉาก



โค้ดแค่เพียงสองบรรทัดที่ได้พิมพ์ลงไปนี้ เป็นการสั่งให้โปรแกรมทำการสร้างสี่เหลี่ยมลูกบาศก์ขึ้นมาลูกหนึ่งนั่นเอง นี่เป็นการเริ่มต้นอย่างง่าย

บรรทัดแรกในโค้ดนี้คือคำสั่งนำเข้ามอดูล (ชุดคำสั่ง) ส่วนบรรทัดที่สองเป็นส่วนสั่งการโปรแกรมโดยใช้ฟังก์ชัน

สิ่งที่ต้องทำก่อนเป็นอย่างแรกเมื่อจะใช้งานภาษาไพธอนในโปรแกรมมายาก็คือ การเรียกใช้ชุดคำสั่งที่ต้องการจะใช้ คำสั่งที่ทำหน้าที่นี้คือ import

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

โดยมอดูลที่เก็บฟังก์ชันคำสั่งส่วนใหญ่ในมายานั้นมีชื่อว่า maya.cmds ซึ่งมีติดตั้งไว้อยู่แล้วในโปรแกรม เมื่อพิมพ์ import maya.cmds ไปแล้วก็จะสามารถใช้งานฟังก์ชันต่างๆภายในมอดูลนี้ได้

จากนั้นเวลาจะ เรียกใช้ฟังก์ชันใดๆของมายาก็จะสามารถทำได้โดยการพิมพ์ maya.cmds. ตามด้วยชื่อฟังก์ชัน เช่นฟังก์ชันสร้างวัตถุทรงสี่เหลี่ยม polyCube() สามารถเรียกใช้ได้โดยพิมพ์  maya.cmds.polyCube()

อย่างไรก็ตาม การพิมพ์แบบนี้ค่อนข้างยาวจึงไม่นิยม โดยปกติมักจะมีการย่อ โดยวิธีการใช้โดยทั่วไปคนมักจะพิมพ์
import maya.cmds as mc

ซึ่งเป็นการนำเข้าชุดคำสั่ง maya.cmds พร้อมตั้งชื่อย่อสำหรับใช้แทนให้กับมัน ซึ่งคนส่วนใหญ่จะตั้งเป็น mc ซึ่งย่อมาจาก maya.cmds นั่นเอง แต่ก็มีบางคนที่ย่อเป็น cmds.
import maya.cmds as cmds

ในตัวอย่างทั้งหมดที่จะเขียนนี้จะใช้เป็น mc. ตลอด แต่หากใครไปค้นข้อมูลอ้างอิงตามบางเว็บอาจจะเจอ cmds. ไม่ว่าจะใช้อันไหนก็ตามก็ได้ทั้งนั้น ถ้าจะใช้ตัวย่อไหนก็ใส่ชื่อนั้นตามหลัง as

เมื่อพิมพ์แบบนี้แล้ว หลังจากนี้พอจะเริ่มใช้ฟังก์ชันก็แค่พิมพ์ mc. แล้วตามด้วยชื่อฟังก์ชัน เช่น mc.polyCube() ตามที่พิมพ์ไปข้างต้นนั่นเอง

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

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

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



polyCube() คือฟังก์ชันสำหรับสร้างทรงสี่เหลี่ยม นอกจากฟังก์ชันนี้แล้วก็ยังมีฟังก์ชันสำหรับสร้างรูปทรงอื่นๆ เช่น ทรงกระบอก, ทรงกลม, ฯลฯ

ซึ่งแต่ละอันก็จะมีรายละเอียดต่างกันออกไป แต่ในที่นี้ขอยกแค่ polyCube() มาเป็นตัวอย่างแรกสุดเพราะเป็นรูปทรงพื้นฐานที่เข้าใจง่ายที่สุด

หากพิมพ์แค่ mc.polyCube() ไปแบบนี้เฉยๆโดยที่ไม่ได้ใส่อะไรลงในวงเล็บเราก็จะได้ทรงลูกบาศก์ขนาดกว้าง ยาวสูง ๑ หน่วย นี่เป็นค่ามาตรฐาน แต่ถ้าอยากได้อะไรที่ต่างกันออกไปก็จำเป็นจะต้องใส่อะไรบางอย่างเพิ่มลงในวงเล็บ เช่น
mc.polyCube(w=2,h=3,d=1.5)

แบบนี้ก็จะได้ทรงสี่เหลี่ยมขนาดกว้าง ๒ หน่วย ยาว ๑.๕ หน่วย สูง ๓ หน่วย



สิ่งที่เพิ่มเข้าไปในวงเล็บนั้นจะเห็นได้ว่าแบ่งออกได้เป็น ๓ ส่วน โดยที่มี "," เป็นตัวกั้น โดยในแต่ละส่วนจะเป็นตัวอักษรภาษาอังกฤษ ตามด้วยเท่ากับแล้วก็ค่าตัวเลข

ตัวอักษร w h d ในที่นี้คือตัวแปรเฉพาะสำหรับรับค่าเข้าไปเสริมในฟังก์ชัน ตัวแปรพวกนี้มีชื่อเรียกว่า "แฟล็ก" (flag) เป็นค่าที่ระบุเงื่อนไขเพิ่มเติมให้กับฟังก์ชันเพื่อให้มันทำงานต่างไปจาก ค่าตั้งต้น

w คือขนาดในแนวแกน x ส่วน h คือขนาดในแนวแกน y และ d คือขนาดในแนวแกน z เมื่อระบุค่าทั้งหมดลงไปก็จะได้ทรงสี่เหลี่ยมขนาดตามที่ต้องการ

ถ้าหากค่าไหนไม่ระบุก็จะมีค่าเป็น ๑ ซึ่งเป็นค่าตั้งต้น เช่นถ้าพิมพ์ mc.polyCube(w=2) ก็จะได้ทรงที่เหลี่ยมกว้าง ๒ ยาว ๑ สูง ๑

แฟล็กไม่มีลำดับตายตัว จะเขียนอะไรก่อนก็ได้ ดังนั้นหากเขียนเป็น
mc.polyCube(h=3,d=1.5,w=2)

ก็จะได้ผลเหมือนเดิมทุกประการ

โดยทั่วไปแล้วแฟล็กจะเขียนได้ ๒ แบบ คือชื่อเต็มกับชื่อย่อ

โดย w,h,d นี้เป็นชื่อย่อ หากเขียนชื่อเต็มจะเป็น width,height,depth

ดังนั้นหากเขียนเป็น
mc.polyCube(width=2,height=3,depth=1.5)

ก็จะได้ผลไม่ต่างอะไรจากเดิม เพียงแต่เขียนยาวขึ้นเท่านั้น

โดยทั่วไปแล้วใช้ชื่อย่อจะเขียนง่ายกว่า เพราะมักเป็นตัวอักษรความยาว ๑ ถึง ๓ อักษร เพียงแต่มองแล้วอาจเดายากว่ามันหมายถึงอะไร ดังนั้นเขียนชื่อเต็มจะมีข้อดีคือชัดเจนกว่า

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

ค่าที่ใส่ลงไปนั้นไม่จำเป็นต้องเป็นค่าตัวเลข แต่อาจเป็นตัวแปรที่เก็บค่าตัวเลขเอาไว้ก็ได้ เช่น
kwang = 3 #ความกว้าง
yao = 2 #ความยาว
sung = 1.5 #ความสูง
mc.polyCube(w=kwang,h=sung,d=yao)

ตัวแปรในภาษาไพธอนสามารถกำหนดค่าแล้วใช้ได้ทันทีโดยที่ไม่ต้องประกาศล่วงหน้า และไม่ต้องระบุชนิดของตัวแปรด้วย โดยจะถูกตีความโดยอัตโนมัติ สำหรับตัวแปรที่เป็นตัวเลขนั้นถ้าหากไม่มีจุดทศนิยมอยู่ก็จะถือว่าเป็น ตัวแปรชนิดจำนวนเต็ม (int) แต่ถ้ามีก็ถือเป็นจำนวนจริง (float)

ปกติแล้วแฟล็กจะระบุตายตัวว่าต้องการค่าตัวแปรประเภทไหน ในกรณีฟังก์ชัน polyCube() นี้ ทั้ง w,h,d ต้องการค่าชนิดจำนวนจริง แต่จะใส่ค่าเป็นจำนวนเต็มไปก็ได้เช่นกัน แต่ถ้าแฟล็กไหนต้องการจำนวนเต็มแล้วใส่ค่าที่มีทศนิยมลงไปมันก็จะทำการ ปัดเศษ

ชื่อตัวแปรจะใช้เป็นอะไรก็ได้ จะตั้งให้ตรงกับชื่อแฟล็กก็ได้ เช่น
w = 3
h = 2
d = 1.5
mc.polyCube(w=w,h=h,d=d)

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

หรืออาจจะใช้เป็นนิพจน์ทางคณิตศาสตร์ก็ได้อีกเช่นกัน เช่น
mc.polyCube(w=10000/5+17*98,h=1+2+3+4,d=(2**2**2)**2)

แต่ถ้าใส่ค่าที่ไม่ใช่จำนวนตัวเลขลงไป เช่นใส่สายอักขระ (string) ลงไป เช่น
mc.polyCube(w='nueng',h='songroi',d='samchutha')

โปรแกรมจะขัดข้องทันที

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



ฟังก์ชัน polyCube นี้มีแฟล็กอยู่หลายตัว แต่ในที่นี้จะกล่าวถึงแค่ส่วนหนึ่งเท่านั้นในเบื้องต้นนี้

ขอยกแฟล็กขึ้นมาอีก ๓ ตัว คือ sx (subdivisionsX), sy (subdivisionsY) และ sz (subdivisionsZ)

ลองพิมพ์ตามนี้
mc.polyCube(w=20,h=3,d=1.5,sx=4,sy=3,sz=1)

ก็จะเห็นว่าได้ทรงสี่เหลี่ยมที่มีขนาดเท่ากับตอนแรก แต่มีการแบ่งเป็นส่วนตามจำนวนที่ระบุไว้ใน sx, sy, sz ซึ่งแทนจำนวนส่วนที่แบ่งตามแนวแกน x,y,z ตามลำดับ



การแบ่งส่วนในที่นี้คือการแบ่งโพลิกอน ยิ่งแบ่งย่อยมากก็ยิ่งสามารถนำไปปรับแต่งดัดรูปได้มาก



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

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

นอกจากนี้ยังอาจลบได้ด้วยฟังก์ชัน delete() โดยกดเลือกวัตถุแล้วพิมพ์ mc.delete() ลงไปได้เลย

หากต้องการย้อนกลับสิ่งที่เคยทำไปแล้วปกติจะใช้คำสั่ง "ทำกลับ" โดยกด ctrl+z (ใน mac เป็น command+z) หรือไปที่ edit (編集) > undo (元に戻す)

ลองกดพิมพ์โค้ดเพื่อสร้างทรงสี่เหลี่ยมขึ้นมาใหม่แล้วกดไปดูที่ undo จะเห็นว่าในส่วนของ undo นันมีการเขียนโค้ดที่เราได้ทำเอาไว้

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



นอกจากลูกบาศก์แล้วอาจลองสร้างทรงกลมได้ โดยใช้ฟังก์ชัน polySphere() เช่น
mc.polySphere()

ก็จะได้ทรงกลมรัศมี  ๑ หน่วยออกมา นี่เป็นรัศมีตั้งต้นในกรณีที่ไม่ระบุแฟล็ก ส่วนจำนวนส่วนที่แบ่งนั้นจะเห็นว่าตามแนวลองจิจูดเป็น ๒๐ และตามแนวละติจูดก็เป็น ๒๐



เราสามารถระบุรัศมีและจำนวนที่แบ่งได้
mc.polySphere(r=5,sx=8,sy=8)

ก็จะได้ทรงกลมรัศมี ๕ โดยที่ r (radius) ในที่นี้เป็นตัวระบุรัศมีนั่นเอง ส่วน sx เป็นจำนวนแบ่งตามแนวลองจิจูด และ sy เป็นจำนวนแบ่งตามแนวละติจูด



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

นอกจากนี้ยังมี
- ทรงกระบอก polyCylinder()
- ทรงกรวย polyCone()
- ทรงปริซึม polyPrism()
- ทรงพีรามิด polyPyramid()
- ระนาบสี่เหลี่ยม polyPlane()
เป็นต้น

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

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

แต่สร้างขึ้นมาแล้วเราจะทำอะไรกับมันต่อไปได้นั้น จะพูดถึงในบทถัดๆไป

อ้างอิง

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


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

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

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

หมวดหมู่

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

ไทย

日本語

中文