[Qt教程] 第48篇 进阶(八) 3D绘图简介
生活随笔
收集整理的這篇文章主要介紹了
[Qt教程] 第48篇 进阶(八) 3D绘图简介
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
[Qt教程]?第48篇 進階(八) 3D繪圖簡介
??|?查看: 184|?回復(fù): 0| 3D繪圖簡介 版權(quán)聲明 該文章原創(chuàng)于作者yafeilinux,轉(zhuǎn)載請注明出處! 導(dǎo)語 OpenGL是一個跨平臺的用來渲染3D圖形的標準API。在Qt中提供了QtOpenGL模塊,從而很輕松地實現(xiàn)了在Qt應(yīng)用程序中使用OpenGL,這主要是在QGLWidget類中完成的。因為3D繪圖涉及到了專業(yè)方面的內(nèi)容,我們下面只是講解最簡單的使用,向大家演示在Qt中如何顯示3D圖形。如果大家想深入學(xué)習(xí)openGL繪圖,可以查看網(wǎng)上比較經(jīng)典的nehe的OpenGL教程,為了方便大家下載,我們在網(wǎng)站上提供了下載連接。 環(huán)境:Windows Xp + Qt 4.8.5+QtCreator2.8.0 目錄 一、繪制簡單的圖形 二、添加顏色 三、實現(xiàn)3D效果 正文 一、繪制簡單的圖形 QGLWidget類是一個用來渲染OpenGL圖形的部件,它提供了在Qt應(yīng)用程序中顯示OpenGL圖形的功能。我們只需要繼承該類,然后像使用其他QWidget部件一樣來使用它。QGLWidget提供了三個虛函數(shù),可以在子類中通過重新實現(xiàn)它們來執(zhí)行典型的OpenGL任務(wù): initializeGL():設(shè)置OpenGL渲染環(huán)境,定義顯示列表等。該函數(shù)只在第一次調(diào)用resizeGL()或paintGL()前被調(diào)用一次; resizeGL():設(shè)置OpenGL的視口、投影等。每次部件改變大小時都會調(diào)用該函數(shù); paintGL():渲染OpenGL場景。每當(dāng)部件需要更新時都會調(diào)用該函數(shù)。 下面先來看一個簡單的例子。 1.新建空的Qt項目,項目名稱為myOpenGL,完成后向項目中添加新的C++ Class,類名為MyGLWidget,基類修改為QGLWidget,類型信息選擇“繼承自QWidget”。 2.完成后打開myOpenGL.pro,添加一行代碼: QT?+= opengl 然后保存該文件。 3.打開myglwidget.h文件,添加函數(shù)聲明: protected: ? ??void?initializeGL(); ? ??void?resizeGL(int?w, int h); ? ??void?paintGL(); 4.?再到myglwidget.cpp文件中先添加頭文件包含: #include?<GL/glu.h> 然后添加這三個函數(shù)的定義: void?MyGLWidget::initializeGL() { ? ?glClearColor(0.0, 0.0, 0.0, 0.0); ? ?glShadeModel(GL_SMOOTH); ? ?glClearDepth(1.0); ? ?glEnable(GL_DEPTH_TEST); } glClearColor()函數(shù)用來設(shè)置清除屏幕時使用的顏色,其四個參數(shù)分別用來設(shè)置紅、綠、藍顏色分量和Alpha值,它們的取值范圍都是0.0到1.0,這里四個參數(shù)都為0,表示純黑色。然后設(shè)置了陰影平滑(smooth shading),這樣可以使色彩和光照更加精細。最后設(shè)置了深度緩存和啟用深度測試,用來記錄圖形在屏幕內(nèi)的深度值。 void?MyGLWidget::resizeGL(int?w,?int?h) { ? ?glViewport(0, 0, (GLint)w, (GLint)h); ? ?glMatrixMode(GL_PROJECTION); ? ?glLoadIdentity(); ? ?gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0); ? ?glMatrixMode(GL_MODELVIEW); ? ?glLoadIdentity(); } glViewport()函數(shù)用來設(shè)置視口的大小。然后使用glMatrixMode()設(shè)置了投影矩陣,投影矩陣用來為場景增加**,后面使用了glLoadIdentity()重置投影矩陣,這樣可以將投影矩陣恢復(fù)到初始狀態(tài)。gluPerspective()用來設(shè)置**投影矩陣,這里設(shè)置視角為45度,縱橫比為窗口的縱橫比,最近的位置為0.1,最遠的位置為100,這兩個值是場景中所能繪制的深度的臨界值。大家可以想象,離我們眼睛比較近的東西看起來比較大,而比較遠的東西看起來就比較小。最后設(shè)置并重置了模型視圖矩陣。 void?MyGLWidget::paintGL() { ? ?glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ? ?glLoadIdentity(); ? ?//?繪制三角形 ? ?glTranslatef(-2.0, 0.0, -6.0); ? ?glBegin(GL_TRIANGLES);?? ? ?glVertex3f(0.0, 1.0, 0.0); ? ?glVertex3f(-1.0, -1.0, 0.0); ? ?glVertex3f(1.0, -1.0, 0.0); ? ?glEnd(); ? ?//?繪制四邊形 ? ?glTranslatef(4.0, 0.0, 0.0); ? ?glBegin(GL_QUADS);? ? ? ?glVertex3f(-1.0, 1.0, 0.0); ? ?glVertex3f(1.0, 1.0, 0.0); ? ?glVertex3f(1.0, -1.0, 0.0); ? ?glVertex3f(-1.0, -1.0, 0.0); ? ?glEnd(); } 在開始繪制以前,先要使用glClear()清除屏幕和深度緩存。然后重置了模型視圖矩陣,這樣便將當(dāng)前點移動到了窗口的中心,現(xiàn)在窗口中心即為坐標原點,X軸從左到右,Y軸從下到上,Z軸從里到外。完成這兩步以后就可以進行圖形的繪制了,在圖形繪制開始時,一般會使用glTranslatef()來移動坐標原點,它是相對于當(dāng)前點來移動的,比如這里先將坐標原點左移2.0,向里移6.0,然后繪制了三角形(TRIANGLES)。繪制從glBegin()開始,到glEnd()結(jié)束,使用glVertex3f()來設(shè)置各個頂點的坐標,頂點的繪制順序可以是順時針,也可以是逆時針。要注意逆時針繪制出來的是正面,而順時針繪制出來的是反面,這一點在后面的紋理貼圖部分會顯示出來。當(dāng)繪制完三角形以后,又將原點相對于當(dāng)前點向右移動了4.0,然后繪制了一個四邊形(QUADS)。 5.最后再向項目中添加main.cpp文件,更改內(nèi)容如下: #include?<QApplication> #include?"myglwidget.h" int?main(int argc, char *argv[]) { ? ?QApplication?app(argc,argv); ? ?MyGLWidget?w; ? ?w.resize(400, 300); ? ?w.show(); ? ?return?app.exec(); } 現(xiàn)在運行程序,效果如下圖所示。 可以看到,在Qt中只需要實現(xiàn)這三個函數(shù)就可以進行OpenGL繪圖了。 二、添加顏色 上面的例子中圖形都是白色的,可以使用glColor3f()函數(shù)來設(shè)置繪制時使用的顏色,它的三個參數(shù)用來指定RGB(紅綠藍)顏色分量,取值范圍為0.0到1.0。我們可以在繪制一個頂點時指定使用的顏色,如果后面不再設(shè)置其他顏色,那么所有的頂點都將使用同樣的顏色。 下面我們將圖形的繪制代碼更改如下: void?MyGLWidget::paintGL() { ? ??glClear(GL_COLOR_BUFFER_BIT?|?GL_DEPTH_BUFFER_BIT); ? ??glLoadIdentity(); ? ??glTranslatef(-2.0,?0.0,?-6.0); ? ??glBegin(GL_TRIANGLES); ? ??glColor3f(1.0,?0.0,?0.0); ? ??glVertex3f(0.0,?1.0,?0.0); ? ??glColor3f(0.0,?1.0,?0.0); ? ??glVertex3f(-1.0,?-1.0,?0.0); ? ??glColor3f(0.0,?0.0,?1.0); ? ??glVertex3f(1.0,?-1.0,?0.0); ? ??glEnd(); ? ??glTranslatef(4.0,?0.0,?0.0); ? ??glBegin(GL_QUADS); ? ??glColor3f(1.0,?1.0,?0.0); ? ??glVertex3f(-1.0,?1.0,?0.0); ? ??glVertex3f(1.0,?1.0,?0.0); ? ??glVertex3f(1.0,?-1.0,?0.0); ? ??glVertex3f(-1.0,?-1.0,?0.0); ? ??glEnd(); } 可以看到三角形的三個角分別是紅色、綠色和藍色,而正方形是純黃色的。如下圖所示。 三、實現(xiàn)3D效果 前面的圖形都還是平面圖形,下面添加代碼來實現(xiàn)三維立體效果。將程序中繪制圖形的代碼更改為: void?MyGLWidget::paintGL() { ? ??glClear(GL_COLOR_BUFFER_BIT?|?GL_DEPTH_BUFFER_BIT); ? ??glLoadIdentity(); ? ??glTranslatef(0.0,?0.0,?-6.0); ? ??glRotatef(45,?0.0,?1.0,?0.0); ? ??glBegin(GL_QUADS); ? ??//?上面 ? ??glColor3f(1.0,?0.0,?0.0); ? ??glVertex3f(1.0,?1.0,?1.0); ? ??glVertex3f(1.0,?1.0,?-1.0); ? ??glVertex3f(-1.0,?1.0,?-1.0); ? ??glVertex3f(-1.0,?1.0,?1.0); ? ??//?下面 ? ??glColor3f(0.0,?1.0,?0.0); ? ??glVertex3f(1.0,?-1.0,?1.0); ? ??glVertex3f(1.0,?-1.0,?-1.0); ? ??glVertex3f(-1.0,?-1.0,?-1.0); ? ??glVertex3f(-1.0,?-1.0,?1.0); ? ??//?前面 ? ??glColor3f(0.0,?0.0,?1.0); ? ??glVertex3f(1.0,?1.0,?1.0); ? ??glVertex3f(-1.0,?1.0,?1.0); ? ??glVertex3f(-1.0,?-1.0,?1.0); ? ??glVertex3f(1.0,?-1.0,?1.0); ? ??glEnd(); } 這里使用了glRotatef(angle, x, y, z)函數(shù)來對坐標軸進行旋轉(zhuǎn),它的第一個參數(shù)是旋轉(zhuǎn)的角度,后面三個參數(shù)用來確定旋轉(zhuǎn)軸向量。旋轉(zhuǎn)軸經(jīng)過原點,指向(x,y,z)點。圖形的旋轉(zhuǎn)滿足右手定則,就是用右手握住旋轉(zhuǎn)軸,大拇指指向旋轉(zhuǎn)軸所指的方向,然后其他四個手指所指的方向就是要旋轉(zhuǎn)的方向。再往下面,分別繪制了三個正方形作為正方體的三個面,大家還可以再補充上其他幾個面。運行程序,效果如下圖所示。 結(jié)語 這一節(jié)只是向大家簡單演示了如何在Qt中進行openGL編程來實現(xiàn)3D繪圖,目的只是讓大家看到在Qt中進行3D繪圖是非常簡單的。如果想進一步應(yīng)實現(xiàn)更炫酷的效果,就需要擁有openGL的專業(yè)知識了。 涉及到的代碼:??myOpenGL.rar?? |
總結(jié)
以上是生活随笔為你收集整理的[Qt教程] 第48篇 进阶(八) 3D绘图简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Qt教程] 第47篇 进阶(七) 定制
- 下一篇: [Qt教程] 第49篇 进阶(九) 多媒