φυβλαςのβλογ
phyblas的博客



maya python เบื้องต้น บทที่ ๓๓: การสานพื้นผิวขึ้นจากเส้นโค้ง NURBS
เขียนเมื่อ 2016/03/12 09:38
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่ ๓๑ ได้รู้วิธีการสร้างเส้นโค้ง NURBS ไปแล้ว อย่างไรก็ตามเส้นโค้ง NURBS เป็นสิ่งที่ยังไม่สามารถนำมาใช้งานได้โดยตรงทันที เพราะเป็นสิ่งที่จะมองไม่เห็นเวลาที่เรนเดอร์ออกมา

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

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

ฟังก์ชันที่ใช้สานพื้นผิวขึ้นจากเส้นโค้ง NURBS ก็คือ loft()

loft() เป็นคำสั่งที่ใช้กับเส้นโค้ง NURBS สองเส้นขึ้นไป โดยจะทำการสร้างพื้นผิวเพื่อเชื่อมเส้นโค้งเข้าด้วยกัน

ตัวอย่าง ก่อนอื่นลองสร้างเส้นโค้งขึ้นมาก่อน เป็นเส้นโค้งรูปคลื่น cos
import math
chut = [[0,math.cos(x*math.pi),x] for x in range(11)]
sen1 = mc.curve(ep=chut)
chut = [[-4,4-math.cos(x*math.pi),x] for x in range(11)]
sen2 = mc.curve(ep=chut)
chut = [[-8,math.cos(x*math.pi),x] for x in range(11)]
sen3 = mc.curve(ep=chut)



จากนั้นลองใช้ฟังก์ชัน loft() ดูเลย โดยใส่อาร์กิวเมนต์เป็นชื่อเส้นโค้งทั้ง ๓
mc.loft(sen1,sen2,sen3)

เพียงเท่านี้ก็จะเห็นว่าเกิดพื้นผิว NURBS ขึ้นมาเชื่อมเส้นโค้งทั้ง ๓ เส้นเข้าด้วยกัน



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

เช่นลองเปลี่ยนเป็น
mc.loft(sen2,sen1,sen3)

จะได้เส้นที่ลากจากเส้น 2 > 1 > 3



หรือถ้าสลับลำดับของเส้นทั้งหมด เช่น 3 > 2 > 1 จะได้ผิวในทิศตรงกันข้ามกับ 1 > 2 > 3
mc.loft(sen3,sen2,sen1)



ซึ่งการที่ด้านหันหน้าลงแบบนี้อาจเป็นผลที่ผิดจากที่ต้องการ หากว่าทิศของหน้าที่หันไม่เป็นไปตามที่ต้องการแบบนี้ให้เพิ่มแฟล็ก rsn (reverseSurfaceNormals) เป็น rsn=1
mc.loft(sen3,sen2,sen1,rsn=1)

แบบนี้จะได้ผลเหมือนกับ mc.loft(sen1,sen2,sen3) คือผิวหันขึ้นด้านบน

หากต้องการให้ผิวปิดล้อมเป็นวงให้เพิ่มแฟล็ก c (close) เป็น c=1
mc.loft(sen1,sen2,sen3,c=1)

แบบนี้ก็จะมีผิวลากเชื่อมระหว่างเส้น 1 กับ 3 ด้วย ปิดกันเป็นวง



ปกติ แล้วผิวที่ลากเชื่อมจะไม่มีการแบ่งส่วน ถ้าต้องการให้ผิวระหว่างเส้นมีการแบ่งย่อยก็ทำได้โดยเพิ่มแฟล็ก ss (sectionSpans) ใส่จำนวนที่ต้องการแบ่ง
mc.loft(sen1,sen2,sen3,ss=4)

แบบนี้ก็จะแบ่งเป็น ๔ ส่วน



นอกจากแปลงเป็นพื้นผิว NURBS แล้ว ก็ยังสามารถแปลงเป็นโพลิกอนได้ด้วย โดยใส่แฟล็ก po (polygon) เป็น po=1

แต่ก่อนที่จะใช้ต้องใช้ฟังก์ชัน nurbsToPolygonsPref() เพื่อกำหนดรูปแบบของโพลิกอนที่ต้องการก่อน
mc.nurbsToPolygonsPref(f=0,pt=1,pc=60)
mc.loft(sen1,sen2,sen3,po=1)





พอนำ loft() มาประยุกต์ใช้ดูแล้วก็จะสามารถสร้างพื้นผิวต่างๆได้ตามที่ต้องการอย่างอิสระ เช่น สามารถใช้เพื่อวาดกราฟสามมิติได้

กรณีนี้อาจเหมาะที่จะใช้เส้นดีกรี 1 มากกว่า ส่วนดีกรีของผิวที่สร้างขึ้นก็สามารถปรับได้ด้วยแฟล็ก d (degree) เช่นกัน

ตัวอย่าง ลองวาดผิวที่โค้งเป็นคลื่น
import math
chut = [[[y,10*math.sin(
        0.1*math.pi*((x-50)**2+(y-50)**2)**0.5),x]
        for y in range(100+1)]
        for x in range(100+1)]
sen = []
for p in chut:
    sen += [mc.curve(p=p,d=1)]
mc.loft(sen,d=1)



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

นอกจากใช้เส้นโค้งที่สร้างจาก curve() แล้ว ยังอาจลองใช้เส้นโค้งวงกลมที่ได้จาก circle() ด้วย

ลองสร้างหอคอยดอกเห็ด
import math
wong = []
for i in range(10):
    r = 5-2*math.cos(i*math.pi) # กำหนดรัศมีวงกลม
    wong += mc.circle(r=r,c=[0,18-2*i,0],nr=[0,1,0],ch=0) # สร้างวงกลม
mc.loft(wong) # นำวงกลมมาถักทอต่อกันเป็นผิว



ลองเอาวงกลมมาเรียงกันเป็นวงกลมแล้วสร้างโดนัทดูก็ทำได้
wong = []
for i in range(36):
    wong += mc.circle(r=4,c=[10,0,0],ch=0)
    mc.rotate(0,10*i,0)
mc.loft(wong,c=1)



โดนัทเรียบๆอาจดูธรรมดาไป ลองทำให้ความกว้างของห่วงข้นๆลงๆก็จะได้โดนัทแบบนี้
import math
wong = []
for i in range(36):
    r = 4+2*math.cos(math.pi*i)
    wong += mc.circle(r=r,c=[10,0,0],ch=0)
    mc.rotate(0,10*i,0)
mc.loft(wong,c=1)



หรืออาจลองทำเป็นครัวซ็องก็ได้
import math
wong = []
for i in range(1,36):
    r = 4-4*math.cos(math.pi*i/18)
    wong += mc.circle(r=r,c=[10,0,0],ch=0)
    mc.rotate(0,10*i,0)
mc.loft(wong)





จะเห็นว่าสามารถสร้างพื้นผิวรูปร่างต่างๆได้มากมายจากการใช้เส้นโค้งมาถัดทอสานกัน



อ้างอิง

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


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

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

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

หมวดหมู่

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

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

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