ในบทที่ผ่านๆมาเราสามารถสร้างวัตถุแบบต่างๆได้มากมายแล้ว แต่จะเห็นว่าวัตถุทั้งหมดนั้นมีสิ่งหนึ่งที่เหมือนกันหมดและทำให้ดูซ้ำซาก จำเจ นั่นก็คือสีสัน
การแต่งสีสันก็เป็นสิ่งที่มีความสำคัญมากอย่างหนึ่งในโลกของการออกแบบ ดังนั้นในบทนี้จะมาพูดถึงการใส่สีสันให้กับวัตถุ
เริ่มแรกมาถ้าไม่ได้ทำการใส่สีให้วัตถุจะเห็นเป็นสีเทาเหมือนกันหมด นี่เป็นสีตั้งต้นที่โปรแกรมตั้งไว้ คือสี #808080 หรือ (128,128,128)
ในมายาการใส่สีให้กับวัตถุประกอบไปด้วยขั้นตอนหลายขั้น ไม่ใช่แค่กดระบายสีได้ทันทีเหมือนกับพวกโปรแกรมวาดหรือแต่งภาพ เพราะมายามีการเล่นแสงเงา นอกจากจะแค่ใส่สีอย่างเดียว ยังต้องคำนึงถึงเรืองแสงเงาด้วย
ก่อนอื่นสิ่งหนึ่งที่สำคัญเพื่อให้ สามารถเห็นสีได้จำเป็นต้องกดเปิดการแสดงเท็กซ์เจอร์ก่อน โดยคลิกที่ปุ่มในรูป หรืออาจกดเลข 6 ในคีย์บอร์ดได้เลย
เริ่มแรกให้ลองพิมพ์ตามนี้เป็นตัวอย่าง
mc.shadingNode('lambert',asShader=1,n='phiuball')
mc.setAttr('phiuball.c',0.71,0.28,0.56,typ='double3')
mc.polySphere(r=10,sx=18,sy=18,n='ball')
mc.hyperShade(a='phiuball')
จะเห็นว่าการใส่สีให้วัตถุแบ่งเป็น ๓ ขั้นตอน
เริ่มแรกใช้ ฟังก์ชัน shadingNode() เพื่อสร้างโหนด "วัสดุ" ขึ้นมา
ตามด้วยใช้ setAttr() เพื่อกำหนดสีให้กับวัสดุนั้น
และสุดท้าย ใช้ฟังก์ชัน hyperShade() เพื่อนำวัสดุไปแปะลงบนวัตถุที่ต้องการ
ส่วนประกอบของฟังก์ชัน shadingNode() เป็นฟังก์ชันสำหรับสร้างโหนดที่เกี่ยวข้องกับการปรับพื้นผิวให้เป็นลักษณะ ต่างๆ ซึ่งประกอบไปด้วยหลายชนิด ได้แก่ชนิดของวัสดุ และอื่นๆ
ประกอบไปด้วยอาร์กิวเมนต์คือชนิดของโหนดที่ต้องการสร้าง ชนิดในที่นี้เป็นชนิดย่อยของโหนดซึ่งในโปรแกรมได้กำหนดไว้ให้ ชนิดของวัสดุประกอบไปด้วย lambert, blinn, phong, anisotropic เป็นต้น
ใน ที่นี้ใช้ lambert ซึ่งเป็นวัสดุที่ไม่มีความมันวาว แต่ถ้าต้องการวัสดุที่มีความมันวาวก็ต้องใช้ blinn, phong หรือ anisotropic ซึ่งมีสิ่งที่เรียกว่า
แสงสเป็กคิวลาร์ (スペキュラ, specular) เรื่องของชนิดวัสดุนั้นมีรายละเอียดที่สามารถปรับได้มากมาย แต่ในที่นี้จะยังไม่พูดถึงเพราะเน้นแค่เรื่องสีเป็นหลักก่อน
จากนั้นต้องทำการกำหนดหมวดหมู่ใหญ่ของโหนด ซึ่งประกอบด้วย ๖ ชนิด กำหนดโดยแฟล็ก ๖ ตัว คือ
asShader (asShader)
at (asTexture)
al (asLight)
app (asPostProcess)
au (asUtility)
ar (asRendering)
ให้ใส่แฟล็กตัวใดตัวหนึ่งใน ๖ ตัวนี้ให้เป็น =1 จะเป็นการเลือกหมวดหมู่นั้น
ในที่นี้ใช้ asShader ซึ่งเป็นหมวดหมู่วัสดุ และนอกจากนี้ยังมีอีกหลายหมวด ซึ่งจะทยอยกล่าวถึงต่อไป
อนึ่ง จะเห็นว่า asShader ไม่มีชื่อย่อ จึงต้องพิมพ์เต็มๆตลอด
และสุดท้ายคือ ต้องตั้งชื่อให้กับโหนดด้วยเพื่อจะได้นำไปใช้อ้างอิงต่อไป
ลองไปที่เมนูด้านบน กดเลือก
Windows (ウィンドウ) ตามด้วย
Rendering Editors (レンダリング エディタ)
แล้วเลือก
Hypershade (ハイパーシェード) เพื่อเปิดหน้าต่างไฮเพอร์เชด
ในหน้าต่างไฮเพอร์เชดจะประกอบด้วยโหนดชนิดต่างๆมากมายที่เกี่ยวข้องกับการแสดง ผลพื้นผิว ในที่นี้ลองดูที่หมวดแรกคือวัสดุ จะเห็นโหนดที่เป็นชื่อที่เราสร้าง รวมกับโหนดอื่นๆที่ตัวโปรแกรมสร้างไว้ให้ตั้งแต่ตอนเริ่ม
จากนั้นขั้นต่อมาคือใช้ฟังก์ชัน setAttr() เพื่อกำหนดสีให้กับวัสดุนั้น
หากเปิดดูแอตทริบิวต์อีดิเตอร์ของตัววัตถุจะเห็นโหนดที่เป็นชื่อของวัสดุที่เรา ใส่เข้าไปอยู่ท้ายสุด พอกดเข้าไปดูก็จะเห็นค่าองค์ประกอบต่างๆของวัสดุมากมาย
ค่าองค์ประกอบที่กำหนดสีของวัสดุคือ color(カラー) ซึ่ง
นอกจากนี้ยังมีค่าองค์ประกอบอีกหลายอย่างที่กำหนดลักษณะของพื้นผิว เช่น ความโปร่งแสง, แสงเรือง, ฯลฯ ซึ่งจะยังไม่พูดถึง
องค์ประกอบ color มีชื่อย่อเป็น c ดังนั้นอาจใส่เป็น .c หรือ .color ก็ได้ในอาร์กิวเมนต์ของฟังก์ชัน setAttr()
จากนั้นใส่อาร์กิวเมนต์ต่อลงไปอีก ๓ ตัว คืออัตราส่วนของแม่สีทั้ง ๓ แดง เขียว น้ำเงิน ซึ่งเป็นค่าจำนวนจริงตั้งแต่ 0 ถึง 1
จากนั้นก็ต้องตามด้วยการใส่แฟล็ก typ (type) เป็น typ='double3' เพื่อเป็นการบอกว่าค่าองค์ประกอบที่จะใส่เข้าไปเป็นชนิดค่าอัตราส่วนแม่สี สามสี
และขั้นตอนสุดท้ายก็คือการใส่วัสดุให้กับวัตถุที่ต้องการ โดยใช้ฟังก์ชัน hyperShade()
hyperShade() เป็นฟังก์ชันที่ใช้จัดการกับโหนดที่เกี่ยวข้องกับการกำหนดลักษณะของพื้นผิว
ที่จริงฟังก์ชัน hyperShade() มีรายละเอียดมากมาย มีแฟล็กที่ใส่ได้อยู่เยอะ แต่จะยังไม่พูดถึงตอนนี้ ในเบื้องต้นเรานำมันมาใช้งานเพื่อใส่วัสดุให้กับวัตถุ
แฟล็กที่ใช้ในที่นี้มีแค่ a (assign) โดยใส่ชื่อของวัสดุที่ต้องการไปแปะให้กับวัตถุที่เลือกอยู่
จะเห็นว่าขั้นตอนทั้งหมดนั้นอาจดูยุ่งยาก แต่นั่นเป็นเพราะการเลือกวัสดุต้องคำนึงถึงอะไรต่างๆมากมายไม่เพียงแค่สีแต่ ยังประกอบด้วยชนิดของวัสดุแล้วก็อะไรอีกหลายอย่าง
วัสดุอาจป้อนให้กับตัววัตถุโดยตรง โดยจะเป็นการใส่วัสดุให้กับพื้นผิวของวัตถุนั้นทั้งหมดดังตัวอย่างข้างต้น
หรืออาจจะเลือกทีละหน้าหรือหลายหน้า จะเป็นการป้อนวัสดุให้กับหน้าที่เลือกเท่านั้น เช่น ลองใส่สีให้พื้นเป็นผิวชนิดต่างๆ ๔ แบบ ได้แก่ lambert, blinn, anisotropic, phong
mc.polyPlane(w=8,h=8,sx=2,sy=2,n='phuen')
phiu = ['lambert','blinn','anisotropic','phong']
for i in range(4):
ph = mc.shadingNode(phiu[i],asShader=1,n='phiu_'+phiu[i])
mc.setAttr(ph+'.c',0.71,0.18,0.56,typ='double3')
mc.select('phuen.f[%d]'%(i))
mc.hyperShade(a=ph)
จะเห็นว่าผิวแต่ละชนิดก็มีลักษณะต่างกันออกไป แม้จะเป็นสีเดียวกันก็ตาม ลองหมุนหลายๆมุมเปรียบเทียบดู จะเห็นว่า lambert เห็นความต่างชัดเจนสุดเพราะแทบไม่มีความมันวาวไม่ว่าจะมองจากมุมไหน ส่วนอันอื่นจะมีความมันวาวในลักษณะที่ต่างกันออกไป
อนึ่ง ชื่อของผิวแบบต่างๆนี้ที่จริงแล้วมาจากชื่อนักวิทยาศาสตร์ที่วิจัยเรื่องแสง ได้แก่
lambert มาจากชื่อ
โยฮัน ไฮน์ริช ลัมแบร์ท (Johann Heinrich Lambert) ชาวเยอรมัน
phong มาจากชื่อ
บุ่ย เตื่อง ฟอง (Bùi Tường Phong) ชาวเวียดนาม
blinn มาจากชื่อ
จิม บลิน (Jim Blinn) ชาวสหรัฐอเมริกา
เรื่องของพื้นผิวนั้นเกี่ยวข้องกับฟิสิกส์ซึ่งค่อนข้างซับซ้อน และคงจะไม่ได้อธิบายในบทความนี้ซึ่งเน้นที่เรื่องการเขียนโค้ดเป็นหลัก
ลองดูอีกตัวอย่างหนึ่ง คราวนี้ใส่สีให้กับผิวส่วนต่างๆของทรงกลมโดยสีที่ใส่ขึ้นกับตำแหน่งของหน้า จึงเห็นการไล่เรียงสีไปเรื่อยๆดูสวยงาม
import math
mc.polySphere(r=10,sx=18,sy=18,n='songklom')
for i in range(mc.polyEvaluate(f=1)):
bb = mc.xform('songklom.f[%d]'%i,bb=1,q=1)
x = (bb[3]+bb[0])/2
y = (bb[4]+bb[1])/2
z = (bb[5]+bb[2])/2
if(z!=0): longi = math.atan(x/z)
else: longi = 0
ph = mc.shadingNode('blinn',asShader=1)
mc.setAttr(ph+'.c',(10+y)/20,(10-y)/20,0.5+0.5*math.sin(longi*4),typ='double3')
mc.select('songklom.f[%d]'%(i))
mc.hyperShade(a=ph)
อนึ่ง ที่จริงแล้วหากอยากได้พื้นผิวที่มีการไล่สี มีวิธีการทำที่ง่ายกว่านี้อยู่ คือใช้เท็กซ์เจอร์ชนิด ramp ซึ่งจะกล่าวถึงใน
บทที่ ๓๖ สิ่งที่สามารถปรับแต่งได้ในตัววัสดุนั้นไม่ได้มีแต่เพียงสีเท่านั้น ยังสามารถปรับความโปร่งแสง แสงเรือง ความเว้านูนของพื้นผิว รวมถึงยังสามารถใช้รูปภาพแทนสีได้ด้วย ซึ่งจะกล่าวถึงในบทต่อๆไป
อ้างอิง