φυβλαςのβλογ
บล็อกของ 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
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา 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月

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

ไทย

日本語

中文