ใน
บทที่ ๓๑ ได้รู้วิธีการสร้างเส้นโค้ง 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)
จะเห็นว่าสามารถสร้างพื้นผิวรูปร่างต่างๆได้มากมายจากการใช้เส้นโค้งมาถัดทอสานกัน
อ้างอิง