最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python制作一盞 3D 花燈喜迎元宵佳節(jié)

 更新時(shí)間:2021年02月26日 14:28:28   作者:酸菜魚編程  
這篇文章主要介紹了用Python制作一盞 3D 花燈喜迎元宵佳節(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

說(shuō)起元宵節(jié),各位有沒有覺得這是咱們中國(guó)人最浪漫的節(jié)日呢?國(guó)人向來(lái)拘謹(jǐn)古板,一年到頭都是小心謹(jǐn)慎地過(guò)日子,唯有元宵節(jié)這天可以縱情豪放一把。東風(fēng)夜放花千樹,寶馬雕車香滿路,火樹銀花霓虹閃爍,豪車遍地美女如云。細(xì)品,你甚至都能嗅到香奈兒的味道!月上柳梢頭,人約黃昏后,這又是何等的浪漫!比起燭光晚宴、鮮花加持,這份浪漫更顯純真。晚至明清,民間元宵節(jié)的喜慶氣氛,堪比西班牙的奔牛節(jié)、巴西的狂歡節(jié)、泰國(guó)的潑水節(jié)。

由于眾所周知的原因,估計(jì)今年的趵突泉元宵節(jié)燈會(huì)又要黃了。去哪兒體驗(yàn)“花市燈如晝”的節(jié)日氣氛呢?Don't worry,沒有什么事能夠難倒程序員——用3D技術(shù)也可以做出下圖這樣的走馬燈,算是聊勝于無(wú)吧。

1.原材料

花燈紙

如下所示,還可以加上自己喜歡的圖案、文字等。

Python環(huán)境和模塊

一臺(tái)安裝了Python環(huán)境的電腦,Python環(huán)境需要安裝以下模塊。

  • numpy
  • pillow
  • wxgl

如果沒有上述模塊,請(qǐng)參考下面的命令安裝。

pip install numpy
pip install pillow
pip install wxgl

NumPy和 pillow 是 Python 旗下最常用的科學(xué)計(jì)算庫(kù)和圖像處理庫(kù),屬于常用模塊。WxGL 是一個(gè)基于 PyOpenGL 的三維數(shù)據(jù)可視化庫(kù),以 wx 為顯示后端,提供 Matplotlib 風(fēng)格的交互式應(yīng)用模式,同時(shí),也可以和 wxPython 無(wú)縫結(jié)合,在wx的窗體上繪制三維模型。

2.制作工序

花燈制作工序非常簡(jiǎn)單,只需要三十行代碼,可以直接在Python IDLE中以交互方式逐行執(zhí)行。

導(dǎo)入模塊

>>> 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定義的是圖像存儲(chǔ)路徑,請(qǐng)據(jù)實(shí)修改。Image.open(fn)打開文件,返回一個(gè)PIL對(duì)象,np.array()將PIL對(duì)象轉(zhuǎn)成numpy.ndarray數(shù)組對(duì)象。除以255,將圖像數(shù)據(jù)從0到255的值域范圍變成0到1,適應(yīng)WxGL的接口要求。查看數(shù)組的shape,顯示圖像分辨率為400像素高、942像素寬,每個(gè)像素有三種顏色(此處為RGB)。

根據(jù)花燈紙的大小制作龍骨

紙長(zhǎng)942像素,卷成圓筒,半徑就是149.9像素,如果把半徑視為1個(gè)單位,則高度400像素相當(dāng)于2.668個(gè)單位。

>>> rows, cols, deep = im.shape
>>> cols/(2*np.pi)
149.9239563925654
>>> r = 1
>>> h = 2*np.pi*rows/cols
>>> h
2.6680192387174464

接下來(lái)需要制作半徑1個(gè)單位、高度2.668個(gè)單位的圓筒狀龍骨了。

>>> 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就是圓筒狀龍骨上各個(gè)點(diǎn)的x坐標(biāo)、y坐標(biāo)、z坐標(biāo)。下面的代碼,每隔10個(gè)點(diǎn)抽取1個(gè)點(diǎn),用mesh的方法畫出龍骨形狀。當(dāng)然,也可以畫出全部的點(diǎn),那樣頂點(diǎn)就會(huì)連成一片。

>>> plt.mesh(xs[::10,::10], ys[::10,::10], zs[::10,::10], mode='FLBL')
>>> plt.show()

用3D的方式畫出來(lái)的龍骨,效果如下。

給龍骨貼上花燈紙

有了龍骨,接下來(lái)就可以把花燈紙貼在龍骨上了。繼續(xù)操作之前,記得先把剛才彈出的3D龍骨窗口關(guān)閉。

>>> plt.mesh(xs, ys, zs, im)
>>> plt.show()

不過(guò),你會(huì)立刻發(fā)現(xiàn),花燈紙上下方向貼反了。沒關(guān)系,我們可以像下面這樣反轉(zhuǎn)方向。

>>> plt.mesh(xs, ys, zs, im[::-1])
>>> plt.show()

怎么樣,是不是有一點(diǎn)走馬燈的雛形了呢?

制作旋轉(zhuǎn)葉輪

走馬燈之所以能夠轉(zhuǎn)動(dòng),是因?yàn)槔锩嬗邢灎T加熱形成上升氣流,推動(dòng)頂部的葉輪旋轉(zhuǎn),從而帶動(dòng)花燈旋轉(zhuǎn)。當(dāng)然,這里的葉輪僅僅是個(gè)樣子,花燈旋轉(zhuǎn)依賴另外的機(jī)制實(shí)現(xiàn)。

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

葉輪設(shè)計(jì)有6片,用三角形模擬,顏色深紅,透明度0.8,整體效果略顯粗糙了一點(diǎn)。

加上照明燈和提系

照明燈用一個(gè)白色的圓球表示,提系則是紅色的一條直線,兼做照明燈的電源線。

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

讓花燈轉(zhuǎn)起來(lái)

花燈旋轉(zhuǎn)的實(shí)現(xiàn)非常簡(jiǎn)單,只需要給show方法一個(gè)rotation參數(shù)就可以。

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

到此這篇關(guān)于使用Python制作一盞 3D 花燈喜迎元宵佳節(jié)的文章就介紹到這了,更多相關(guān)Python制作 3D 花燈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python禁止位置傳參函數(shù)詳解

    python禁止位置傳參函數(shù)詳解

    文章介紹了Python3.x中的關(guān)鍵字參數(shù)特性,說(shuō)明了如何在函數(shù)定義中使用*符號(hào)來(lái)限制參數(shù)只能通過(guò)關(guān)鍵字傳遞,而不是位置,這種特性在處理參數(shù)較多或順序可能導(dǎo)致混淆的函數(shù)時(shí)特別有用,提高了代碼的可讀性和健壯性
    2024-11-11
  • 一篇文章帶你入門Python正則表達(dá)式

    一篇文章帶你入門Python正則表達(dá)式

    這篇文章主要介紹了Python中正則表達(dá)式的詳細(xì)教程,正則表達(dá)式是Python學(xué)習(xí)進(jìn)階當(dāng)中的重要內(nèi)容,需要的朋友可以參考下
    2021-10-10
  • 用python3教你任意Html主內(nèi)容提取功能

    用python3教你任意Html主內(nèi)容提取功能

    這篇文章主要介紹了用python3教你任意Html主內(nèi)容提取功能,主要使用到了requests、lxml、json等模塊,文中逐一對(duì)這幾個(gè)模塊做了介紹,需要的朋友可以參考下
    2018-11-11
  • 詳解用Python為直方圖繪制擬合曲線的兩種方法

    詳解用Python為直方圖繪制擬合曲線的兩種方法

    這篇文章主要介紹了詳解用Python為直方圖繪制擬合曲線的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python 基于Appium控制多設(shè)備并行執(zhí)行

    python 基于Appium控制多設(shè)備并行執(zhí)行

    這篇文章主要介紹了python 如何基于Appium控制多設(shè)備并行執(zhí)行,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • django使用多個(gè)數(shù)據(jù)庫(kù)的方法實(shí)例

    django使用多個(gè)數(shù)據(jù)庫(kù)的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于django使用多個(gè)數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python接口自動(dòng)化淺析logging日志原理及模塊操作流程

    Python接口自動(dòng)化淺析logging日志原理及模塊操作流程

    這篇文章主要為大家介紹了Python接口自動(dòng)化系列文章淺析logging日志原理及模塊操作流程,文中詳細(xì)說(shuō)明了為什么需要日志?日志是什么?以及日志用途等基本的原理
    2021-08-08
  • 深入理解python虛擬機(jī)GIL詳解

    深入理解python虛擬機(jī)GIL詳解

    在目前的 CPython 當(dāng)中一直有一個(gè)臭名昭著的問(wèn)題就是 GIL (Global Interpreter Lock ),就是全局解釋器鎖,他限制了 Python 在多核架構(gòu)當(dāng)中的性能,在本篇文章當(dāng)中我們將詳細(xì)分析一下 GIL 的利弊和 GIL 的 C 的源代碼
    2023-10-10
  • 使用python實(shí)現(xiàn)鏈表操作

    使用python實(shí)現(xiàn)鏈表操作

    鏈表是計(jì)算機(jī)科學(xué)里面應(yīng)用最廣泛的數(shù)據(jù)結(jié)構(gòu)之一。這篇文章主要介紹了使用python實(shí)現(xiàn)鏈表操作,需要的朋友可以參考下
    2018-01-01
  • Python數(shù)據(jù)解析之BeautifulSoup4的用法詳解

    Python數(shù)據(jù)解析之BeautifulSoup4的用法詳解

    Beautiful?Soup?是一個(gè)可以從?HTML?或?XML?文件中提取數(shù)據(jù)的?Python?庫(kù),這篇文章主要來(lái)和大家介紹一下BeautifulSoup4的用法,需要的可以參考一下
    2023-06-06

最新評(píng)論

琼海市| 嫩江县| 宜兴市| 江山市| 读书| 内乡县| 商丘市| 定兴县| 汝城县| 丁青县| 永顺县| 工布江达县| 托克托县| 汉川市| 石嘴山市| 丹东市| 金湖县| 来宾市| 施秉县| 江达县| 惠水县| 连平县| 汝南县| 漳州市| 张北县| 中卫市| 宁蒗| 天等县| 金门县| 彩票| 夏河县| 五莲县| 南召县| 天水市| 久治县| 进贤县| 肃北| 青岛市| 桦川县| 德江县| 西青区|