怎么用Python 3D技术制作元宵节走马花灯
这篇文章主要讲解了“怎么用Python 3D技术制作元宵节走马花灯”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python 3D技术制作元宵节走马花灯”吧!
效果图:
可以加上自己喜欢的图案、文字等。
2.2 Python环境和模块一台安装了 Python 环境的电脑,Python 环境需要安装以下模块。
numpy
pillow
wxgl
如果没有上述模块,请参考下面的命令安装。
pipinstallnumpypipinstallpillowpipinstallwxgl
NumPy 和 pillow 是 Python 旗下最常用的科学计算库和图像处理库,属于常用模块。WxGL 是一个基于 PyOpenGL 的三维数据可视化库,以 wx 为显示后端,提供 Matplotlib 风格的交互式应用模式,同时,也可以和 wxPython 无缝结合,在 wx 的窗体上绘制三维模型。
花灯制作工序非常简单,只需要三十行代码,可以直接在 Python IDLE 中以交互方式逐行执行。
3.1 导入模块>>>importnumpyasnp>>>fromPILimportImage>>>importwxgl.wxplotasplt3.2 打开花灯纸图像
>>>fn=r'D:\temp\light0115\res\paper.png'>>>im=np.array(Image.open(fn))/255>>>im.shape(400,942,3)
fn 定义的是图像存储路径,请据实修改。Image.open(fn)
打开文件,返回一个 PIL 对象,np.array()
将 PIL 对象转成 numpy.ndarray
数组对象。除以255,将图像数据从 0 到 255 的值域范围变成0到1,适应 WxGL 的接口要求。查看数组的 shape,显示图像分辨率为400 像素高、942 像素宽,每个像素有三种颜色(此处为RGB)。
纸长 942 像素,卷成圆筒,半径就是 149.9 像素,如果把半径视为1个单位,则高度 400 像素相当于 2.668 个单位。
>>>rows,cols,deep=im.shape>>>cols/(2*np.pi)149.9239563925654>>>r=1>>>h=2*np.pi*rows/cols>>>h2.6680192387174464
接下来需要制作半径1个单位、高度2.668个单位的圆筒状龙骨了。
>>>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))
这里的 xs
、ys
、zs
就是圆筒状龙骨上各个点的x坐标、y坐标、z坐标。下面的代码,每隔10个点抽取1个点,用 mesh
的方法画出龙骨形状。当然,也可以画出全部的点,那样顶点就会连成一片。
>>>plt.mesh(xs[::10,::10],ys[::10,::10],zs[::10,::10],mode='FLBL')>>>plt.show()3.4 给龙骨贴上花灯纸
有了龙骨,接下来就可以把花灯纸贴在龙骨上了。继续操作之前,记得先把刚才弹出的3D龙骨窗口关闭。
>>>plt.mesh(xs,ys,zs,im)>>>plt.show()
不过,你会立刻发现,花灯纸上下方向贴反了。没关系,我们可以像下面这样反转方向。
>>>plt.mesh(xs,ys,zs,im[::-1])>>>plt.show()3.5 制作旋转叶轮
走马灯之所以能够转动,是因为里面有蜡烛加热形成上升气流,推动顶部的叶轮旋转,从而带动花灯旋转。当然,这里的叶轮仅仅是个样子,花灯旋转依赖另外的机制实现。
>>>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')3.7 让花灯转起来
花灯旋转的实现非常简单,只需要给 show
方法一个 rotation
参数就可以。
plt.show(rotation='h-')四、完整源代码
有了上面的解说,完整的源代码就不用注释了。全部代码三十余行,各位可自行扩展,制作出更多的花灯来。
#-*-coding:utf-8-*-importnumpyasnpfromPILimportImageimportwxgl.wxplotaspltim=np.array(Image.open('res/paper.png'))/255rows,cols,deep=im.shaper,h=1,2*np.pi*rows/colstheta=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]=0y[2::3]=y[1::3]y[1::3]=0z=np.ones(18)*h*0.9vs=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技术制作元宵节走马花灯这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。