1. 程式人生 > >Qt5使用openGL,進行3d繪圖

Qt5使用openGL,進行3d繪圖

https://blog.csdn.net/qq_35703848/article/details/79819854 

 1、

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3 
 4 #include <QWidget>
 5 #include <QOpenGLWindow>
 6 #include <QOpenGLFunctions>
 7 
 8 class Widget : public QOpenGLWindow,protected QOpenGLFunctions
 9 {
10     Q_OBJECT
11 
12
public: 13 // Widget(QWidget *parent = 0); 14 //使用時,直接Widget w;即可。 15 ~Widget(){}; 16 17 void initializeGL() 18 { 19 initializeOpenGLFunctions(); 20 glClearColor(0.0f,0.0f,0.0f,0.0f); 21 } 22 void resizeGL(int width, int height){} //若無需對高、寬進行處理,此函式可省 23 void paintGL()
24 { 25 glClear(GL_COLOR_BUFFER_BIT); 26 } 27 }; 28 29 #endif // WIDGET_H

 

2、使用QGLWidget

 1 #ifndef OPENGLWIDGET_H
 2 #define OPENGLWIDGET_H
 3 #include <QtOpenGL>
 4 
 5 class OpenglWidget : public QGLWidget
 6 {
 7 public:
 8     OpenglWidget(QWidget *parent=0);
 9
protected: 10 void initializeGL(); 11 void initWidget(); 12 void paintGL(); 13 void resizeGL(int width, int height); 14 private: 15 GLfloat angle; 16 GLfloat angle1; 17 }; 18 #endif // OPENGLWIDGET_H

 

  1 #include "widget.h"
  2 
  3 OpenglWidget::OpenglWidget(QWidget *parent):QGLWidget(parent)
  4 {
  5     initWidget();
  6     initializeGL();
  7 }
  8 void OpenglWidget::initializeGL()
  9 {
 10     //設定著色模式,平滑的
 11     glShadeModel(GL_SMOOTH);
 12     //清除掉之前的所有顏色
 13     glClearColor(0.0,0.0,0.0,0.0);
 14     //深度快取,設定初始值為1.0,小於1.0的部分是可見的
 15     glClearDepth(1.0);
 16     //啟動OPenGL的相關功能,由引數決定,這裡指
 17     //(啟用了之後,OpenGL在繪製的時候就會檢查,當前畫素前面是否有別的畫素,如果別的畫素擋道了它,那它就不會繪製,也就是說,OpenGL就只繪製最前面的一層)
 18     glEnable(GL_DEPTH_TEST);
 19     //制定深度快取比較值
 20     //這裡引數指的是如果輸入的深度值小於或者等於參考值則通過
 21     glDepthFunc(GL_LEQUAL);
 22 
 23     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
 24 
 25 }
 26 
 27 void OpenglWidget::initWidget()
 28 {
 29     //從螢幕上(400,400)為起始點,顯示一個640*400的介面
 30     setGeometry(400,200,640,480);
 31     setWindowTitle("My OPenGL");
 32 }
 33 
 34 void OpenglWidget::paintGL()
 35 {
 36     //清除顏色緩衝和深度緩衝
 37     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 38     //將當前點移置螢幕中心,相當於復位的操作
 39     glLoadIdentity();
 40     //平移函式,引數指的是分別從X軸,Y軸,Z軸平移
 41     glTranslatef(-1.5,0.0,-6.0);
 42 
 43 
 44     glRotated(angle,0.0,1.0,0.0);
 45     //建立圖元,是繪製什麼圖形的介面,引數是繪製多邊形的意思
 46     glBegin(GL_QUADS);
 47     //設定頂點值(f代表浮點),三維空間座標
 48     glColor3f( 1.0, 0.0, 0.0 );
 49     glBegin( GL_QUADS );
 50 
 51        glColor3f(1, 0, 0);
 52        glVertex3f(-1,1,1);
 53        glVertex3f(-1,1,-1);
 54        glVertex3f(-1,-1,-1);
 55        glVertex3f(-1,-1,1);
 56 
 57        glColor3f(0, 0, 1);
 58        glVertex3f(-1,1,-1);
 59        glVertex3f(-1,-1,-1);
 60        glVertex3f(1,-1,-1);
 61        glVertex3f(1,1,-1);
 62 
 63        glColor3f(0, 1, 0);
 64        glVertex3f(1,1,-1);
 65        glVertex3f(1,-1,-1);
 66        glVertex3f(1,-1,1);
 67        glVertex3f(1,1,1);
 68 
 69        glColor3f(0, 0, 1);
 70        glVertex3f(1,-1,1);
 71        glVertex3f(1,1,1);
 72        glVertex3f(-1,1,1);
 73        glVertex3f(-1,-1,1);
 74 
 75        glColor3f(0, 1, 0);
 76        glVertex3f(-1,1,1);
 77        glVertex3f(1,1,1);
 78        glVertex3f(1,1,-1);
 79        glVertex3f(-1,1,-1);
 80 
 81        glColor3f(0, 0, 1);
 82        glVertex3f(-1,-1,1);
 83        glVertex3f(-1,-1,-1);
 84        glVertex3f(1,-1,-1);
 85        glVertex3f(1,-1,1);
 86        glEnd();
 87 
 88        glLoadIdentity();
 89 
 90       glTranslatef(1.5,0.0,-6.0);
 91       glRotatef( angle1,0.0,1.0,0.0);
 92 
 93       glBegin( GL_TRIANGLES );
 94 
 95       glColor3f( 1.0, 0.0, 0.0 );
 96       glVertex3f(  0.0,  1.0,  0.0 );
 97       glColor3f( 0.0, 0.0, 1.0 );
 98       glVertex3f( -1.0, -1.0, -1.0 );
 99       glColor3f( 0.0, 1.0, 0.0 );
100       glVertex3f( -1.0, -1.0,  1.0 );
101 
102       glColor3f( 1.0, 0.0, 0.0 );
103       glVertex3f(  0.0,  1.0,  0.0 );
104       glColor3f( 0.0, 0.0, 1.0 );
105       glVertex3f(  1.0, -1.0,  1.0 );
106       glColor3f( 0.0, 1.0, 0.0 );
107       glVertex3f(  1.0, -1.0, -1.0 );
108 
109       glColor3f( 1.0, 0.0, 0.0 );
110       glVertex3f(  0.0,  1.0,  0.0 );
111       glColor3f( 0.0, 1.0, 0.0 );
112       glVertex3f( -1.0, -1.0,  1.0 );
113       glColor3f( 0.0, 0.0, 1.0 );
114       glVertex3f(  1.0, -1.0,  1.0 );
115 
116 
117       glColor3f( 1.0, 0.0, 0.0 );
118       glVertex3f(  0.0,  1.0,  0.0 );
119       glColor3f( 0.0, 1.0, 0.0 );
120       glVertex3f(  1.0, -1.0, -1.0 );
121       glColor3f( 0.0, 0.0, 1.0 );
122       glVertex3f( -1.0, -1.0, -1.0 );
123 
124       glEnd();
125 
126     angle+=70;
127     angle1+=10;
128 
129 }
130 
131 void OpenglWidget::resizeGL(int width, int height)
132 {
133     if(0==height)
134         height=1;
135     //告訴繪製到窗體的哪個位置
136     glViewport(0,0,width,height);
137     // 設定矩陣模式,引數是設定為投影矩陣
138     glMatrixMode(GL_PROJECTION);
139     //復位操作
140     glLoadIdentity();
141 
142     GLdouble aspectRatio=(GLfloat)width/(GLfloat)height;
143     GLdouble rFov=45.0*3.14159265/180.0;
144     GLdouble zNear=0.1;
145     GLdouble zFar=100.0;
146     //呼叫glFrustum,生成矩陣與當前矩陣相乘,生成透視效果
147     glFrustum(-zNear*tan(rFov/2.0)*aspectRatio,
148               zNear*tan(rFov/2.0)*aspectRatio,
149               -zNear*tan(rFov/2.0),
150               zNear*tan(rFov/2.0),
151               zNear,zFar);
152     //切回模型檢視矩陣
153     glMatrixMode(GL_MODELVIEW);
154     //復位
155     glLoadIdentity();
156 }