φυβλαςのβλογ
phyblasのブログ



maya python เบื้องต้น บทที่ ๒๗: การใส่สี
เขียนเมื่อ 2016/03/11 15:49
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่ผ่านๆมาเราสามารถสร้างวัตถุแบบต่างๆได้มากมายแล้ว แต่จะเห็นว่าวัตถุทั้งหมดนั้นมีสิ่งหนึ่งที่เหมือนกันหมดและทำให้ดูซ้ำซาก จำเจ นั่นก็คือสีสัน

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

เริ่มแรกมาถ้าไม่ได้ทำการใส่สีให้วัตถุจะเห็นเป็นสีเทาเหมือนกันหมด นี่เป็นสีตั้งต้นที่โปรแกรมตั้งไว้ คือสี #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 ซึ่งจะกล่าวถึงในบทที่ ๓๖

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



อ้างอิง

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


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

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

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

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> 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)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文