PyOpenGL-安裝與測(cè)試

1猜极,目的

本文只是為了初步了解一下Python的OpenGL使用方法(整合前輩的技術(shù)Blog)缨叫,至于繪圖方面的博大精深,我們尚不知一二剪勿,有待于作者以后深入學(xué)習(xí)和實(shí)踐贸诚,不在本文的講述范圍。不過(guò)厕吉,計(jì)算機(jī)繪圖方面的技術(shù)深度和商業(yè)使用酱固,是值得深入學(xué)習(xí)研究的。但是头朱,是否是Python所長(zhǎng)运悲,就看以后的技術(shù)演化了。

2项钮,安裝

  • 執(zhí)行Linux命令安裝
pip install PyOpenGL PyOpenGL_accelerate
  • Windows下班眯,Pycharm安裝
    ** PyOpenGL
    ** PyOpenGL_accelerate

3,初級(jí)Demo

下面的代碼烁巫,可以直接執(zhí)行署隘,詳細(xì)的函數(shù)介紹,請(qǐng)查看:
用PyOpenGL叩開(kāi)3D的心扉——OpenGL全解析(3)
http://eyehere.net/2011/learn-opengl-3d-by-pyopengl-3/

先上圖:


此處輸入圖片的描述
此處輸入圖片的描述

再看代碼:

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

def drawFunc():
    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()

最后程拭,代碼介紹:

初始化窗口

11~17行基本也是固定的定踱,

glutInit()是用glut來(lái)初始化OpenGL的,所有的問(wèn)題都交給這個(gè)函數(shù)吧恃鞋,基本不用管崖媚,雖說(shuō)可以接受參數(shù)的,基本無(wú)用恤浪。

glutInitDisplayMode(MODE)非常重要畅哑,這里告訴系統(tǒng)我們需要一個(gè)怎樣顯示模式。至于其參數(shù)GLUT_RGBA就是使用(red,
green, blue)的顏色系統(tǒng)水由。有沒(méi)有寫(xiě)錯(cuò)荠呐?這里有個(gè)A啊,不應(yīng)該是(red, green, blue,
alpha)么砂客?大概是歷史原因泥张,GLUT_RGBA和GLUT_RGB是其實(shí)是等價(jià)的(坑爹啊)鞠值,要想實(shí)現(xiàn)Alpha還得用其他的參數(shù)媚创。而GLUT_SINGLE意味著所有的繪圖操作都直接在顯示的窗口執(zhí)行,相對(duì)的彤恶,我們還有一個(gè)雙緩沖的窗口钞钙,對(duì)于動(dòng)畫(huà)來(lái)說(shuō)非常合適鳄橘。看看用Python和Pygame寫(xiě)游戲-從入門(mén)到精通(3)有些說(shuō)明芒炼。

glutInitWindowSize(400,
400)這個(gè)函數(shù)很容易理解瘫怜,設(shè)置出現(xiàn)的窗口的大小。實(shí)際上還有個(gè)glutInitWindowPosition()也很常用本刽,用來(lái)設(shè)置窗口出現(xiàn)的位置鲸湃。

glutCreateWindow(“First”),一旦調(diào)用了盅安,就出現(xiàn)一個(gè)窗口了唤锉,參數(shù)就是窗口的標(biāo)題。

glutDisplayFunc(func)是glut非常討人喜歡的一個(gè)功能别瞭,它注冊(cè)了一個(gè)函數(shù)株憾,用來(lái)繪制OpenGL窗口,這個(gè)函數(shù)里就寫(xiě)著很多OpenGL的繪圖操作等命令嗤瞎,也就是我們主要要學(xué)習(xí)的東西。

glutMainLoop()贝奇,主循環(huán)虹菲,一旦調(diào)用了,我們的OpenGL就一直運(yùn)行下去了毕源。和很多程序中的主循環(huán)一樣陕习,不停的運(yùn)行霎褐,畫(huà)出即時(shí)的圖像,處理輸入等该镣。

繪圖

看看drawFunc里的幾句話冻璃,這里是實(shí)際繪圖的函數(shù)损合。

glClear(GL_COLOR_BUFFER_BIT)是把先前的畫(huà)面給清除,這基本是定律跋炕,每次重繪之前都要把原來(lái)的畫(huà)面擦除土居,否則疊加起來(lái)什么都看不出了嬉探。glClear一看就知道是OpenGL原生的命令,而參數(shù)就是指明要清除的buffer棉圈。大家一定會(huì)有疑問(wèn),我們清除胎围,不就是清除屏幕上的畫(huà)面么德召,為什么還要指定?OpenGL的博大精深這里就體現(xiàn)出來(lái)了福荸,buffer不僅僅有我們看到的那個(gè)GL_COLOR_BUFFER_BIT肴掷,OpenGL中還有其他的buffer類(lèi)型,我們會(huì)在后面的章節(jié)講到台夺。

glutWireTeapot(0.5)是glut提供的繪制猶他茶壺的工具函數(shù)痴脾,茶壺還是相當(dāng)復(fù)雜的一個(gè)幾何體,用這個(gè)函數(shù)一下子就畫(huà)出來(lái)了滚朵,不過(guò)基本也就演示用用薯定。這里是用的線模型,因?yàn)闆](méi)有說(shuō)光照和材質(zhì)话侄,如果glutSolidTeapot()畫(huà)出來(lái)就成紙片兒了。

glFlush()似乎不用多說(shuō)年堆,畫(huà)了那么多,自然要刷新一下顯示芽狗。不過(guò)痒蓬,這里的刷新不僅僅是屏幕上的更新滴劲,實(shí)際上顾复,它是處理OpenGL的渲染流水線,讓所有排隊(duì)中的命令得到執(zhí)行萧芙。OpenGL的渲染流水線是一個(gè)很重要的概念假丧,不過(guò)這里暫時(shí)還不打算多說(shuō)明,否則對(duì)初學(xué)者來(lái)說(shuō)渔期,未免有些麻煩了渴邦。但是這并不意味著可以無(wú)視這些基礎(chǔ),知道怎么做只能讓你優(yōu)秀,知道為什么這么做才能讓你卓越宅静。

小驚喜

現(xiàn)在你可以把注釋的兩個(gè)語(yǔ)句打開(kāi)了姨夹,執(zhí)行以下看到什么?旋轉(zhuǎn)的茶壺磷账!不得不說(shuō)帥多了~

glutIdleFunc(Func)又是一個(gè)激動(dòng)人心的函數(shù),可以讓OpenGL在閑暇之余吼鱼,調(diào)用一下注冊(cè)的函數(shù)绰咽,這是是產(chǎn)生動(dòng)畫(huà)的絕好方法。

glRotatef(1, 0, 1,
0)是一個(gè)我們以后會(huì)詳細(xì)講的函數(shù)琐谤,簡(jiǎn)單來(lái)說(shuō)四個(gè)參數(shù)第一個(gè)是角度玩敏,后三個(gè)是一個(gè)向量质礼,意義就是繞著這個(gè)向量旋轉(zhuǎn)眶蕉,這里是繞著Y軸旋轉(zhuǎn)1°陈哑。這一度一度的累加,最后使得茶壺圍繞Y軸不停的旋轉(zhuǎn)刽宪。從這里我們也能看出來(lái)界酒,我們指定了一個(gè)旋轉(zhuǎn)的角度后,重新繪制并不會(huì)復(fù)位庇谆,而是在上一次旋轉(zhuǎn)的結(jié)果上繼續(xù)旋轉(zhuǎn)凭疮。這是一個(gè)非常重要的概念,OpenGL是一個(gè)狀態(tài)機(jī)执解,一旦你指定了某種狀態(tài)衰腌,知道再指定位置,它會(huì)保持那種狀態(tài)右蕊。不僅僅是旋轉(zhuǎn)饶囚,包括以后的光照貼圖等等,都遵循這樣的規(guī)律坯约。

好了闹丐,我們有了第一個(gè)PyOpenGL程序了,雖然離我們?cè)敿?xì)中的五光十色的立體世界還有些差距,不過(guò)畢竟畫(huà)了點(diǎn)東西出來(lái)了(要知道梨与,猶他茶壺在3D技術(shù)發(fā)展之初文狱,是里程碑一般的作品)。慢慢的呻粹,我們會(huì)充實(shí)自己的知識(shí)苏研,繪制出更靚麗的畫(huà)面筹燕。

4衅鹿,入門(mén)Demo

下面的代碼可以直接執(zhí)行,詳細(xì)的代碼請(qǐng)查看:
用PyOpenGL叩開(kāi)3D的心扉——OpenGL全解析(5)
http://eyehere.net/2013/learn-opengl-3d-by-pyopengl-5/

先上圖:


此處輸入圖片的描述
此處輸入圖片的描述

再看代碼:

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from numpy import *
import sys

global W, H, R
(W, H, R) = (500, 500, 10.0)


def init():
    glClearColor(1.0, 1.0, 1.0, 1.0)


def drawfunc():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(0.0, 0.0, 0.0)
    glBegin(GL_POINTS)
    for x in arange(-R, R, 0.04):
        print '%.1f%%r' % ((R + x) / (R + R) * 100),
        for y in arange(-R, R, 0.04):
            r = cos(x) + sin(y)
            glColor3f(cos(y * r), cos(x * y * r), sin(x * r))
            glVertex2f(x, y)
    print '100%!!'
    glEnd()
    glFlush()


def reshape(w, h):
    if h <= 0: h = 1;
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    if w <= h:
        gluOrtho2D(-R, R, -R * h / w, R * h / w)
    else:
        gluOrtho2D(-R * w / h, R * w / h, -R, R)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()


def keyboard(key, x, y):
    if key == chr(27) or key == "q":  # Esc is 27
        sys.exit()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowPosition(20, 20)
    glutInitWindowSize(W, H)
    glutCreateWindow("Artist Drawer")
    glutReshapeFunc(reshape)
    glutDisplayFunc(drawfunc)
    glutKeyboardFunc(keyboard)
    init()
    glutMainLoop()

main()

最后,代碼介紹:

glViewport:指定了視口程序顯示的范圍忍捡,也就是OpenGL繪制的范圍切黔,這里使用(0, 0, w,
h)便是說(shuō)明整個(gè)窗口具篇,一般情況下總是如此驱显,但是我們也是可以指定小于這個(gè)范圍的ViewPort的。事實(shí)上我隱瞞了很多細(xì)節(jié)埃疫,這個(gè)函數(shù)必須和下面要講的gluOrtho2D函數(shù)一起用才能出現(xiàn)正確的結(jié)果。
gluOrtho2D:這個(gè)函數(shù)派生于OpenGL的glOrtho翠桦,它創(chuàng)建了一個(gè)正交的視景體(View
Volume),我們所看到的物體丛晌,都處在這個(gè)體中斗幼,四個(gè)參數(shù)分別代表了(left, right, bottom,
top),也就是豎直的左右邊界和水平的下上邊界谋逻;而近遠(yuǎn)則是默認(rèn)的(-1桐经,
1),glOrtho有六個(gè)參數(shù)可以設(shè)定荧恍。這個(gè)體越大屯吊,我們看到的東西就越小骗爆;反之看到的東西就越大蔽介。我知道這樣很難理解,打個(gè)比方就是一個(gè)六邊形的魚(yú)缸犀呼,這個(gè)函數(shù)定出了一個(gè)魚(yú)缸的大小薇组,我們所看的東西呢,都在這個(gè)魚(yú)缸里面宋光。
上面說(shuō)glViewport要和gluOrtho2D一起用才能正確顯示是個(gè)什么意思呢炭菌?gluOrtho2D只管創(chuàng)建一個(gè)視體,而glViewport只管繪圖的范圍赘艳,如果視體是個(gè)正方體,而窗口是個(gè)長(zhǎng)方體阔馋,直接繪制的結(jié)果會(huì)是什么呢娇掏?很明顯,整個(gè)視體里的東西都被拉長(zhǎng)了下梢,而一般我們viewport都是指明了窗口大小塞蹭,自然只能修改視體來(lái)適應(yīng)各種不同的比例了。
修改代碼岗屏,拉伸窗口漱办,查看最終的結(jié)果會(huì)是怎樣的。

glMatrixMode:這個(gè)函數(shù)非常難以理解暇屋,但是又極其重要洞辣!這關(guān)系到了OpenGL中的“矩陣”的概念。矩陣……你是說(shuō)黑客帝國(guó)么定鸟?好像很有趣誒~~
嗯嗯沒(méi)錯(cuò)著瓶,矩陣是個(gè)偉大的東西,通過(guò)它,3D世界的所有維度都蜷曲到內(nèi)存中的一維數(shù)據(jù)里去了华糖。這是一個(gè)有點(diǎn)兒抽象的概念但其實(shí)也沒(méi)什么特別的瘟裸,OpenGL里有如下幾種矩陣:

GL_MODELVIEW:模型觀察矩陣,表示物體的位置變化和觀察點(diǎn)的改變兼搏;
GL_PROJECTION:投影矩陣,描述如何將一個(gè)物體投影到平面上裳朋; GL_TEXTURE:紋理矩陣吓著,描述紋理坐標(biāo)的動(dòng)態(tài)變化 …
我不想搬出一堆數(shù)字和大括號(hào)來(lái)說(shuō)明矩陣的基本運(yùn)算和應(yīng)用(好吧其實(shí)真實(shí)原因是我也不會(huì):),也不會(huì)告訴你最后的ModelView矩陣是View矩陣與Model矩陣的乘積暖眼,更不會(huì)告訴你有g(shù)lRotate和glTranslate之流的函數(shù)來(lái)改變矩陣纺裁!暫時(shí)這么理解就好了欺缘,矩陣就是我們走路的方向,我們現(xiàn)在朝南走笼才,看到的南邊的風(fēng)景络凿,然后說(shuō)“向右拐”,現(xiàn)在看到西邊的風(fēng)景了摔踱,再說(shuō)“向后轉(zhuǎn)”怨愤,現(xiàn)在看到東邊的風(fēng)景了。就是通過(guò)這樣可以累積的變換篮愉,我們把我們最初的一些數(shù)據(jù)變成了更復(fù)雜的東西表達(dá)了出來(lái)差导,轉(zhuǎn)了幾圈后也許有點(diǎn)糊涂了,用glLoadIdentity將當(dāng)前指定的矩陣還原為最初的狀態(tài)颠蕴。

5,參考頁(yè)面

PyOpenGL安裝
http://pyopengl.sourceforge.net/
用PyOpenGL叩開(kāi)3D的心扉——OpenGL全解析(3)
http://eyehere.net/2011/learn-opengl-3d-by-pyopengl-3/
用PyOpenGL叩開(kāi)3D的心扉——OpenGL全解析(5)
http://eyehere.net/2013/learn-opengl-3d-by-pyopengl-5/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寡键,隨后出現(xiàn)的幾起案子昌腰,更是在濱河造成了極大的恐慌,老刑警劉巖遭商,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劫流,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仍秤,警方通過(guò)查閱死者的電腦和手機(jī)可很,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)我抠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瓣窄,你說(shuō)我怎么就攤上這事纳鼎。” “怎么了劝贸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵映九,是天一觀的道長(zhǎng)疙剑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嚼蚀,這世上最難降的妖魔是什么管挟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任僻孝,我火速辦了婚禮,結(jié)果婚禮上您单,老公的妹妹穿的比我還像新娘荞雏。我一直安慰自己,他們只是感情好悦陋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布俺驶。 她就那樣靜靜地躺著棍辕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪送矩。 梳的紋絲不亂的頭發(fā)上哪替,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天凭舶,我揣著相機(jī)與錄音,去河邊找鬼帅霜。 笑死身冀,一個(gè)胖子當(dāng)著我的面吹牛括享,可吹牛的內(nèi)容都是我干的珍促。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼穴翩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起歉嗓,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤遥椿,失蹤者是張志新(化名)和其女友劉穎淆储,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碴裙,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舔株,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年载慈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了珍手。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寡具,死狀恐怖稚补,靈堂內(nèi)的尸體忽然破棺而出课幕,到底是詐尸還是另有隱情五垮,我是刑警寧澤杜秸,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布亩歹,位于F島的核電站凡橱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏顾稀。R本人自食惡果不足惜坝撑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一巡李、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殊橙,春花似錦狱从、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至豺鼻,卻和暖如春款慨,著一層夾襖步出監(jiān)牢的瞬間檩奠,已是汗流浹背附帽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工井誉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喳钟。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓奔则,卻偏偏與公主長(zhǎng)得像蔽午,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抽莱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1 前言 一直想沿著圖像處理這條線建立一套完整的理論知識(shí)體系食铐,同時(shí)積累實(shí)際應(yīng)用經(jīng)驗(yàn)僧鲁。因此有了從使用AVFounda...
    RichardJieChen閱讀 5,677評(píng)論 5 12
  • 開(kāi)發(fā)基于 OpenGL 的應(yīng)用程序悔捶,必須先了解 OpenGL 的庫(kù)函數(shù)。它采用 C 語(yǔ)言風(fēng)格犁柜,提供大量的函數(shù)來(lái)進(jìn)行...
    sillen閱讀 3,084評(píng)論 0 4
  • Android平臺(tái)下OpenGL初步 Android OpenGL ES 開(kāi)發(fā)教程 從入門(mén)到精通http://bl...
    garyhu1閱讀 1,501評(píng)論 1 2
  • 我是準(zhǔn)備慢慢把十二宮寫(xiě)過(guò)來(lái)的,因?yàn)楫?dāng)初參加寫(xiě)作營(yíng)沒(méi)想好要寫(xiě)什么堂淡,于是就把自己知道的拿來(lái)分享吧馋缅。可是參加了之...
    米粒粒1閱讀 332評(píng)論 0 0
  • 從今年1月開(kāi)始在簡(jiǎn)書(shū)上日更绢淀,每天一篇萤悴,無(wú)論寫(xiě)字長(zhǎng)短好壞,也無(wú)論感冒發(fā)燒還是回老家探親皆的,幾乎沒(méi)斷過(guò)更覆履。從最初的熬夜到...
    窗外陽(yáng)光閱讀 1,323評(píng)論 32 42