用PyOpenGL叩開3D的心扉——OpenGL全解析(3) - 程式人生
文章推薦指數: 80 %
對Python來說可能不是很重要,不過還是要說明一下,OpenGL函式有d(double)的版本,C/C++語言一般預設浮點數就是double,使用d版本函式可能會顯得比較 ...
程式人生>>用PyOpenGL叩開3D的心扉——OpenGL全解析(3)
用PyOpenGL叩開3D的心扉——OpenGL全解析(3)
阿新••發佈:2018-12-30
第一個PyOpenGL程式
說實話我們OpenGL的基礎還遠遠沒有學完,不過我在說下去大概就不會有人看了,所以,雖然稍稍有些早,開始我們的第一個程式吧。
fromOpenGL.GLimport*
fromOpenGL.GLUimport*
fromOpenGL.GLUTimport*
defdrawFunc():
glClear(GL_COLOR_BUFFER_BIT)
#glRotatef(1,0,1,0)
glutWireTeapot(0.5)
glFlush()
glutInit()
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA)
glutInitWindowSize(400,400)
glutCreateWindow("First")
glutDisplayFunc(drawFunc)
#glutIdleFunc(drawFunc)
glutMainLoop()注意,這裡執行可能會出現這樣的錯誤。
_base_glutInit(ctypes.byref(count),holder)
TypeError:'NoneType'objectisnotcallable
如果有,在網上下載glut32.dll檔案,放到c:\windows\SysWOW64資料夾中就可以正常運行了。
結果如上圖,雖然很短,相信這裡面很多函式大家會覺得陌生,不要緊,這些程式碼是每個程式中都需要的,基本看兩個就OK了,下面來詳細說明一下。
先把註釋的兩個函式給無視了,看看一開始三行的匯入,OpenGL一開始是以C寫成的,所以OpenGL的程式中繪圖的程式碼也是一大堆的函式,沒有什麼物件類的,所以我們把相關函式全部倒入,雖然這有些汙染環境的感覺和Python的設計機理有些不符,不過這麼多年都過來了:),而且OpenGL中的函式都是有字首的,問題也不大。
OpenGL函式的命名規則
一般的函式命名如下:
字首有gl、glu、aux、glut、wgl、glx、agl等等,分別表示該函式屬於OpenGL那個開發庫等。
所謂開發庫,要知道原生的OpenGL是跨平臺的,跨平臺意味著很多功能是無法實現的,比如說Windows和X-Window的視窗實現機制是不同的,OpenGL並不關心這些東西,只管畫圖。
所以,OpenGL並沒有視窗函式,比如無法建立視窗,無法獲得輸入……這些東西都需要其他的函式庫來實現。
我們可以用我之前講述的Pygame來建立視窗,然後用PyOpenGL來繪圖,不過咱不能要求每個看PyOpenGL教程的朋友都先看一遍Pygame教程(這樣就是強買強賣了不是),所以這裡就用OpenGL常用的工具函式庫來實現。
我們主要使用兩種,一個是GLU庫,它提供了比較基礎的命令的封裝,可以很簡單的實現比較多的複雜功能;而另外一個就是GLUT,glut是不依賴於視窗平臺的OpenGL工具包,目的是隱藏不同視窗平臺API的複雜度,提供更為複雜的繪製功能,我們會大量的使用它。
引數數和引數函式就很好理解了,有點像匈牙利命名法,f說明是個float,i說明是int等等。
對Python來說可能不是很重要,不過還是要說明一下,OpenGL函式有d(double)的版本,C/C++語言一般預設浮點數就是double,使用d版本函式可能會顯得比較簡單,但是我們不推薦。
因為OpenGL內部資料都是以float的形式存放的,如果使用double會對效能有一定的影響。
舉個例子,glColor3f()表示了該函式屬於gl庫,引數是三個float型引數指標。
類似的函式還有glColor3i,glColor4f等,我們用glColor*()來表示這一類函式。
初始化視窗
11~17行基本也是固定的,
glutInit()是用glut來初始化OpenGL的,所有的問題都交給這個函式吧,基本不用管,雖說可以接受引數的,基本無用。
glutInitDisplayMode(MODE)非常重要,這裡告訴系統我們需要一個怎樣顯示模式。
至於其引數GLUT_RGBA就是使用(red,green,blue)的顏色系統。
有沒有寫錯?這裡有個A啊,不應該是(red,green,blue,alpha)麼?大概是歷史原因,GLUT_RGBA和GLUT_RGB是其實是等價的(坑爹啊),要想實現Alpha還得用其他的引數。
而GLUT_SINGLE意味著所有的繪圖操作都直接在顯示的視窗執行,相對的,我們還有一個雙緩衝的視窗,對於動畫來說非常合適。
看看用Python和Pygame寫遊戲-從入門到精通(3)有些說明。
glutInitWindowSize(400,400)這個函式很容易理解,設定出現的視窗的大小。
實際上還有個glutInitWindowPosition()也很常用,用來設定窗口出現的位置。
glutCreateWindow(“First”),一旦呼叫了,就出現一個視窗了,引數就是視窗的標題。
glutDisplayFunc(func)是glut非常討人喜歡的一個功能,它註冊了一個函式,用來繪製OpenGL視窗,這個函式裡就寫著很多OpenGL的繪圖操作等命令,也就是我們主要要學習的東西。
glutMainLoop(),主迴圈,一旦呼叫了,我們的OpenGL就一直執行下去了。
和很多程式中的主迴圈一樣,不停的執行,畫出即時的影象,處理輸入等。
繪圖
看看drawFunc裡的幾句話,這裡是實際繪圖的函式。
glClear(GL_COLOR_BUFFER_BIT)是把先前的畫面給清除,這基本是定律,每次重繪之前都要把原來的畫面擦除,否則疊加起來什麼都看不出了。
glClear一看就知道是OpenGL原生的命令,而引數就是指明要清除的buffer。
大家一定會有疑問,我們清除,不就是清除螢幕上的畫面麼,為什麼還要指定?OpenGL的博大精深這裡就體現出來了,buffer不僅僅有我們看到的那個GL_COLOR_BUFFER_BIT,OpenGL中還有其他的buffer型別,我們會在後面的章節講到。
glutWireTeapot(0.5)是glut提供的繪製猶他茶壺的工具函式,茶壺還是相當複雜的一個幾何體,用這個函式一下子就畫出來了,不過基本也就演示用用。
這裡是用的線模型,因為沒有說光照和材質,如果glutSolidTeapot()畫出來就成紙片兒了。
glFlush()似乎不用多說,畫了那麼多,自然要重新整理一下顯示。
不過,這裡的重新整理不僅僅是螢幕上的更新,實際上,它是處理OpenGL的渲染流水線,讓所有排隊中的命令得到執行。
OpenGL的渲染流水線是一個很重要的概念,不過這裡暫時還不打算多說明,否則對初學者來說,未免有些麻煩了。
但是這並不意味著可以無視這些基礎,知道怎麼做只能讓你優秀,知道為什麼這麼做才能讓你卓越。
小驚喜
現在你可以把註釋的兩個語句打開了,執行以下看到什麼?旋轉的茶壺!不得不說帥多了~
glutIdleFunc(Func)又是一個激動人心的函式,可以讓OpenGL在閒暇之餘,呼叫一下注冊的函式,這是是產生動畫的絕好方法。
glRotatef(1,0,1,0)是一個我們以後會詳細講的函式,簡單來說四個引數第一個是角度,後三個是一個向量,意義就是繞著這個向量旋轉,這裡是繞著Y軸旋轉1°。
這一度一度的累加,最後使得茶壺圍繞Y軸不停的旋轉。
從這裡我們也能看出來,我們指定了一個旋轉的角度後,重新繪製並不會復位,而是在上一次旋轉的結果上繼續旋轉。
這是一個非常重要的概念,OpenGL是一個狀態機,一旦你指定了某種狀態,知道再指定位置,它會保持那種狀態。
不僅僅是旋轉,包括以後的光照貼圖等等,都遵循這樣的規律。
好了,我們有了第一個PyOpenGL程式了,雖然離我們詳細中的五光十色的立體世界還有些差距,不過畢竟畫了點東西出來了(要知道,猶他茶壺在3D技術發展之初,是里程碑一般的作品)。
慢慢的,我們會充實自己的知識,繪製出更靚麗的畫面。
挖掘機租賃需要註意什麽?這些你都知道嗎?
«上一篇
在windows下python3使用multiprocessing.Pool時出現的問題下一篇»
相關推薦
用PyOpenGL叩開3D的心扉——OpenGL全解析(3)
第一個PyOpenGL程式
說實話我們OpenGL的基礎還遠遠沒有學完,不過我在說下去大概就不會有人看了,所以,雖...
從零打造線上網盤系統之Struts2框架核心功能全解析
歡迎瀏覽Java工程師SSH教程從零打造線上網盤系統系列教程,本系列教程將會使用SSH(Struts2+Spring+Hibernate)打造一個線上網盤...
New程式媛OpenGL全解析之—基本圖元與繪製
大家好!
本期丹丹將給大家解析OpenGL基本圖元以及繪製~~
本期視訊的連結地址是:
ht...
New程式媛OpenGL全解析之—紋理
大家好本期視訊的連結地址是:https://www.bilibili.com/video/av24529999/大家也可以直接...
New程式媛OpenGL全解析之—向量
大家好本期視訊的連結地址是:https://www.bilibili.com/video/av23269538/大家也可以直接...
New程式媛OpenGL全解析之—第一個OpenGL程式解析
大家好!本期丹丹將給大家解析第一個OpenGL程式本期視訊的連結地址是:https://www.bilibili.com/vi...
流媒體開發:RTP協議全解析(H264碼流和PS流)
1、RTPHeader解析
...
螞蟻金服天街:螞蟻雙11大促OceanBase核心技術全解析
狀態如果能type閱讀完成內容cto針對性正在演講嘉賓簡介:田啟傑(花名:天街)
現任螞蟻金服高級技術專...
FOF常用的七種投資策略全解析
從當前市場上的投資策略種類來看,大致有七種,包括核心*衛星投資策略、「槓鈴」投資策略、反向投資策略、成本平均策略和時間分散...
軟件工程--常用軟件開發模型比較分析
開發模型軟件工程正如任何事物一樣,軟件也有其孕育、誕生、成長、成熟和衰亡的生存過程,一般稱其為“軟件生命周期”。
軟件生命周期一般分為6個階段,即制定...
搜尋
基礎教學
Mysql入門
Sql入門
Android入門
Docker入門
Go語言入門
Ruby程式入門
Python入門
Python進階
Django入門
Python爬蟲入門
最近訪問
延伸文章資訊
- 1PyOpenGL:是一個調用OpenGL的2D/3D的python圖形庫
1 說明1.1 PyOpenGL:是一個調用OpenGL的2D/3D的python圖形庫。1.2 OpenGL:1.2.1 Open Graphics Library,開放圖形庫或者。1.2.2...
- 2PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫
1 說明1.1 PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫。1.2 OpenGL:1.2.1 Open Graphics Library,開放圖形庫或者。1.2.2...
- 3A Loading and Rendering 3D Models with OpenGL and ...
Beyond chapter 3, when we start writing programs that transform and animate graphics, I begin to ...
- 4PyEngine3D is open source opengl 3d engine project wirtten ...
Welcome to PyEngine3D. An open source Python 3D engine using the pyopengl API that uses pygame an...
- 5用PyOpenGL叩開3D的心扉——OpenGL全解析(3) - 程式人生
對Python來說可能不是很重要,不過還是要說明一下,OpenGL函式有d(double)的版本,C/C++語言一般預設浮點數就是double,使用d版本函式可能會顯得比較 ...