91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Python 3D技術制作元宵節走馬花燈

發布時間:2022-02-19 16:44:24 來源:億速云 閱讀:120 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么用Python 3D技術制作元宵節走馬花燈”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用Python 3D技術制作元宵節走馬花燈”吧!

效果圖:

怎么用Python 3D技術制作元宵節走馬花燈

二、原材料

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 的窗體上繪制三維模型。

三、制作工序

花燈制作工序非常簡單,只需要三十行代碼,可以直接在 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))

這里的 xsyszs 就是圓筒狀龍骨上各個點的x坐標、y坐標、z坐標。下面的代碼,每隔10個點抽取1個點,用 mesh 的方法畫出龍骨形狀。當然,也可以畫出全部的點,那樣頂點就會連成一片。

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

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

感謝各位的閱讀,以上就是“怎么用Python 3D技術制作元宵節走馬花燈”的內容了,經過本文的學習后,相信大家對怎么用Python 3D技術制作元宵節走馬花燈這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灌南县| 青神县| 涿州市| 邵武市| 陇川县| 驻马店市| 太和县| 巴彦淖尔市| 和平县| 绥芬河市| 景东| 邵阳县| 英吉沙县| 景德镇市| 青铜峡市| 沂源县| 广灵县| 大冶市| 保山市| 如东县| 宁远县| 太白县| 八宿县| 腾冲县| 镇康县| 蒙山县| 阳谷县| 扬州市| 襄汾县| 赤峰市| 西和县| 县级市| 西林县| 靖宇县| 深水埗区| 大竹县| 周宁县| 巴里| 日土县| 丹阳市| 德阳市|