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



maya python เบื้องต้น บทที่ ๑๗: การปรับขนาดมาตราส่วน
เขียนเมื่อ 2016/03/11 00:03
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่ผ่านๆมาได้พูดถึงการเคลื่อนย้ายและหมุนวัตถุไปแล้ว นอกจากตำแหน่งและมุมหมุนแล้ว องค์ประกอบที่สำคัญอีกอย่างหนึ่งของวัตถุที่สามารถปรับได้ก็คือขนาด

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

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

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

การปรับมาตราส่วนทำได้โดยใช้ฟังก์ชัน setAttr() โดยจะปรับทีละแกนหรือพร้อมกันทุกแกนก็ได้

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

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

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

ลองดูตัวอย่างนี้ สร้างทรงกลมและทรงกรวยขึ้นมาล้อมแล้วบี้ให้แบน ก็กลายเป็นอะไรคล้ายๆดาวกระจาย หรือดอกไม้
mc.polySphere(r=5) # สร้างทรงกลม
mc.scale(1,0.25,1) # บี้ให้แบน
for i in range(6): # วนซ้ำเพื่อสร้างกลีบดอกทั้ง ๖
    mc.polyCone(r=2,h=8) # สร้างกรวย
    mc.move(0,8,0) # ย้ายไปที่ขอบของวงกลม
    mc.rotate(90,60*i,0,p=[0,0,0]) # หมุนให้อยู่ในตำแหน่งที่ต่างกัน
    mc.scale(1,1,0.2) # บี้ให้แบน



วัตถุที่เคยปรับมาตราส่วนไปแล้ว หากใช้ฟังก์ชัน scale() โดยใส่แฟล็ก r (relative) เพิ่มเข้าไปเป็น r=1 มาตราส่วนก็จะขยายเป็นจำนวนเท่าของมาตราส่วนในปัจจุบัน

เช่นเดียวกับการหมุน การปรับมาตรส่วนเองก็มีจุดพีว็อตของตัวเองอยู่

ชื่อของจุดพีว็อต = ชื่อของวัตถุ.scalePivot

โดยทั่วไปพีว็อตจะอยู่ที่ใจกลางของวัตถุและย้ายไปด้วยกัน ถ้าจะย้ายก็ใช้คำสั่ง move() ได้เลย

ถ้าไม่ย้ายพีว็อตก็สามารถเพิ่มแฟล็ก p (pivot) ลงไปตอนที่ใช้ฟังก์ชัน scale()

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

ลองดูตัวอย่างนี้จะเห็นภาพชัด
for i in range(-5,6):
    mc.polyCylinder(r=10,h=1) # สร้างทรงกระบอก
    mc.move(0,10,0) # ย้ายขึ้นไปด้านบน
    mc.move(0,0,0,'.scalePivot') # ปรับตำแหน่งพีว็อตไปไว้ตรงกลาง
    mc.scale(i,i,i) # ขยายด้วยมาตราส่วนเปลี่ยนไปตาม i



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

จะเห็นว่าเมื่อมาตราส่วนติดลบวัตถุจะไปอยู่ในทิศฝั่งตรงข้าม



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

แต่ถ้าหากเราอยากจะใช้ขนาดที่เปลี่ยนมาแล้วนั้นเป็นมาตรฐานละก็สามารถทำได้โดยใช้ฟังก์ชัน makeIdentity()

ฟังก์ชันนี้ใช้สำหรับปรับให้ค่าองค์ประกอบต่างๆซึ่งได้แก่ตำแหน่ง มุมหมุน และมาตราส่วน ค่าต่างๆทั้งหมดนี้จะถูกปรับให้เป็นสภาพเริ่มต้น นั่นหมายความว่า
ตำแหน่ง [tx,ty,tz] = [0,0,0]
มุมหมุน [rx,ry,rz] = [0,0,0]
มาตราส่วน [sx,ty,sz] = [1,1,1]

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

หากใส่ a=1 จะมีความหมายว่าให้ทำให้ค่าตำแหน่ง มุมหมุน มาตราส่วน ทั้งหมดนี้กลับเป็นค่าเริ่มต้น โดยที่ไม่มีการเปลี่ยนสภาวะที่เห็นในปัจจุบัน

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

เช่นลองใช้กับวัตถุที่มีการเปลี่ยนขนาดไปแล้ว แถมยังมีการหมุนแล้วย้ายตำแหน่งด้วย
mc.polySphere(r=1)
mc.scale(1,0.25,1)
mc.rotate(45,0,0)
mc.move(10,5,5)
mc.makeIdentity(a=1)

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



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

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

กรณีที่ต้องการเปลี่ยนแค่ตำแหน่ง มุมหมุน หรือมาตราส่วน อย่างใดอย่างหนึ่ง ก็สามารถทำได้โดยเพิ่มแฟล็ก t (translate), r (rotate), s (scale) โดยถ้าอันไหนให้ =1 ก็จะเปลี่ยนแปลงแค่อันนั้นเอย่างเดียว ส่วนที่เหลือเหมือนเดิม แต่ถ้าไม่ใส่แฟล็กสามอันนี้เลยก็จะเป็นการเปลี่ยนแปลงทั้งสามอย่างหมด



นอกจากนี้การใช้ makeIdentity() ยังมีประโยชน์ตอนที่ต้องการย่อขยายวัตถุที่มีการหมุนไปแล้ว เพราะปกติการเปลี่ยนขนาดด้วยการปรับมาตราส่วนนั้นแกนขึ้นอยู่กับมุมหมุน ถ้าวัตถุทำมุมเอียงอยู่แกน x y z ก็เอียงตามไปด้วย เช่น
mc.polyCube(w=5,h=5,d=5)
mc.rotate(0,0,45)



จะได้ลูกบาศก์ที่เอียง ๔๕ องศาอยู่ แบบนี้ถ้าหากเรายืดขยายออกในแกน x มันก็ควรจะกลายเป็นสี่เหลี่ยมขนมเปียกปูน

แต่ว่าพอพิมพ์
mc.scale(2,1,1)

กลับจะพบว่ามันไม่ได้ขยายตามแกน x จริงๆ นั่นเพราะแกนที่มันใช้ในการขยายนั้นถูกหมุนเอียงไปตามมุมที่เอียงอยู่ แกน x ก็เลยเอียง ๔๕ องศาอยู่

ในกรณีแบบนี้ใช้ makeIdentity() เพื่อทำให้วัตถุเปลี่ยนสภาพการเปลี่ยนแปลงในตอนนั้นไปเป็นค่าเริ่มต้น แกน x ที่ต้องการขยายก็จะเป็นแกน x ตามที่ปรากฏจริง จากนั้นพอขยายก็จะได้ผลตามที่ต้องการ
mc.polyCube(w=5,h=5,d=5)
mc.rotate(0,0,45)
mc.makeIdentity(a=1)
mc.scale(2,1,1)





อ้างอิง

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


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

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

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

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> mayapython
-- คอมพิวเตอร์ >> 3D >> maya

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
maya
javascript
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
หลักการเขียนทับศัพท์ภาษาจีนกวางตุ้ง
การใช้ unix shell เบื้องต้น ใน linux และ mac
หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 1-12 พ.ค. 2014
แนะนำองค์การวิจัยและพัฒนาการสำรวจอวกาศญี่ปุ่น (JAXA)
เล่าประสบการณ์ค่ายอบรมวิชาการทางดาราศาสตร์โดยโซวเคนได 10 - 16 พ.ย. 2013
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
บันทึกการเที่ยวญี่ปุ่นครั้งแรกในชีวิต - ทุกอย่างเริ่มต้นที่สนามบินนานาชาติคันไซ
หลักการเขียนทับศัพท์ภาษาญี่ปุ่น
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ
ทำไมถึงอยากมาเรียนต่อนอก
เหตุผลอะไรที่ต้องใช้ภาษาวิบัติ?

ไทย

日本語

中文