1. 程式人生 > >OpenGL學習筆記(2)第一個程式——猶他茶壺(Teapot)

OpenGL學習筆記(2)第一個程式——猶他茶壺(Teapot)

好了,python+opengl的開發環境搭建好後,我們就可以開始學習了。

這裡,我們先學習一個常見的例子——猶他茶壺。

先貼程式碼

  1. fromOpenGL.GL import*
  2. fromOpenGL.GLU import*
  3. fromOpenGL.GLUT import*
  4. def drawFunc():
  5. glClear(GL_COLOR_BUFFER_BIT)
  6. #glRotatef(1, 0, 1, 0)
  7. glutWireTeapot(0.5)
  8. glFlush()
  9. glutInit()
  10. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
  11. glutInitWindowSize
    (400,400)
  12. glutCreateWindow("First")
  13. glutDisplayFunc(drawFunc)
  14. #glutIdleFunc(drawFunc)
  15. glutMainLoop()

效果圖


(Linux 下可以用scrot來截圖

Linux Mint 安裝:sudo apt-get install scrot 

用法:請自行百度

程式

初始化視窗

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

glutInit()是用glut來初始化OpenGL的,所有的問題都交給這個函式吧,基本不用管,雖說可以接受引數的,基本無用。

glutInitDisplayMode(MODE)非常重要,這裡告訴系統我們需要一個怎樣顯示模式。至於其引數GLUT_RGBA就是使用(red, green, blue)的顏色系統。

glutInitWindowSize(400, 400)這個函式很容易理解,設定出現的視窗的大小。實際上還有個glutInitWindowPosition()也很常用,用來設定窗口出現的位置。

glutCreateWindow(“Teapot”),一旦呼叫了,就出現一個視窗了,引數就是視窗的標題。

glutDisplayFunc(drawFunc)是glut非常討人喜歡的一個功能,它註冊了一個函式,用來繪製OpenGL視窗,這個函式裡就寫著很多OpenGL的繪圖操作等命令,也就是我們主要要學習的東西。

glutMainLoop(),主迴圈,一旦呼叫了,我們的OpenGL就一直執行下去了。和很多程式中的主迴圈一樣,不停的執行,畫出即時的影象,處理輸入等。

繪圖

看看drawFunc裡的幾句話,這裡是實際繪圖的函式。

glClear(GL_COLOR_BUFFER_BIT)是把先前的畫面給清除,這基本是定律,每次重繪之前都要把原來的畫面擦除,否則疊加起來什麼都看不出了。

glutWireTeapot(0.5)是glut提供的繪製猶他茶壺的工具函式,這是一個別人寫好的程式碼,咱們直接拿過來用就好,茶壺還是相當複雜的一個幾何體,用這個函式一下子就畫出來了,不過基本也就演示用用。這裡是用的線模型,因為沒有說光照和材質,如果glutSolidTeapot()畫出來就成紙片兒了。

glFlush()似乎不用多說,畫了那麼多,自然要重新整理一下顯示。不過,這裡的重新整理不僅僅是螢幕上的更新,實際上,它是處理OpenGL的渲染流水線,讓所有排隊中的命令得到執行

小驚喜

現在你可以把註釋的兩個語句打開了,執行一下看到旋轉的茶壺!

glutIdleFunc(drawFunc)又是一個激動人心的函式,可以讓OpenGL在閒暇之餘,呼叫一下注冊的函式,這是是產生動畫的絕好方法。

glRotatef(1, 0, 1, 0)四個引數第一個是角度,後三個是一個向量,意義就是繞著這個向量旋轉,這裡是繞著Y軸旋轉1°。這一度一度的累加,最後使得茶壺圍繞Y軸不停的旋轉。從這裡我們也能看出來,我們指定了一個旋轉的角度後,重新繪製並不會復位,而是在上一次旋轉的結果上繼續旋轉。這是一個非常重要的概念,OpenGL是一個狀態機,一旦你指定了某種狀態,知道再指定位置,它會保持那種狀態。不僅僅是旋轉,包括以後的光照貼圖等等,都遵循這樣的規律。