使用Python制作一盏 3D 花灯喜迎元宵佳节
说起元宵节,各位有没有觉得这是咱们中国人最浪漫的节日呢?国人向来拘谨古板,一年到头都是小心谨慎地过日子,唯有元宵节这天可以纵情豪放一把。东风夜放花千树,宝马雕车香满路,火树银花霓虹闪烁,豪车遍地美女如云。细品,你甚至都能嗅到香奈儿的味道!月上柳梢头,人约黄昏后,这又是何等的浪漫!比起烛光晚宴、鲜花加持,这份浪漫更显纯真。晚至明清,民间元宵节的喜庆气氛,堪比西班牙的奔牛节、巴西的狂欢节、泰国的泼水节。
由于众所周知的原因,估计今年的趵突泉元宵节灯会又要黄了。去哪儿体验“花市灯如昼”的节日气氛呢?Don'tworry,没有什么事能够难倒程序员——用3D技术也可以做出下图这样的走马灯,算是聊胜于无吧。
1.原材料
花灯纸
如下所示,还可以加上自己喜欢的图案、文字等。
Python环境和模块
- numpy
- pillow
- wxgl
pipinstallnumpy pipinstallpillow pipinstallwxgl
2.制作工序
导入模块
>>>importnumpyasnp >>>fromPILimportImage >>>importwxgl.wxplotasplt
打开花灯纸图像
>>>fn=r'D:\temp\light0115\res\paper.png' >>>im=np.array(Image.open(fn))/255 >>>im.shape (400,942,3)
根据花灯纸的大小制作龙骨
>>>rows,cols,deep=im.shape >>>cols/(2*np.pi) 149.9239563925654 >>>r=1 >>>h=2*np.pi*rows/cols >>>h 2.6680192387174464
>>>theta=np.linspace(0,2*np.pi,cols) >>>x=r*np.cos(theta) >>>y=r*np.sin(theta) >>>z=np.linspace(0,h,rows) >>>xs=np.tile(x,(rows,1)) >>>ys=np.tile(y,(rows,1)) >>>zs=z.repeat(cols).reshape((rows,cols))
>>>plt.mesh(xs[::10,::10],ys[::10,::10],zs[::10,::10],mode='FLBL') >>>plt.show()
用3D的方式画出来的龙骨,效果如下。
给龙骨贴上花灯纸
>>>plt.mesh(xs,ys,zs,im) >>>plt.show()
>>>plt.mesh(xs,ys,zs,im[::-1]) >>>plt.show()
怎么样,是不是有一点走马灯的雏形了呢?
制作旋转叶轮
>>>theta=np.linspace(0,2*np.pi,18,endpoint=False) >>>x=r*np.cos(theta) >>>y=r*np.sin(theta) >>>x[2::3]=x[1::3] >>>x[1::3]=0 >>>y[2::3]=y[1::3] >>>y[1::3]=0 >>>z=np.ones(18)*h*0.9 >>>vs=np.stack((x,y,z),axis=1) >>>plt.mesh(xs,ys,zs,im[::-1]) >>>plt.surface(vs,color='#C03000',method='T',mode='FCBC',alpha=0.8) >>>plt.show()
叶轮设计有6片,用三角形模拟,颜色深红,透明度0.8,整体效果略显粗糙了一点。
加上照明灯和提系
>>>plt.mesh(xs,ys,zs,im[::-1]) >>>plt.surface(vs,color='#C03000',method='T',mode='FCBC',alpha=0.8) >>>plt.sphere((0,0,h*0.4),0.4,'#FFFFFF',slices=60,mode='FCBC') >>>plt.plot((0,0),(0,0),(0.4*h,1.5*h),width=3.0,style='solid',cmap='hsv',caxis='z')
让花灯转起来
plt.show(rotation='h-')
最终的花灯效果如下。
3.完整代码
#-*-coding:utf-8-*- importnumpyasnp fromPILimportImage importwxgl.wxplotasplt im=np.array(Image.open('res/paper.png'))/255 rows,cols,deep=im.shape r,h=1,2*np.pi*rows/cols theta=np.linspace(0,2*np.pi,cols) x=r*np.cos(theta) y=r*np.sin(theta) z=np.linspace(0,h,rows) xs=np.tile(x,(rows,1)) ys=np.tile(y,(rows,1)) zs=z.repeat(cols).reshape((rows,cols)) theta=np.linspace(0,2*np.pi,18,endpoint=False) x=r*np.cos(theta) y=r*np.sin(theta) x[2::3]=x[1::3] x[1::3]=0 y[2::3]=y[1::3] y[1::3]=0 z=np.ones(18)*h*0.9 vs=np.stack((x,y,z),axis=1) plt.mesh(xs,ys,zs,im[::-1]) plt.surface(vs,color='#C03000',method='T',mode='FCBC',alpha=0.8) plt.sphere((0,0,h*0.4),0.4,'#FFFFFF',slices=60,mode='FCBC') plt.plot((0,0),(0,0),(0.4*h,1.5*h),width=3.0,style='solid',cmap='hsv',caxis='z') plt.show(rotation='h-')
到此这篇关于使用Python制作一盏3D花灯喜迎元宵佳节的文章就介绍到这了,更多相关Python制作3D花灯内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。