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



maya python เบื้องต้น บทที่ ๓๖: การทำลายพื้นผิว
เขียนเมื่อ 2016/03/15 00:33
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่แล้วได้ใช้ไฟล์ภาพเพื่อมาเป็นเท็กซ์เจอร์ให้กับพื้นผิวของวัตถุ แต่ว่าเท็กซ์เจอร์นั้นนอกจากจะใช้ไฟล์แล้วก็ยังสามารถเลือกใช้รูปแบบที่ตัว โปรแกรมกำหนดมาให้แต่แรกแล้วได้ สามารถทำลายต่างๆได้หลากหลาย

ซึ่งสามารถทำได้โดยการใช้ฟังก์ชัน shadingNode() เพื่อสร้างโหนดของเท็กซ์เจอร์เช่นเดียวกับการใช้ไฟล์ แต่อาร์กิวเมนต์แทนที่จะใส่ 'file' ก็ใส่เป็นชนิดของลายที่ต้องการแทน

เพื่อเป็นตัวอย่างขอยกตัวอย่างเป็นการสร้างลายแบบ ramp ซึ่งคือลายที่เป็นลายที่เอาสีสองสีขึ้นไปมาไล่เรียงต่อกัน

ลองสร้างตามนี้
mc.shadingNode('lambert',asShader=1,n='phiu') # สร้างโหนดวัสดุ
mc.shadingNode('ramp',at=1,n='rampo') # สร้างโหนดเท็กซ์เจอร์ผิวไล่สี
mc.connectAttr('rampo.oc','phiu.c') # เชื่อมโหนดเท็กซ์เจอร์กับโหนดวัสดุ
mc.polyPlane(w=10,h=10,sx=1,sy=1,n='phaen') # สร้างพื้นระนาบ
mc.hyperShade(a='phiu') # ใส่วัสดุให้กับพื้น

จะได้พื้นไล่สีจากขาวไปดำ



จะเห็นว่าหากเทียบกับบทที่แล้วที่ใส่ภาพให้ผิวโพลิกอนนั้นจะเห็นว่าต่างกันแค่บรรทัดที่ ๒ เป็น 'ramp' แทนที่จะเป็น 'file'

นั่นคือครั้งนี้แทนที่จะสร้างโหนดไฟล์ขึ้นมาเราก็สร้างโหนดสำหรับผิวไล่สีขึ้นมาแทน

ลองกดเลือกโหนด
mc.select('rampo')

แล้วมาดูที่แอตทริบิวต์อีดิเตอร์กันเลย จะเห็นภาพแถบที่มีสีไล่ดำขาว นี่เป็นตัวกำหนดสีที่ปรากฏ ถ้าเปลี่ยนสีตรงนี้สีบนวัตถุของเราก็เปลี่ยนตาม



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

ลำดับของกล่องสีนั้นนับจากทางซ้ายเป็น 0 ทางขวาสุดเป็น 1

เริ่มต้นมากล่องสีดำอยู่ทางซ้ายสีดำอยู่ตำแหน่ง 0 สีเป็น 0,0,0 ส่วนทางขวาอยู่ตำแหน่ง 1 สี 1,1,1

สามารถปรับค่าตำแหน่งกับสีของแต่ละกล่องสีได้โดย เช่นสำหรับกล่องหมายเลข 0 ใช้เป็น
- ตำแหน่ง หากเขียนชื่อเต็มก็จะเป็น rampo.colorEntryList[0].position แต่สามารถเขียนย่อได้เป็น rampo.cel[0].ep
- สี ชื่อเต็มเป็น rampo.colorEntryList[0].color เขียนย่อได้เป็น rampo.cel[0].ec

ตัวอย่างการเปลี่ยนค่า
mc.setAttr('rampo.cel[0].ec',0,0,1,typ='double3')
mc.setAttr('rampo.cel[0].ep',0.15)
mc.setAttr('rampo.cel[1].ec',1,0,0,typ='double3')
mc.setAttr('rampo.cel[1].ep',0.65)

แบบนี้ก็จะได้มาเป็นพื้นไล่สีแดงกับน้ำเงินแทน



กล่องสีไม่ได้มีได้เพียงแค่สองอัน แต่สามารถสร้างเพิ่มมากี่อันก็ได้ สามารถใส่ rampo.cel[2], rampo.cel[3] ต่อได้เลย

ลองตั้งตามนี้ก็จะได้ออกมาเป็นอะไรที่คล้ายกับธงของประเทศคอสตาริกา
mc.setAttr('rampo.cel[0].ec',0,0,1,typ='double3')
mc.setAttr('rampo.cel[0].ep',0.15)
mc.setAttr('rampo.cel[1].ec',1,1,1,typ='double3')
mc.setAttr('rampo.cel[1].ep',0.2)
mc.setAttr('rampo.cel[2].ec',1,0,0,typ='double3')
mc.setAttr('rampo.cel[2].ep',0.35)
mc.setAttr('rampo.cel[3].ec',1,0,0,typ='double3')
mc.setAttr('rampo.cel[3].ep',0.65)
mc.setAttr('rampo.cel[4].ec',1,1,1,typ='double3')
mc.setAttr('rampo.cel[4].ep',0.8)
mc.setAttr('rampo.cel[5].ec',0,0,1,typ='double3')
mc.setAttr('rampo.cel[5].ep',0.85)



นอกจากนี้ยังมีค่าอื่นๆที่สามารถปรับได้ เช่น
U波形 uw (uWave) ขนาดคลื่นตามแนว u
V波形 vw (vWave) ขนาดคลื่นตามแนว v
ノイズ n (noise) ขนาดคลื่นรบกวน
ノイズ周波数 nf (noiseFreq) ความถี่ของคลื่นรบกวน
タイプ t (type) รูปแบบการไล่สี
補間 in (interpolation) การประมาณค่าในช่วง
และอื่นๆอีกมากมาย

โดยหน่วยของขนาดคลื่นเป็นจำนวนเท่าของความกว้าง

รูปแบบของการไล่สีต้องใส่ค่าเป็นตัวเลข มีให้เลือกหลากหลาย
t=0 ไล่สีตามแนว v (ค่าตั้งต้น)
t=1 ไล่สีตามแนว u
t=2 ไล่สีตามแนวทะแยง
t=3 ไล่สีตามแนวเส้นรอบวง
t=4 ไล่สีตามแนวรัศมี
เป็นต้น

แล้วก็รูปแบบการประมาณค่าในช่วง คือค่า in (interpolation)
in=0 ตัดเปลี่ยนสีทันที ไม่มีการไล่สี
in=1 สีค่อยๆเปลี่ยนอย่างคงที่เป็นเชิงเส้น (ค่าตั้งต้น)
in=4 สีค่อยๆเปลี่ยนแบบเรียบๆ
เป็นต้น

ลองสร้างสายรุ้งขึ้นมาดู
sirung = [[1,0,0],[1,0.5,0],[1,1,0],[0,1,0],[0,1,1],[0,0,1],[1,0,1]] # ลิสต์ของสีทั้งเจ็ด
mc.shadingNode('phong',asShader=1,n='phiu_rung')
mc.shadingNode('ramp',at=1,n='lai_rung')
mc.connectAttr('lai_rung.oc','phiu_rung.c')
mc.cylinder(r=10,hr=0.5,ssw=195,esw=345,n='sairung')
mc.hyperShade(a='phiu_rung')
mc.setAttr('lai_rung.t',1) # ไล่สีตามแนว u
mc.setAttr('lai_rung.in',4) # สีเปลี่ยนแบบเรียบ
# ไล่สร้างแถบสีทีละอัน
for i in range(7):
    mc.setAttr('lai_rung.cel[%d].ec'%i,sirung[i][0],sirung[i][1],sirung[i][2],typ='double3')
    mc.setAttr('lai_rung.cel[%d].ep'%i,(i+0.5)/7)



ลองปรับลูกคลื่นตามแนว u ดู
mc.setAttr('lai_rung.uw',0.9)

ผิวลาดจะโค้งเป็นคลื่น



ลองปรับคลื่นรบกวนดู
mc.setAttr('lai_rung.n',1)
mc.setAttr('lai_rung.nf',0.1)

จะพบว่าสีกลายเป็นปนกันไม่เป็นระเบียบไปแล้ว



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

เช่นลอง
mc.expression(o='lai_rung',s='n=0.5+sin(time*4.5)*0.5')
mc.expression(o='lai_rung',s='nf=0.5+cos(time*1.5)*0.5')
mc.expression(o='lai_rung',s='uw=0.5-sin(time*0.3)*0.5')



อีกตัวอย่าง ลองสร้างกรวยจราจรขึ้นมา
mc.shadingNode('phong',asShader=1,n='phiu_kruai')
mc.shadingNode('ramp',at=1,n='lai_kruai')
mc.connectAttr('lai_kruai.oc','phiu_kruai.c')
mc.setAttr('lai_kruai.t',4) # ไล่สีตามแนวรัศมี
mc.setAttr('lai_kruai.in',0) # ตัดเปลี่ยนสีทันทีโดยไม่ต้องไล่สี
mc.setAttr('lai_kruai.cel[0].ec',1,0.15,0,typ='double3') # ส้ม
mc.setAttr('lai_kruai.cel[1].ec',1,1,1,typ='double3') # ขาว
mc.setAttr('lai_kruai.cel[2].ec',1,0.15,0,typ='double3')
mc.setAttr('lai_kruai.cel[3].ec',1,1,1,typ='double3')
mc.setAttr('lai_kruai.cel[4].ec',1,0.15,0,typ='double3')
mc.setAttr('lai_kruai.cel[0].ep',0)
mc.setAttr('lai_kruai.cel[1].ep',0.15)
mc.setAttr('lai_kruai.cel[2].ep',0.2)
mc.setAttr('lai_kruai.cel[3].ep',0.3)
mc.setAttr('lai_kruai.cel[4].ep',0.35)
mc.nurbsPlane(w=10,u=4,v=4,ax=[0,1,0],n='kruai')
mc.move(0,40,0,'kruai.cv[3][3]')
mc.hyperShade(a='phiu_kruai')



จะเห็นว่าคราวนี้ใช้การไล่สีแบบตามแนวรัศมีและให้สีตัดเปลี่ยนทันที แบบนี้ก็สามารถทำได้เช่นกัน

นอกจากวัตถุไล่สีแล้วก็ยังมีลายอีกหลากหลายชนิด

mc.shadingNode('grid',at=1) ลายตาราง
mc.shadingNode('checker',at=1) ลายกระดานหมากรุก
mc.shadingNode('mountain',at=1) ลายภูเขาที่มีหิมะเกาะ
mc.shadingNode('cloth',at=1) ลายผ้า
mc.shadingNode('fractal',at=1) ลายแฟร็กทัล
mc.shadingNode('granite',at=1) ลายหินแกรนิต
mc.shadingNode('marble',at=1) ลายหินอ่อน
mc.shadingNode('cloud',at=1) ลายเมฆ
mc.shadingNode('wood',at=1) ลายไม้
mc.shadingNode('leather',at=1) ลายหนัง
mc.shadingNode('water',at=1) ลายน้ำ
เป็นต้น

ซึ่งแต่ละรูปแบบก็มีค่าองค์ประกอบที่ต้องปรับต่างกันออกไป สามารถลองสร้างแล้วดูค่าในแอตทริบิวต์อีดิเตอร์ได้

ตัวอย่าง ลองสร้างตารางโกะขึ้นดูโดยใช้ลายตาราง
mc.shadingNode('phong',asShader=1,n='phiu_tarang') # สร้างโหนดวัสดุสีผิวตารางโกะ
mc.polyPlane(w=20,h=20,sx=20,sy=20,n='tarang_go') # สร้างแผ่นกระดานโกะ
mc.move(10,0,10)
mc.hyperShade(a='phiu_tarang') # ใส่วัสดุให้ผิวตาราง
mc.setAttr('phiu_tarang.c',1,0.61,0.13,typ='double3') # กำหนดสีเป็นส้มอ่อน
mc.shadingNode('phong',asShader=1,n='sen_tarang') # สร้างโหนดวัสดุเส้นตาราง
mc.shadingNode('grid',at=1,n='lai_tarang') # สร้างโหนดเท็กซ์เจอร์เส้นตาราง
mc.connectAttr('lai_tarang.oc','sen_tarang.c') # เชื่อมโหนดเท็กซ์เจอร์เข้ากับโหนดวัสดุ
na_tarang = ['tarang_go.f[%d]'%(i+j*20) for j in range(18) for i in range(21,39)]
mc.select(na_tarang) # กำหนดผิวที่จะใส่ตาราง คือส่วนตรงกลาง
mc.hyperShade(a='sen_tarang') # ใส่วัสดุเส้นตาราง
mc.polyProjection(rx=90,psu=1,psv=1,pcx=0.5,pcz=0.5) # ตั้งระนายฉายให้ช่องตารางขนาดเป็น 1x1
mc.setAttr('lai_tarang.lc',0,0,0,typ='double3') # ตั้งสีเส้นขอบตารางเป็นสีดำ
mc.setAttr('lai_tarang.fc',1,0.61,0.13,typ='double3') # ตั้งสีเนื้อในตารางเป็นสีเดียวกับแผ่นกระดาน
# ตำแหน่งหมาก 17 ตาแรก
go = [[16,4],[4,16],[3,4],[17,16],[15,16],[15,17],[14,17],[16,17],[3,14],[6,17],[13,16],[16,15],[9,17],[5,3],[8,4],[3,7],[5,4]]
mc.shadingNode('phong',asShader=1,n='dam') # สร้างโหนดวัสดุสีดำ
mc.setAttr('dam.c',0,0,0,typ='double3')
mc.shadingNode('phong',asShader=1,n='khao') # สร้างโหนดวัสดุสีขาว
mc.setAttr('khao.c',1,1,1,typ='double3')
i=1 # จำนวนตา
for x,y in go:
    mc.sphere(r=0.5) # สร้างทรงกลม
    mc.scale(1,0.3,1) # บี้แบนกลายเป็นตัวหมาก
    mc.move(x,0.15,y) # ย้ายไปวางตามตำแหน่ง
    if(i%2==1): mc.hyperShade(a='dam') # ใส่สีดำ
    else: mc.hyperShade(a='khao') # ใส่สีขาว
    i += 1 # นับตาต่อไป



ที่มาของหมากตารางนี้มาจากศึก AlphaGo ปะทะ อีเซดล (이세돌)
https://www.youtube.com/watch?v=9w9Qo4MlBUI



อ้างอิง

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


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

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

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

หมวดหมู่

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

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

目次

日本による名言集
モジュール
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
機械学習
-- ニューラル
     ネットワーク
javascript
モンゴル語
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



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

  記事を検索

  おすすめの記事

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

ไทย

日本語

中文