说起元宵节,各位有没有觉得这是咱们中国人最浪漫的节日呢?国人向来拘谨古板,一年到头都是小心谨慎地过日子,唯有元宵节这天可以纵情豪放一把。东风夜放花千树,宝马雕车香满路,火树银花霓虹闪烁,豪车遍地美女如云。细品,你甚至都能嗅到香奈儿的味道!月上柳梢头,人约黄昏后,这又是何等的浪漫!比起烛光晚宴、鲜花加持,这份浪漫更显纯真。晚至明清,民间元宵节的喜庆气氛,堪比西班牙的奔牛节、巴西的狂欢节、泰国的泼水节。
由于众所周知的原因,估计今年的趵突泉元宵节灯会又要黄了。去哪儿体验“花市灯如昼”的节日气氛呢?Don't worry,没有什么事能够难倒程序员——用3D技术也可以做出下图这样的走马灯,算是聊胜于无吧。
1.原材料
花灯纸
如下所示,还可以加上自己喜欢的图案、文字等。
Python环境和模块
一台安装了Python环境的电脑,Python环境需要安装以下模块。
- numpy
- pillow
- wxgl
如果没有上述模块,请参考下面的命令安装。
pip install numpy pip install pillow pip install wxgl
NumPy和 pillow 是 Python 旗下最常用的科学计算库和图像处理库,属于常用模块。WxGL 是一个基于 PyOpenGL 的三维数据可视化库,以 wx 为显示后端,提供 Matplotlib 风格的交互式应用模式,同时,也可以和 wxPython 无缝结合,在wx的窗体上绘制三维模型。
2.制作工序
花灯制作工序非常简单,只需要三十行代码,可以直接在Python IDLE中以交互方式逐行执行。
导入模块
> import numpy as np > from PIL import Image > import wxgl.wxplot as plt
打开花灯纸图像
> 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 > 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的方式画出来的龙骨,效果如下。
给龙骨贴上花灯纸
有了龙骨,接下来就可以把花灯纸贴在龙骨上了。继续操作之前,记得先把刚才弹出的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')
让花灯转起来
花灯旋转的实现非常简单,只需要给show方法一个rotation参数就可以。
plt.show(rotation='h-')
最终的花灯效果如下。
3.完整代码
# -*- coding: utf-8 -*- import numpy as np from PIL import Image import wxgl.wxplot as plt 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-')
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]