สิ่งของที่มีโครงสร้างง่ายๆไม่ซับซ้อนสามารถสร้างขึ้นมาจากโค้ดไพธอนได้ไม่ยาก แค่อาจต้องเข้าใจการประยุกต์ใช้คำสั่งต่างๆสักหน่อย
ครั้งก่อนได้ลองสร้างวิมานพระอินทร์ดูแล้ว
https://phyblas.hinaboshi.com/20160913
ในลักษณะคล้ายๆกันเราอาจลองทำอะไรกับสิ่งของเครื่องใช้ต่างๆก็ได้
ครั้งนี้ลองเขียนโค้ดสร้างร่มกระดาษน้ำมันแบบจีน ซึ่งในภาษาจีนเรียกว่า "โหยวจื๋อส่าน" (油纸伞, yóuzhǐsǎn) หรือในภาษาญี่ปุ่นเรียกว่า "เคียววางาสะ" (京和傘)
โค้ดที่ใช้สร้างเป็นดังนี้
import maya.cmds as mc
import math
# สีผิวไม้
phiumai = mc.shadingNode('lambert',asShader=1,n='phiumai')
mc.setAttr(phiumai+'.c',0.9,0.6,0.2,typ='double3')
mai = []
# สีผิวด้ามจับ
phiudamchap = mc.shadingNode('lambert',asShader=1,n='phiudamchap')
mc.setAttr(phiudamchap+'.c',1,0.65,0.6,typ='double3')
# ภาพใบร่ม
phap_bairom = mc.shadingNode('lambert',asShader=1,n='phap_bairom')
file_bairom = mc.shadingNode('file',at=1,n='file_bairom')
mc.connectAttr(file_bairom+'.oc',phap_bairom+'.c')
s = '<ไฟล์ภาพ>'
mc.setAttr(file_bairom+'.ftn',s,typ='string')
# ใบร่ม
bairom = mc.polySphere(sy=3,sx=48)[0]
mc.delete(bairom+'.f[0:95]')
mc.polyProjection(bairom+'.f[*]',md='y')
mc.select(bairom+'.f[*]')
mc.hyperShade(a=phap_bairom)
for i in range(mc.polyEvaluate(bairom,v=1)):
mc.select(bairom+'.vtx[%d]'%i)
t = mc.xform(q=1,t=1)
r = (t[0]**2+t[2]**2)**0.5
if(r>0.01):
mc.scale(0.6/r,1,0.6/r)
if(i%2):
mc.move(-0.15,y=1)
else:
mc.move(-0.16,y=1)
else:
mc.move(0,y=1)
# ด้ามร่ม
damrom = mc.polyCylinder(r=0.0075,h=1,sx=24)[0]
mc.move(-0.5,y=1)
# ด้ามจับ
damchap = mc.polyCylinder(r=0.015,h=0.1,sx=24,sy=2)[0]
mc.hyperShade(a=phiudamchap)
mc.move(0.05-1,y=1)
mc.scale(0.7,1,0.7,'.vtx[24:47]')
mc.select(damchap+'.f[48:49]')
mc.polyExtrudeFacet(ltz=0.01,sx=0.5,sz=0.5)
# ยอดร่ม
yotrom = mc.polyCylinder(r=0.015,h=0.03,sx=24)[0]
mc.move(0.015-0.01,y=1)
mc.scale(0.6,1,0.6,'.vtx[24:47]')
# แกนร่ม
kaenyuet = mc.polyCylinder(r=0.015,h=0.05,sx=24,sy=2)[0]
mc.move(-0.1-0.05,y=1)
mc.scale(1.5,1,1.5,'.vtx[24:47]')
# ก้านขึงและก้านค้ำ
h = (0.6**2+0.15**2)**0.5
kankhueng = mc.polyCylinder(r=0.0025,h=h,sx=18)[0]
mc.move(h/2,y=1)
mc.rotate(90+math.degrees(math.atan2(0.15,0.6)),z=1,p=[0,0,0])
h = (0.2**2+0.1**2)**0.5
kankham = mc.polyCylinder(r=0.0025,h=h,sx=18)[0]
mc.move(h/2,y=1)
mc.rotate(90-math.degrees(math.atan2(0.1,0.2)),z=1,p=[0,0,0])
mc.move(-0.1-0.05,y=1,r=1)
mai += [damrom,yotrom,kaenyuet,kankhueng,kankham]
for i in range(1,24):
kankhueng = mc.duplicate(kankhueng)[0]
kankham = mc.duplicate(kankham)[0]
mc.rotate(360/24,0,0,[kankhueng,kankham],y=1,r=1,p=[0,0,0])
mai += [kankhueng,kankham]
# ใส่สีผิวไม้
mc.select(mai)
mc.hyperShade(a=phiumai)
# รวมกลุ่ม
mc.group(bairom,mai,damchap,n='rom_kradat_namman')
พอรันโค้ดก็จะได้ออกมาเป็นแบบนี้
ส่วนของลวดลายบนใบร่มนั้นสามารถไปใส่เพิ่มเองตามที่ต้องการ ในที่นี้ใช้เป็นลายดอกแบบจีน เอามาจาก >>
เว็บนี้
ดูจากใต้ร่ม
คราวนี้ลองเอาภาพจากอนิเมะ girlish number มาใส่บนร่มแล้วให้โมโมกะจังถือ โดยได้ปรับผิวร่มให้เป็น blinn ซึ่งมันวาวสะท้อนแสงได้ จะเห็นว่าภาพฉากรอบๆสะท้อนลงบนใบร่มด้วย แม้จะยังดูแปลกๆเหมือนจะไม่สมจริงอยู่บ้างเพราะร่มกระดาษไม่มีทางสะท้อนแสงแบบนี้ได้อยู่แล้วแต่ก็สวยดี
ทั้งโมโมกะและฉากหลังเป็นโมเดลที่ดึงมาจาก MMD
โมโมกะยืมมาจาก
http://3d.nicovideo.jp/works/td28604
ส่วนฉากหลังยืมมาจาก
http://amiamy111.deviantart.com/art/MMD-Yet-another-city-stage-289451176
ร่มนี้มีขนาดเส้นผ่านศูนย์กลาง 1.2 เมตร ถ้าลองขยายใหญ่ขึ้น 20 เท่ามันจะใหญ่พอที่จะสร้างเงาปกคลุมย่านเมืองตรงนี้จนมืดไปได้เลย
ภาพเดียวกันถ่ายจากมุมสูงให้เห็นบริเวณของเงาชัดเจน
ลองให้โมโมกะจังขึ้นไปนั่งบนตึกดูบ้าง แบบนี้ก็สวยไปอีกแบบ
ร่มที่ได้มานี้อาจจะยังดูเรียบง่ายอยู่สักหน่อย หากใครจะลองเอาไปดัดแปลงทำให้ดูสวยขึ้นก็ยินดี