- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
元宵节就要到了,手把手教你用Python打造一款3D花灯
如下所示,还可以加上本人宠爱的图案、文字等。
2.2 Python环境和模块
一台安装了Python环境的电脑,Python环境需要安装以下模块。
numpy
pillow
wxgl
假如没有上述模块,请参考下面的命令安装。
pip?install?numpypip?install?pillowpip?install?wxgl
NumPy和pillow是Python旗下最常用的科学计算库和图像处理库,属于常用模块。WxGL是一个基于PyOpenGL的三维数据可视化库,以wx为显示后端,供应Matplotlib风格的交互式应用模式,同时,也可以和wxPython无缝结合,在wx的窗体上绘制三维模型。关于WxGL的更多信息,请参阅我的另一篇博客《格外钟玩转3D绘图:WxGL完全手册》。
3 制造工序
花灯制造工序格外简约,只需要三十行代码,可以直接在Python IDLE中以交互方式逐行执行。
3.1 导入模块
?import?numpy?as?np?from?PIL?import?Image?import?wxgl.wxplot?as?plt
3.2 打开花灯纸图像
?fn?=?rD:\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)。
3.3 依据花灯纸的大小制造龙骨
纸长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()
用3D的方式画出来的龙骨,效果如下。
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,?met
文档评论(0)