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



[maya python] แก้วไวน์ใส่น้ำ
เขียนเมื่อ 2017/03/19 18:43
แก้ไขล่าสุด 2021/09/28 16:42
วันนี้จะลองมาสร้างแก้วไวน์ขึ้นดูด้วยโค้ดไพธอนในมายา

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

ที่จริงแล้วใช้เครื่องมือสร้างเส้นในมายาวาดจุดระยะห่างจากศูนย์กลางของขอบแก้วในแต่ละความสูงก็ได้

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

นอกจากนี้แล้วแค่ทำรูปร่างอย่างเดียวยังไม่พอ แก้วจะต้องมีความโปร่งใสและหักเหแสงได้ด้วย ตามธรรมชาติแล้วแก้วจะมีดัชนีหักเหเป็น 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 มาใส่ถ้วยดู ฉากหลังในภาพก็คือร้านกาแฟของจิโนะจังนั่นเอง



『ご注文はうさぎ(チノちゃん)ですか?』
"รับน้องกระต่าย (จิโนะจัง) ซักแก้วมั้ยคะ?"


โมเดลจิโนะจัง >> ลิงก์
ฉากร้านกาแฟ >> ลิงก์


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

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

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

หมวดหมู่

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

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

目次

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

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

記事の類別



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

  記事を検索

  おすすめの記事

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

ไทย

日本語

中文