φυβλαςのβλογ
บล็อกของ 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
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文