標籤:

GlumPy 中文文檔翻譯:上手簡介

這也真算是失蹤人口回歸吧,我有一個月沒有寫跟 Python 相關的內容了。

主要是這一個月以來肺炎和氣管炎先後折磨著我,身體狀況比較狗帶,好在現在已經好起來了。

之前 @閆霄龍 老兄問我關於 GlumPy 在 Windows 上安裝的一些問題,我後來發現這個安裝過程確實比較曲折,其中一些步驟可能官網原版的介紹中並不細緻,所以在 GlumPy 中文文檔翻譯:安裝指南 中我補充了一些安裝過程的截圖,並且提供了一些必備依賴組件的下載鏈接。


本文檔原文地址

GlumPy 中文文檔翻譯項目的 Github 鏈接

開始上手使用一個新的庫或者框架有時候可能會讓人頭大,尤其是要閱讀超級多的參考資料的情況下。本章就僅對 GlumPy 進行一下非常簡要的介紹,而不去糾結各種細節。

主要內容

  • 創建窗口
  • 繪製四邊形
  • 生成動畫

創建窗口

創建一個新的窗口,這個過程代碼看起來應該是比較好理解的,如下所示: (譯者註:這裡的代碼每一個步驟之間都是連貫的,建議讀者在 ipython 裡面逐個粘貼,不要錯過漏掉中間的,否則運行肯定出錯。所以當你遇到運行出錯的時候建議先檢查一下是不是中間有漏掉的。)

from glumpy import appnwindow = app.Window()napp.run()n

這時候你就能在桌面上馬上看到這個窗口了,可能窗口上還有一些亂七八糟的內容。這是因為我們沒有對創口進行清空。所以下面這個帶窗口清空的代碼就更好一些:

from glumpy import appnnwindow = app.Window()nn@window.eventndef on_draw(dt):n window.clear()nnapp.run()n

在這個版本的代碼中,使用了 on_draw() 這個事件,每當窗口需要重繪(redraw)的時候,就會調用這個事件。在 on_draw 這個 handler 中,窗口(window)區域被清理到了默認的背景顏色—黑色。

最後調用了 app.run(),這就將控制器交給了 GlumPy 應用循環體,可以對滑鼠和鍵盤之類的應用事件進行響應。

特別注意

只有當所有的應用窗口都關閉的情況下,run 方法才會返回(return),除非整個程序是運行在交互模式(interactive mode)下。如果你使用了 --interactive 這樣的參數來切換到交互模式下運行,那麼 app.run() 就可能不會顯示出一整塊。(譯者註:這句話翻譯得有問題,原文是 If you start the program using the --interactive switch, the app.run() is no longer blocking,回頭我再詳細潤色。)

繪製四邊形

現代的 OpenGL 非常強大,但是理解起來挺難的,編寫相關程序也是如此。任何的繪製操作都需要一系列的準備步驟,這就使得在不使用第三方庫的情況下,繪製過程會繁瑣無比。GlumPy 通過 gloo 界面,提供了一些非常簡單的使用體驗,gloo 可以看做是將 NumPy 和 OpenGL 結合起來的一種「膠水(glue)」。(譯者註:這也是 GlumPy 名字的意義所在,GL + NumPy = GlumPy)

接下來咱們就用 GlumPy 來繪製一個彩色的四邊形吧。第一步自然還是要導入相關的模塊然後創建窗口:

from glumpy import app, gloo, glnnwindow = app.Window()n

然後我們要創建一個 GLSL 程序,用來顯示這個四邊形。這就要我們先來寫一個頂點(vertex)和一個片段著色器(fragment shader),這兩個是要用來告訴 OpenGL 要繪製什麼,以及如何繪製。目前你還不用糾結去理解這些名詞概念和細節,但是要注意到一個重要的點,就是這些 OpenGL 程序都是文本形式的字元串(text strings)。

vertex = """n attribute vec2 position;n void main()n {n gl_Position = vec4(position, 0.0, 1.0);n } """nnfragment = """n uniform vec4 color;n void main() {n gl_FragColor = color;n } """nnquad = gloo.Program(vertex, fragment, count=4)n

gloo 界面的一個好處就是可以直接上傳使用非常直觀易於人類理解的記號來表達的數據給 GPU(圖形處理單元)。position 參數直接關聯到了頂點著色器(vertex shader)的位置屬性,而 color 參數則直接關聯了片段著色器(fragment shader)中的顏色分布。

quad[position] = [(-0.5, -0.5),n (-0.5, +0.5),n (+0.5, -0.5),n (+0.5, +0.5)]nquad[color] = 1,0,0,1 # 紅色n

最後,在 on_draw() 方法中通過 gl.GL_TRIANGLE_STRIP 來渲染這個四邊形。代碼如下所示:

@window.eventndef on_draw(dt):n window.clear()n quad.draw(gl.GL_TRIANGLE_STRIP)nnapp.run()n

生成動畫

動畫(animation)其實只是每個時間步長中對顯示內容逐漸調整而實現的。我們還利用上面的四邊形這個例子,讓這個四邊形隨著時間而擴大和縮小。第一步需要在 on_draw() 函數中提供 dt 這個參數來跟蹤記錄時間,這個 dt 參數給出的是自從上次調用之後經過的時間。接下來我們首先要對頂點著色器的代碼進行修改,使四邊形的坐標隨著時間變數的正弦值而變化。

vertex = """n uniform float time;n attribute vec2 position;n void main()n {n vec2 xy = vec2(sin(2.0*time));n gl_Position = vec4(position*(0.25 + 0.75*xy*xy), 0.0, 1.0);n } """nnquad = gloo.Program(vertex, fragment, count=4)n

然後還需要對時間變數進行初始化,在每次繪製調用的時候對該變數進行更新。

@window.eventndef on_draw(dt):n window.clear()n quad["time"] += dtn quad.draw(gl.GL_TRIANGLE_STRIP)nnquad["time"] = 0.0nquad[color] = 1,0,0,1nquad[position] = [(-1, -1), (-1, +1), (+1, -1), (+1, +1)]napp.run()n

特別注意

如果你想要把動畫錄製下來,可以在運行程序的時候添加 --record filename 這樣的後綴來實現。


推薦閱讀:

小心了!小白無法入門Python你不可避免的4個陷阱
數據科學導論:序章
關愛女性健康,從我做起
Python 單元測試
完全理解Python關鍵字"with"與上下文管理器

TAG:Python | OpenGL |