元宵节就要到了,花灯要不要来一盏?3D的那种
又是一年元宵佳节!我国各地庆祝元宵节的方式很有讲究,有的地方吃汤圆,一个个软糯香圆;有的地方办灯展,十分热闹。当然,疫情当下,为了大家的安全,不建议线下聚众集会。但是!网上要把这份热闹搞起来~
作者 | 天元浪子 责编 | 张文
来源 | CSDN 博客
头图 | 下载于视觉中国
前言
说起元宵节,各位有没有觉得这是咱们中国人最浪漫的节日呢?国人向来拘谨古板,一年到头都是小心谨慎地过日子,唯有元宵节这天可以纵情豪放一把。东风夜放花千树,宝马雕车香满路,火树银花霓虹闪烁,豪车遍地美女如云。细品,你甚至都能嗅到香奈儿的味道!月上柳梢头,人约黄昏后,这又是何等的浪漫!比起烛光晚宴、鲜花加持,这份浪漫更显纯真。晚至明清,民间元宵节的喜庆气氛,堪比西班牙的奔牛节、巴西的狂欢节、泰国的泼水节。
由于众所周知的原因,估计今年的趵突泉元宵节灯会又要黄了。去哪儿体验“花市灯如昼”的节日气氛呢?Don’t worry,没有什么事能够难倒程序员——用3D技术也可以做出下图这样的走马灯,算是聊胜于无吧。
原材料
2.1 花灯纸
如下所示,还可以加上自己喜欢的图案、文字等。
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完全手册》。
制作工序
花灯制作工序非常简单,只需要三十行代码,可以直接在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>>> 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', 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-')
最终的花灯效果如下。
完整源代码
有了上面的解说,完整的源代码就不用注释了。全部代码三十余行,各位可自行扩展,制作出更多的花灯来。
# -*- coding: utf-8 -*-
import numpy as npfrom PIL import Imageimport wxgl.wxplot as plt
im = np.array(Image.open('res/paper.png'))/255rows, cols, deep = im.shape
r, 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-'
更多精彩推荐
☞30 周岁的 Python,“虐”我 20 年☞疫情期间网络攻击花样翻新,全年 81748 起安全事件背后暗藏规律☞用数据分析《你好,李焕英》“斐妈”爆红的真相☞最低售价17999元,华为发布新一代折叠屏手机Mate X2
点分享点收藏点点赞点在看
相关文章:

Android Timer的使用
1:服务端使用PHP <?phpecho date(Y-m-d H:i:s); ?> 2:activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…

屏蔽相应键盘按钮
<script language"Javascript"><!-- //屏蔽鼠标右键、CtrlN、ShiftF10、F11、F5刷新、退格键 //Author: meizz(梅花雨) 2002-6-18 function document.oncontextmenu(){event.returnValuefalse;}//屏蔽鼠标右键function window.onhelp(){return false} //…

MySQL查询缓存
2019独角兽企业重金招聘Python工程师标准>>> MySQL 查询缓存保存查询返回的完整结果。当查询命中改缓存,MySQL 会立刻返回结果,跳过了解析、优化和执行阶段。 查询缓存系统会跟踪查询涉及查询中的每个表,如果这些表发生变化&#…

事半功倍系列 javascript
清华大学出版的《事半功倍系列 javascript》,本人照着书敲出来的,有些翻译了一下.前几年看了一下,最近无事,重新翻了翻,很有帮助.本书应该有光盘的,但学校的书,光盘不知在哪.希望对你学 javascript有帮助 第一章javascript简介 1.在地址栏输入javascript语句 Javascript:Doc…

Golang 本地帮助文档
2019独角兽企业重金招聘Python工程师标准>>> godoc -http:8000 url: http://127.0.0.1:8000 转载于:https://my.oschina.net/koalaone/blog/169626

2021版Java知识体系详解!(赠视频)
本篇文章是我们整理的一份架构师的成长路线,包括了并发编程、设计模式、常用框架、中间件、微服务与分布式、常用工具、JVM、MySQL、数据结构与算法,还有架构师精选视频、架构师成长路线高清大图。又是新的一年,每一年都会有人在成为架构师的…

【6】font-size 字体属性
font-style -- 字体风格font-variant -- 小型大写字母文本font-weight -- 文本的粗细font-size/line-height -- 大小/行高font-family -- 字体常用格式: fo…

MIS开发中.net Framework的打印功能
Microsoft .net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下。 打印操作通常包括以下四个功能 1 打印设置 设置打印机的一些参数比如更改打印机驱动程序等 2 页面设置…

UML部署图(转载)
概述: 部署图用于可视化的软件组件部署的系统中的物理组件的拓扑结构。 因此,部署图是用来描述一个系统的静态部署视图。部署图由节点和它们之间的关系。 目的: 部署名称本身描述的原理图的目的。部署图用于描述软件组件部署的硬件组件。组件图和部署图是密切相关的…

一年新增457万例,用 Python 揭示癌症的可怕之处
来源 | 数据分析与篮球作者 | 俊欣头图 | 下载于视觉中国2月27日下午5时许,香港著名演员吴孟达去世,引发了众多影星以及网友在社交媒体上面的悼念,根据其好友田启文的透露,吴孟达是去年年底发现自己患上肝癌的,当时癌细…

深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子
深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子 作者:寒小阳 时间:2016年1月。 出处:http://blog.csdn.net/han_xiaoyang/article/details/50521072 声明:版权所有,转载请联系作者并注明出处 1.引言 前面…

虚拟主机上用Asp.net实现Urlrewrite
在网上看到,很多朋友在asp.net中做urlrewrite,用的是HttpHandle+Server.Transfer的方法。其实这种方法是错误的。第一,HttpHandle是实现不了urlrewrite的;第二Server.Transfer是标准的重定向,根本不是urlre…

String spilt时转义特殊字符【转】
在使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。 我们经常使用public String[] split(String regex)方法来拆分一个有分隔符的字符串,但是由于参数regex是一个 regular-expression的匹配模式而…

融合AI与大数据技术,腾讯教育发布智能作业灯
3月2日,腾讯教育新品发布会在深圳举行,发布会上,腾讯教育联合暗物智能正式对外发布了AILA智能作业灯,并与华东师范大学出版社、宏途教育、众诚智学教育、江西软云科技等教育行业合作伙伴签订战略合作协议,共同打造智慧…
【踩坑记录】记一次MySQL主从复制延迟的坑
最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误。 情景 一个活动信息需要审批,审批之后才能生效。因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容,考虑…

ASP.NET 应用中大文件上传研究
在项目中经常要用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,两个控件的方法是:利用隐含的HttpWorkerRequest,…

哪家互联网公司涨薪最厉害?居然不是阿里腾讯
最近脉脉职言区有一条讨论火了:哪家互联网公司涨薪最厉害?按照拼多多员工的说法,应届毕业生可以拿比腾讯阿里高30%的薪资,而有工作经验的员工普遍薪资水平也高出业内30%~50%以上。而且在去年由于疫情众多企业降薪、甚至裁员的状况…

如何修改 远程桌面的 默认端口号 3389
修改注册表的以下位置的键值: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]"PortNumber"dword:00000d3d

Yolov11-detect训练自己的数据集
至此,整个YOLOv11的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

联通和阿里云合作 建互联网云化卡号管理系统
1月17日晚间消息,继去年11月中国联通与阿里巴巴签订战略合作框架协议之后,今天下午阿里云宣布将于中国联通建卡号管理系统“cBSS2.0集中号卡系统”。据了解,这将是电信行业第一个核心业务系统云化改造的重点工程,也是云计算技术在…

如何最大限度提高.NET的性能
优化 .NET的性能 1)避免使用ArrayList。 因为任何对象添加到ArrayList都要封箱为System.Object类型,从ArrayList取出数据时,要拆箱回实际的类型。建议使用自定义的集合类型代替ArrayList。.net 2.0提供了一个新的类型,叫泛型…

别找了,Thonny 才是 Python 小白的最理想的 IDE
来源 | Python编程时光作者 | 写代码的明哥头图 | 下载于视觉中国当你在搜索引擎(如百度)或者各种问答社区(如知乎)搜索『学习Python 最好的 IDE/编辑器是哪个?』的时候,我想答案肯定是:PyCharm…

图书抄袭何时休,技术人的版权在哪里?
今天,一个很偶然的机会,看到了一本北京邮电大学出版社出版的技术图书《Linux服务器架设、性能调优、集群管理教程——实训与项目案例》,感觉有种似曾相识的感觉,于是打开目录大概了解了下,一个我不想看到的现象发生了&…

让MySql支持表情符号(MySQL中4字节utf8字符保存方法)
UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而MySQL的utf8编码最多3个字节,所以数据插不进去。解决方案:将编码从utf8转换成utf8mb4。 1. 修改my.ini [mysqld] character-set-serverutf8mb4 2. 在Connector/J的连接参数中&a…

短信编码类无错版PDUdecoding.cs
////程 序 员:武志文(蚕蛹)/// sillnet163.net///文 件:PDUdecoding.cs///概 要:针对国内短信编码(USC2)///组成结构:包含四个函数:/// smsDecodedCenterNumber(string…

你还有学了三年建模的朋友吗?他有救了
【 编者按】“我朋友学了 3 年建模”系列,一直以浮夸的操作占据于各大视频网站搞笑榜。此前,来自布拉格捷克理工大学、 Google 研究院、和华盛顿大学以及苏黎世联邦理工学院的研究者们发布了 Monster Mash 项目的论文和动效视频。用户绘制二维图像&#…

iOS培训objective-c——实例化对象
蓝鸥iOS培训推荐:好像好长时间没和大家分享了,那么今天主要和大家说说OC内容创建实例化对象,基本让也就分为几大类:1.ClassName*myNewClassName;//指针2.myNewClassName[ClassNamealloc];//通过alloc这个命令申请一个空间来存放我…

#423 Div2 D
#423 Div2 D 题意 构造一个 n 个节点的树,恰好有 k 个叶子节点 (叶子节点的定义是只与树上的某一个节点存在连边),要求任意两个叶子节点的距离的最大值最小,距离为两个节点间边的数量,输出距离的最大值,以及 n - 1 条边…

CDMA模块上网设置的过程
CDMA模块上网设置的过程一) AT指令设置部分(1) ATCSQ 检查信号 若返回10—31,99之间的信号数字则继续,如果信号是99,99,则应该考虑不停的键入A/命令,不停的让模块去搜寻网络。&…

RedHat 年度报告:只索取不贡献的开源消费“大户”不受待见
编译 | 清儿爸编辑 | 夕颜头图 | 下载于视觉中国据 Red Hat 公司委托发布的一份新报告称,新冠疫情可能在云计算基础设施和企业开源软件方面留下不可磨灭的印记。Red Hat 是 IBM 于 2018 年以 340 亿美元收购的企业开源软件产品供应商。第三次年度《企业开源现状》&a…