วันนี้จะลองมาสร้างแก้วไวน์ขึ้นดูด้วยโค้ดไพธอนในมายา
การสร้างรูปร่างของแก้วไวน์ขึ้นทำได้โดยสร้างเส้นโค้งที่เป็นเค้าโครงขึ้นมาแล้วใช้คุณสมบัติความมีสมมาตรการหมุนของแก้ว
ที่จริงแล้วใช้เครื่องมือสร้างเส้นในมายาวาดจุดระยะห่างจากศูนย์กลางของขอบแก้วในแต่ละความสูงก็ได้
แต่ว่ารูปร่างโค้งของแก้วน้ำนั้นจริงๆอาจมาจากการคำนวณบวกลบคูณหารยกกำลังง่ายๆได้เหมือนกัน แบบนั้นอาจให้เส้นโค้งที่ดูเป็นธรรมชาติมากกว่าที่จะมาจิ้มจุดด้วยมือ
นอกจากนี้แล้วแค่ทำรูปร่างอย่างเดียวยังไม่พอ แก้วจะต้องมีความโปร่งใสและหักเหแสงได้ด้วย ตามธรรมชาติแล้วแก้วจะมีดัชนีหักเหเป็น 1.5 ดังนั้นในที่นี้จะตั้งค่าต่างๆของวัสดุให้สมจริงไปด้วย
อีกทั้งเพื่อให้แก้วดูโค้งสมจริงไม่มีเหลี่ยมอาจทำได้กดเลข 3 ในคีย์บอร์ดเพื่อตั้งให้วัตถุปรับโค้งมนอัตโนมัติ สำหรับการตั้งค่าด้วยโค้ดอาจใช้ฟังก์ชัน displaySmoothness() ได้
โค้ดสำหรับสร้างแก้วไวน์เป็นดังนี้
import maya.cmds as mc
import math
phiukaeo = mc.shadingNode('blinn',asShader=1,n='phiukaeo') # สร้างวัสดุผิวแก้ว
mc.setAttr(phiukaeo+'.c',1,1,1,typ='double3')
mc.setAttr(phiukaeo+'.it',0.95,0.95,0.95,typ='double3') # ความโปร่งใส
mc.setAttr(phiukaeo+'.dc',0)
mc.setAttr(phiukaeo+'.sc',1,1,1,typ='double3') # สีสเป็กคิวลาร์
mc.setAttr(phiukaeo+'.sro',1)
mc.setAttr(phiukaeo+'.ec',0.3)
mc.setAttr(phiukaeo+'.rfc',1)
mc.setAttr(phiukaeo+'.rfi',1.5) # ดัชนีหักเห
xyz = [[0,8,0]] # จุดกลางแก้ว
# ส่วนโค้งด้านใน
for i in range(21):
y = 8+0.4*i
x = -y**0.5*30*math.exp(-y/27)+62.1
xyz.append([x,y,0])
# ส่วนโค้งด้านนอก
for i in range(21):
y = 16-0.45*i
x = -y**0.5*20*math.exp(-y/27)+39.7
xyz.append([x,y,0])
# ส่วนโค้งบนฐานแก้ว
for i in range(9):
y = 3-0.3375*i
x = math.sqrt(2.7**2-(3-y)**2)-3.2
xyz.append([x,y,0])
xyz.extend([[-3.2,0,0],[-3.2,0,0],[0,0,0]]) # ส่วนใต้ฐานแก้ว
sen = mc.curve(ep=xyz) # สร้างเส้นโครง
senwong = [sen]
for i in range(1,24):
sen = mc.duplicate(sen)[0]
mc.rotate(-15,y=1,r=1)
senwong.append(sen)
mc.nurbsToPolygonsPref(f=0,pc=1200,pt=1)
kaeo = mc.loft(senwong,c=1,po=1,ch=0,n='kaeo')[0] # สานโครงเป็นผิวโพลิกอน
mc.hyperShade(a=phiukaeo) # ใส่สี
mc.displaySmoothness(du=3,dv=3,pw=16,ps=4,po=3)
mc.delete(senwong)
mc.polyMergeVertex(d=0.01) # รวมจุดที่ซ้อนกัน
เท่านี้ก็ได้แก้วน้ำใสๆอันหนึ่งออกมาแล้ว
ตอนนี้แก้วยังเป็นแค่แก้วเปล่าอยู่ คราวนี้จึงจะมาลองใส่น้ำลงไปด้วย
การสร้างน้ำภายในแก้วอาจทำได้โดยคัดลอกผิวด้านในของแก้วมาทำเป็นผิวด้านข้างของน้ำ
ส่วนวัสดุของน้ำก็สร้างใหม่คล้ายๆกับของแก้ว แต่ว่าต้องปรับดัชนีหักเหด้วย ของน้ำเป็น 1.33
ผิวน้ำด้านบนอาจทำได้โดยดึงยื่นจากผิวส่วนบนสุด ดึงมารวมกันตรงกลางแล้วเชื่อมรวม
เพียงแต่ข้อควรระวังคือต้องทำการแยกผิวน้ำด้านบนกับด้านข้างเป็นคนละชิ้นกัน ไม่เช่นนั้นพอใช้คำสั่งปรับวัตถุโค้งมนแล้วรอยต่อระหว่างผิวบนกับผิวข้างจะโค้ง แต่เราต้องการให้มันหักมุมพอดี
สรุปโค้ดสำหรับเติมน้ำลงไปเขียนได้ดังนี้
phiunam = mc.duplicate(phiukaeo,n='phiunam')[0] # คัดลอกวัสดุผิวแก้ว
mc.setAttr(phiunam+'.rfi',1.33) # เปลี่ยนค่าดัชนีหักเหให้เห็นของน้ำ
nam = mc.duplicate(kaeo,n='nam')[0] # คัดลอกโพลิกอนแก้ว
mc.hyperShade(a=phiunam) # เปลี่ยนวัสดุเป็นของผิวน้ำ
# คัดเลือกลบส่วนที่ไม่ใช่ผิวด้านในทิ้ง
sl = []
for i in range(mc.polyEvaluate(nam,f=1)):
t = mc.xform(nam+'.f[%d]'%i,t=1,q=1)
if(~(14>t[1]>7.9 and (t[0]**2+t[2]**2)**0.5-0.1 <= t[1]**0.5*30*np.exp(-t[1]/27)-62.1)):
sl.append(nam+'.f[%d]'%i)
mc.delete(sl)
mc.polyNormal(nam) # กลับด้านผิวด้วย
# คัดหาจุดที่อยู่ด้านบนสุดเพื่อสร้างผิวน้ำด้านบน
a = mc.xform(nam,bb=1,q=1)[4]-0.001
nf = mc.polyEvaluate(nam,f=1) # เก็บค่าจำนวนหน้าก่อนสร้างผิวเพิ่ม
sl = []
for i in range(mc.polyEvaluate(e=1)):
t = mc.xform(nam+'.e[%d]'%i,t=1,q=1)
if(t[1]>a and t[4]>a):
sl.append(nam+'.e[%d]'%i)
mc.select(sl)
mc.polyExtrudeEdge() # ยื่นผิวบนสุดออกมา
mc.scale(0,1,0) # แล้วรวมที่ตรงกลาง
mc.polyMergeVertex(nam,d=0.01)
# แยกผิวน้ำส่วนบนออกไป
mc.polyChipOff(nam+'.f[%d:%d]'%(nf,mc.polyEvaluate(nam,f=1)),dup=0)
nam1,nam2 = mc.polySeparate(nam,ch=0)
mc.rename(nam1,'nam1')
mc.rename(nam2,'nam2')
mc.group(kaeo,nam,n='kaeonam') # รวมแก้วกับน้ำเข้าเป็นกลุ่มเดียวกัน
ตอนนี้จะมีวัตถุอยู่ ๓ ชิ้น คือแก้วน้ำ และผิวน้ำ ๒ ส่วน
การจะเห็นความสวยงามสมจริงของแก้วแค่เรนเดอร์ด้วยมายาซอฟต์แวร์ธรรมดาอาจไม่เพียงพอ อาจต้องใช้เมนทัลเรย์ หรืออาร์โนลด์
ในที่นี้จะลองทำการเรนเดอร์ด้วยเมนทัลเรย์ โดยได้จำลองปรากฏการณ์ที่เรียกว่า "คอสติก" (caustic) ลงไปด้วย
ลองเอาแก้วไวน์วางบนพื้นแล้วให้แสงไฟส่องจากข้างบนลงมา แสงจะผ่านการหักเหและสะท้อนเมื่อเคลื่อนผ่านผิวแก้วและน้ำ
ทำแบบนี้แล้วจะได้ภาพที่ออกมาค่อนข้างดูสมจริง
เรื่องการทำคอสติกในมายาเป็นเทคนิคที่ค่อนข้างระดับสูงขึ้นไป มีความยุ่งยากซับซ้อนอยู่ ดังนั้นจะยังไม่พูดถึงรายละเอียดในที่นี้
แม้น้ำจะใสแต่พอใส่ลงไปจะทำให้เกิดการหักเหแสงต่างกันไป สามารถเห็นความต่างระหว่างใส่น้ำกับไม่ใส่ชัดเจน ลองเอาไฟส่องใส่แก้วที่มีน้ำและไม่มีเพื่อเปรียบเทียบดูได้
นางแบบที่มาช่วยฉายแสงให้เราดูนี้คือเยวี่ยเจิ้งหลิง (乐正绫) โวคาลอยด์ของจีน
โมเดลเยวี่ยเจิ้งหลิงโหลดจาก >>
ลิงก์
ส่วนฉากโหลดจาก >>
ลิงก์
ที่จริงแล้วในโลกความเป็นจริงเราก็สามารถมองความแตกต่างนั้นออกได้ แม้จะอธิบายเป็นคำพูดยากว่ามันต่างกันยังไง เรื่องของทัศนศาสตร์เป็นอะไรที่ซับซ้อน
คราวนี้ลองเอาจิโนะจังจาก gochiusa มาใส่ถ้วยดู ฉากหลังในภาพก็คือร้านกาแฟของจิโนะจังนั่นเอง
『ご注文はうさぎ(チノちゃん)ですか?』
"รับน้องกระต่าย (จิโนะจัง) ซักแก้วมั้ยคะ?"
โมเดลจิโนะจัง >>
ลิงก์
ฉากร้านกาแฟ >>
ลิงก์