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

Python+OpenGL制作一個元宵花燈

 更新時間:2022年02月15日 09:40:32   作者:天元浪子  
又是一年元宵節(jié)!如果昨天情人節(jié)的紅包發(fā)得手軟又心疼,不妨利用Python OpenGL做一盞花燈送給女朋友,也許比紅包更能討她歡心呢

又是一年元宵節(jié),作為程序員的你,打算怎么過呢?如果昨天情人節(jié)的紅包發(fā)得手軟又心疼,不妨靜下心來,了解一下三維數(shù)據(jù)可視化,順便做一盞花燈送給女朋友,也許比紅包更能討她歡心呢。

1.準備

三維數(shù)據(jù)快速可視化工具,我喜歡用WxGL。這是一個基于PyOpenGL的三維數(shù)據(jù)可視化庫,提供類似Matplotlib風格的3D繪圖函數(shù)。如果熟悉NumPy和Matplotlib的話,只需要幾分鐘時間就可以學會使用WxGL的交互式繪圖。

WxGL模塊使用pip命令安裝。

pip install wxgl

安裝完成后,可以在Python IDLE中查看版本信息。

>>> import wxgl
>>> wxgl.version
'0.8.5'

2.快速體驗

元宵、花燈和月亮,是元宵節(jié)的三大主題元素。我們就以一個文藝范兒的月亮開啟WxGL的體驗之旅吧。

import wxgl.wxplot as plt

plt.title('江天一色無纖塵,皎皎空中孤月輪')
plt.uvsphere((0,0,0), 1, lon=(0,360), lat=(90,-90), texture='res/moon.jpg', light=None)
plt.text('眾里尋他千百度,', pos=(1.2,-0.3,0), size=128)
plt.text('驀然回首,', pos=(1.2,-0.5,0), size=128)
plt.text('那人卻在燈火闌珊處。', pos=(1.2,-0.7,0), size=128)
plt.show()

這幾行代碼,使用uvsphere球面函數(shù)繪制了一個中心點在三維坐標系原點、半徑為1的月亮。忽略模塊名的話,這些代碼和Matplotlib的風格幾乎是完全一致的,甚至函數(shù)名都是相同的。

運行show函數(shù)會彈出一個窗口,顯示繪制的模型。窗口底部提供了一組工具按鈕,可以設置系統(tǒng)參數(shù)、切換畫布風格、顯示或隱藏坐標網(wǎng)格、播放動畫、保存或錄制屏幕等。和Matplotlib一樣,該窗口將阻塞程序運行,直至關閉該窗口。

3.模型動畫

通過transform參數(shù)傳遞一個以時間長度為參數(shù)的函數(shù)給uvsphere球面函數(shù),就可以讓上面的月亮轉動起來。

import wxgl.wxplot as plt

plt.title('江天一色無纖塵,皎皎空中孤月輪')
plt.uvsphere((0,0,0), 1,?
? ? lon = (0,360),?
? ? lat = (90,-90),?
? ? texture = 'res/moon.jpg',?
? ? transform = lambda duration : ((0, 1, 0, (0.02*duration)%360),),
? ? light = None # 關閉燈光效果,環(huán)境光會自動增強
)
plt.text('眾里尋他千百度,', pos=(1.2,-0.3,0), size=128)
plt.text('驀然回首,', pos=(1.2,-0.5,0), size=128)
plt.text('那人卻在燈火闌珊處。', pos=(1.2,-0.7,0), size=128)
plt.show()

代碼中l(wèi)ambda函數(shù)——當然也可以是普通的函數(shù),其參數(shù)duration是以毫秒為單位的時間長度。該函數(shù)返回月球圍繞一個向量(此處為(0,1,0),即y軸)旋轉的角度。點擊播放按鈕,月球即開始以20°/s的速度旋轉。

對了,差點兒忘記提供月球的紋理圖片了。點擊此處可下載不帶水印的月球紋理圖片。

4.子圖布局

在一張畫布上可以任意放置多個子圖。下面的代碼演示了子圖布局函數(shù)subplot的經(jīng)典用法。實際上,這個函數(shù)比Matplotlib的同名函數(shù)更靈活和便捷。

import wxgl.wxplot as plt

plt.subplot(121)
plt.title('經(jīng)緯度網(wǎng)格生成球體')
plt.uvsphere((0,0,0), 1, color='coral', fill=False, slices=15)
plt.subplot(122)
plt.title('正八面體迭代細分生成球體')
plt.isosphere((0,0,0), 1, color='cyan', fill=False, iterations=2)
plt.show()

在畫布上創(chuàng)建兩個子圖,使用兩種不同的方式繪制球,并設置填充模式。由于使用相同的視點系統(tǒng),兩個子圖上的模型可以保持同步。

5.顏色映射

對于數(shù)據(jù)快速可視化工具來說,顏色映射是必不可少的。下面的代碼演示了ColorBar的用法。代碼中的jet、Paired、rainbow等顏色映射表繼承自Matplotlib庫。

import numpy as np
import wxgl.wxplot as plt

vs = np.random.random((300, 3))*2-1
color = np.random.random(300)
size = np.random.randint(3, 15, size=300)
plt.scatter(vs, color, 'jet', size=size)
plt.colorbar('jet', [-1, 1], loc='right')
plt.colorbar('Paired', [-5, 5], loc='bottom', subject='溫度')
plt.colorbar('rainbow', [0, 77], loc='bottom', subject='速度')
plt.title('scatter函數(shù)和colorbar函數(shù)示例')
plt.show()

WxGL允許在一張圖上使用兩個垂直風格的ColorBar和三個水平風格的ColorBar。

6.走馬燈

去年元宵節(jié)我寫過一篇繪制3D花燈的博客,用的工具也是WxGL,當時的版本還是0.6.4。牛去虎來,整整一年過去了,WxGL終于艱難地升級到了0.8.5,那篇博客中的代碼也必須要升級了。

import numpy as np
import wxgl.wxplot as plt

r = 1 # 花燈半徑為1
tf_bull = lambda duration : ((0, 1, 0, (0.02*duration)%360),) # 模型動畫函數(shù)

# 以下生成花燈筒狀龍骨
theta = np.linspace(0, 2*np.pi, 361) # 在0°~360°范圍內(nèi)間隔1°均勻生成361個角度
xs = r * np.tile(np.cos(theta), (150,1)) # 半徑為r的圓周上361點的x坐標,重復150次,得到150行361列的二維數(shù)組
zs = r * np.tile(-np.sin(theta), (150,1)) # 半徑為r的圓周上361點的z坐標,重復150次,得到150行361列的二維數(shù)組
ys = np.repeat(np.linspace(2.7, 0, 150), 361).reshape(150,361) # 0~2.7范圍內(nèi)均勻生成150個點,每個重復361,得到150行361列的二維數(shù)組

# 以下生成花燈葉輪
theta = np.linspace(0, 2*np.pi, 18, endpoint=False)
x, z = r * np.cos(theta), r * np.sin(theta)
y = np.ones(18) * 2.5
x[2::3] = x[1::3]
x[1::3] = 0
z[2::3] = z[1::3]
z[1::3] = 0
vs = np.stack((x,y,z), axis=1)

# 公牛動畫函數(shù):順時針旋轉,20°/s,向左平移1.2
tf_bull = lambda duration : ((0, 1, 0, (-0.02*duration)%360), (-1.2,0,0)) 

# 老虎動畫函數(shù):逆時針旋轉,20°/s,向右平移1.2
tf_tiger = lambda duration : ((0, 1, 0, (0.02*duration)%360), (1.2,0,0)) 


plt.figure(elev=20) # 設置相機高度角為20°

# 公牛花燈
plt.mesh(xs, ys, zs, texture='res/bull.jpg', transform=tf_bull, light=None) # 花燈筒
plt.surface(vs, color=(0.75,0.2,0,0.8), transform=tf_bull) # 花燈葉輪
plt.uvsphere((0,0.8,0), 0.4, color='#FFFFFF', transform=((-1.2,0,0),), light=None) # 燈
plt.line([[0,1.2,0],[0,3.5,0]], color='red', width=3.0, transform=((-1.2,0,0),), inside=False) # 線

# 老虎花燈
plt.mesh(xs, ys, zs, texture='res/tiger.jpg', transform=tf_tiger, light=None) # 花燈筒
plt.surface(vs, color=(0.75,0.2,0,0.8), transform=tf_tiger) # 花燈葉輪
plt.uvsphere((0,0.8,0), 0.4, color='#FFFFFF', transform=((1.2,0,0),), light=None) # 燈
plt.line([[0,1.2,0],[0,3.5,0]], color='red', width=3.0, transform=((1.2,0,0),), inside=False) # 線

plt.show()

兩只花燈使用相同的尺寸,畫在同一個位置?;敉埠腿~輪的模型動畫函數(shù)除了旋轉還分別向左右移動了1.2個長度單位,而燈和線則只移動不旋轉。最終效果如下圖所示。

代碼中用的公牛和老虎的花燈紋理,請點擊下載:公牛老虎。

到此這篇關于Python+OpenGL制作一個元宵花燈的文章就介紹到這了,更多相關Python OpenGL元宵花燈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python numpy.add函數(shù)的具體使用

    Python numpy.add函數(shù)的具體使用

    本文主要介紹了Python numpy.add函數(shù)的具體使用,numpy.add函數(shù)不僅僅是一個簡單的加法操作,更是一個功能強大且高度優(yōu)化的工具,可適用于各種復雜的數(shù)值計算和數(shù)據(jù)處理任務,感興趣的可以了解一下
    2023-12-12
  • 淺析Python的web.py框架中url的設定方法

    淺析Python的web.py框架中url的設定方法

    web.py是Python的一個輕量級Web開發(fā)框架,這里我們來淺析Python的web.py框架中url的設定方法,需要的朋友可以參考下
    2016-07-07
  • 命令行傳遞參數(shù)argparse.ArgumentParser的使用解析

    命令行傳遞參數(shù)argparse.ArgumentParser的使用解析

    這篇文章主要介紹了命令行傳遞參數(shù)argparse.ArgumentParser的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python訪問純真IP數(shù)據(jù)庫的代碼

    python訪問純真IP數(shù)據(jù)庫的代碼

    項目中有這樣的需求,通過IP地址判斷客戶端是網(wǎng)通的還是電信的。從同事那拿了個純文本的IP純真數(shù)據(jù)庫,用Python寫了一個小程序,感覺挺好的。
    2011-05-05
  • Python使用zmail進行郵件發(fā)送的示例詳解

    Python使用zmail進行郵件發(fā)送的示例詳解

    這篇文章主要為大家詳細介紹了Python如何使用zmail進行郵件發(fā)送功能,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-03-03
  • Python+Pygame實現(xiàn)簡單的單詞小游戲

    Python+Pygame實現(xiàn)簡單的單詞小游戲

    語言是一種藝術,但是作為語言的基礎——詞匯,卻不像藝術那樣賞心悅目。不斷的記憶與復習,讓詞匯成為很多孩子在學習英語時,最難完全攻克的關卡。本文就來用Python制作一個簡單的英語單詞游戲吧
    2023-03-03
  • 詳解Python 解壓縮文件

    詳解Python 解壓縮文件

    這篇文章主要介紹了Python 解壓縮文件,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Python進程multiprocessing.Process()的使用解讀

    Python進程multiprocessing.Process()的使用解讀

    這篇文章主要介紹了Python進程multiprocessing.Process()的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python用循環(huán)新建多個列表的代碼實例

    python用循環(huán)新建多個列表的代碼實例

    當我們處理數(shù)據(jù)時,有時候需要創(chuàng)建多個列表以存儲不同類型或不同條件下的數(shù)據(jù),在Python中,我們可以利用循環(huán)來快速、高效地創(chuàng)建這些列表,本文將介紹如何使用循環(huán)在Python中創(chuàng)建多個列表,并提供代碼實例,需要的朋友可以參考下
    2024-04-04
  • python讀文件逐行處理的示例代碼分享

    python讀文件逐行處理的示例代碼分享

    python讀文件逐行處理的示例代碼分享,大家參考使用吧
    2013-12-12

最新評論

新安县| 林州市| 朔州市| 陕西省| 土默特右旗| 罗定市| 怀柔区| 阿克| 紫阳县| 万宁市| 平谷区| 开远市| 寿阳县| 雷波县| 阿拉善右旗| 聂拉木县| 鄂尔多斯市| 突泉县| 永昌县| 汉阴县| 恩平市| 海丰县| 柘荣县| 开化县| 泸西县| 巴南区| 大余县| 蓬溪县| 杨浦区| 威信县| 牟定县| 临沧市| 达日县| 石渠县| 宾川县| 怀柔区| 东乌| 平乡县| 于都县| 无为县| 马鞍山市|