点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

独有宦游人,偏惊物候新。

1 前言

说起元宵节,各位有没有觉得这是咱们中国人最浪漫的节日呢?国人向来拘谨古板,一年到头都是小心谨慎地过日子,唯有元宵节这天可以纵情豪放一把。东风夜放花千树,宝马雕车香满路,火树银花霓虹闪烁,豪车遍地美女如云。细品,你甚至都能嗅到香奈儿的味道!月上柳梢头,人约黄昏后,这又是何等的浪漫!比起烛光晚宴、鲜花加持,这份浪漫更显纯真。晚至明清,民间元宵节的喜庆气氛,堪比西班牙的奔牛节、巴西的狂欢节、泰国的泼水节。

由于众所周知的原因,估计今年的趵突泉元宵节灯会又要黄了。去哪儿体验“花市灯如昼”的节日气氛呢?Don't worry,没有什么事能够难倒程序员——用3D技术也可以做出下图这样的走马灯,算是聊胜于无吧。


2 原材料

2.1 花灯纸

如下所示,还可以加上自己喜欢的图案、文字等。

2.2 Python环境和模块

一台安装了Python环境的电脑,Python环境需要安装以下模块。

  • numpy

  • pillow

  • wxgl

如果没有上述模块,请参考下面的命令安装。

pip install numpy
pip install pillow
pip 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 = 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)。

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
>>> h
2.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', method='T', mode='FCBC', alpha=0.8)
>>> plt.show()

叶轮设计有6片,用三角形模拟,颜色深红,透明度0.8,整体效果略显粗糙了一点。


3.6 加上照明灯和提系

照明灯用一个白色的圆球表示,提系则是红色的一条直线,兼做照明灯的电源线。

>>> 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-')

最终的花灯效果如下。


4 完整源代码

有了上面的解说,完整的源代码就不用注释了。全部代码三十余行,各位可自行扩展,制作出更多的花灯来。

# -*- coding: utf-8 -*-import numpy as np
from PIL import Image
import wxgl.wxplot as pltim = np.array(Image.open('res/paper.png'))/255
rows, cols, deep = im.shaper, 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-')

------------------- End -------------------

往期精彩文章推荐:

  • 手把手教你利用Python轻松拆分Excel为多个CSV文件

  • Python项目实战——手把手教你使用Django框架实现支付宝付款

  • 手把手教你用Python爬取百度搜索结果并保存

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~

元宵节就要到了,手把手教你用Python打造一款3D花灯相关推荐

  1. 手把手教你用Python打造一款批量下载视频并能可视化显示下载进度的下载器

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 桃之夭夭,灼灼其华. /1 前言/ ...

  2. 手把手教你用Python打造一款属于你自己的个性二维码

    击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 今夜闻君琵琶语,如听仙乐耳暂明. / ...

  3. 手把手教你使用Python打造一款简易搜索引擎

    /1 前言/ 相信大家在知识共享的这个年代一定在网上下载了很多的文件保存以供日后有时间学习吧,毕竟硬盘空间也比较有限,下面我们就来说说我们要做的这个项目,就是搜索盘搜里的资源然后进行下载. /2 项目 ...

  4. python 视频下载进度_手把手教你用Python打造一款批量下载视频并能可视化显示下载器...

    3.直接上代码和注释. #解析页面def parser: ab=[] rep=requests.get('http://v.u00.cn:93/iappce.htm#sp',timeout=5,hea ...

  5. 手把手教你用Python打造一款批量下载视频并能可视化显示下载!

    /1 前言/ 平时宅在家的我们最爱做的事莫过于追剧了,但是有时候了,网络原因,可能会让你无网可上.这个时候那些好看的电视剧和电影自然是无法观看了,本期我们要讲的就是怎样下载这些视频. /2 项目目标/ ...

  6. 手把手教你用Python打造一个语音合成系统

    击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 大弦嘈嘈如急雨,小弦切切如私语. / ...

  7. 手把手教你用Python改造一款外星人入侵小游戏

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 为学应须毕生力,攀高贵在少年时. ...

  8. 手把手教你使用Python打造绚丽的词云图

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 昨夜西风凋碧树,独上高楼,望尽天涯 ...

  9. 手把手教你用Python打造一个语音合成系统(已生成软件)

    /前言/ 平时我们聊天的时候,也许会想着录制一些自己的声音,而且还想有点特色,也就是所谓的变声,今天我们要说的就是这个变声器的制作,说的高大上点就是语音合成系统. 这个语音合成系统,能实现个性化语音的 ...

最新文章

  1. 25页PPT带你吃透微信、陌陌等著名IM软件设计架构(值得珍藏)
  2. ThinkPHP 3.2 Token表单令牌
  3. Redis安装异常解决办法
  4. 基于用户投票的排名算法(三):Stack Overflow
  5. am335x linux内核烧写_实时 Linux 抖动分析 Step by step
  6. Codeforces 1314 题解
  7. 【OpenCV】直方图应用:直方图均衡化,直方图匹配,对比直方图
  8. Anaconda是什么?Anconda下载安装教程 - Python零基础入门教程
  9. java并发编程实战学习(3)--基础构建模块
  10. 从零开始徒手撸一个vue的toast弹窗组件
  11. ios开发网络学习九:NSURLSessionDownloadTask实现大文件下载
  12. Mysql系列一:SQL入门
  13. opencv保存图像自动命名
  14. YOLOV5训练数据(火焰检测)
  15. 《经济机器是怎样运行的》笔记(一)
  16. 电信光猫F420破解
  17. 神棍节献礼之——URAL1111 Squares(几何)
  18. html文字设置为白色,html如何设置文字颜色白色
  19. hhkb mac设置_HHKB 纯小白入坑指南
  20. 农业动物相关数据集与算法——调研整理

热门文章

  1. 创业公司如何设计合伙人股权的进入和退出机制
  2. python barrier_Python中的Barrier对象
  3. c语言漩涡图形,我看大家都在讨论漩涡矩阵,网上搜了一个大家讨论讨论。
  4. 【做人:一,性格和习惯的重要性[转载]】
  5. 【推荐】2022年区块链行业研究报告投资策略产业发展前景市场行情分析(附件中为网盘地址,报告持续更新)
  6. class 5 搭建个人 Leanote 云笔记本
  7. 深圳国际智能家居展览会
  8. linux gpu 风扇速度,如何在无头节点上调整NVIDIA GPU风扇速度?
  9. 百度地图修改底图样式
  10. 手游代理怎么做?看看这些就知道了