天天看點

OPenGL筆記--多邊形旋轉

作者:QT教程

一、前置知識

OPenGL中使用​glRotatef(Angle, Xvector, Yvector, Zvector)​​來讓對象繞某個軸旋轉

Angle:通常是個變量,導表對象轉過的角度;

Xvector, Yvector, Zvector:共同決定對象旋轉的方向;

(1,0,0)表示繞着X軸旋轉、 (0,1,0)表示繞着Y軸旋轉、 (0,0,1)表示繞着Z軸旋轉;

二、運作效果

OPenGL筆記--多邊形旋轉

QT學習基地:C/C++項目實戰/Qt5/C語言/c++/資料庫/OpenCV/MFC/QT項目-學習視訊教程-騰訊課堂

三、關鍵代碼

void GL_Test::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除螢幕和深度緩存
//-----------------------------------------
glLoadIdentity(); //重置目前的模型觀察矩陣
glTranslatef(-1.5, 0.0, -6.0);
glRotatef(rTri, 0.0, 1.0, 0.0); //繞Y軸旋轉rTri度
//開始繪制三角形
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();
//繪制三角形結束
//-----------------------------------------
glLoadIdentity(); //重置目前的模型觀察矩陣
glTranslatef(-1.5, 0.0, -6.0);
glRotatef(rQuad, 1.0, 0.0, 0.0); //繞X軸旋轉rQuad度
//開始繪制正方形
glTranslatef(3.0, 0.0, 0.0);
glBegin(GL_QUADS);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-1.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); //右下頂點
glColor3f(1.0, 1.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0); //左下頂點
glEnd();
//繪制正方形結束
//-----------------------------------------
rTri += 5;
rQuad += 5;
}           

四、完整代碼

#ifndef GL_TEST_H
#define GL_TEST_H
#include <qgl.h> //因為QGLWidget類被包含在qgl.h頭檔案中
#include <glut.h> //使用glut庫中的API
#include <QKeyEvent>
#include <QTimer>
//繼承QGLWidget得到OPenGL視窗部件類
class GL_Test : public QGLWidget
{
public:
GL_Test(QWidget* parent = 0, bool fs = false);
~GL_Test();
protected:
/*************************************************************************************************
QGLWidget 類已經内置了對 OpenGL 的處理,就是通過對 initializeGL()、 paintGL()和 resizeGL()這個三個函數實作
*************************************************************************************************/
void initializeGL() override; //用來初始化OPenGL視窗,可以在裡面設定一些有關選項
void paintGL() override; //用來繪制OPenGL的視窗,隻要有更新發生,這個函數就會被調用
void resizeGL(int w, int h) override; //用來處理視窗大小變換這一事件,resizeGL()在處理完後會自動重新整理螢幕
void keyPressEvent(QKeyEvent* e) override; //Qt鍵盤事件處理函數
protected:
bool fullscreen; //用來儲存視窗是否處于全屏狀态的變量
GLfloat rTri; //用來旋轉三角形
GLfloat rQuad; //用來旋轉正方形
};
#endif // GL_TEST_H           
#include "gl_test.h"
GL_Test::GL_Test(QWidget* parent, bool fs)
: QGLWidget(parent)
{
fullscreen = fs;
rTri = 0.0;
rQuad = 0.0;
setGeometry(500,500,640,480); //設定視窗大小、位置
setWindowTitle("The first OpenGL Window"); //設定視窗标題
if(fullscreen) {
showFullScreen();
}
QTimer* timer = new QTimer(this);
connect(timer,&QTimer::timeout,[=]{
updateGL();
});
timer->start(50);
}
GL_Test::~GL_Test()
{
}
void GL_Test::initializeGL()
{
glShadeModel(GL_SMOOTH); //啟用smooth shading(陰影平滑)
glClearColor(0.0, 0.0, 0.0, 0.0); //清除螢幕時所用的顔色,rgba【0.0(最黑)~1.0(最亮)】
glClearDepth(1.0); //設定深度緩存
glEnable(GL_DEPTH_TEST); //啟動深度測試
glDepthFunc(GL_LEQUAL); //所作深度測試的類型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //真正精細的透視修正,告訴OPenGL我們希望進行最好的透視修正,這會十分輕微的影響性能,但使得透視圖看起來好一點
}
void GL_Test::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除螢幕和深度緩存
//-----------------------------------------
glLoadIdentity(); //重置目前的模型觀察矩陣
glTranslatef(-1.5, 0.0, -6.0);
glRotatef(rTri, 0.0, 1.0, 0.0); //繞Y軸旋轉rTri度
//開始繪制三角形
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();
//繪制三角形結束
//-----------------------------------------
glLoadIdentity(); //重置目前的模型觀察矩陣
glTranslatef(-1.5, 0.0, -6.0);
glRotatef(rQuad, 1.0, 0.0, 0.0); //繞X軸旋轉rQuad度
//開始繪制正方形
glTranslatef(3.0, 0.0, 0.0);
glBegin(GL_QUADS);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-1.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); //右下頂點
glColor3f(1.0, 1.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0); //左下頂點
glEnd();
//繪制正方形結束
//-----------------------------------------
rTri += 5;
rQuad += 5;
}
void GL_Test::resizeGL(int w, int h)
{
if(h == 0) { //防止h為0
h = 1;
}
glViewport(0, 0, (GLint)w, (GLint)h); //重置目前的視口(Viewport)
glMatrixMode(GL_PROJECTION); //選擇投影矩陣
glLoadIdentity(); //重置投影矩陣
gluPerspective( 45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0 ); //建立透視投影矩陣
glMatrixMode(GL_MODELVIEW); //選擇模型觀察矩陣
glLoadIdentity(); //重置模型觀察矩陣
}
void GL_Test::keyPressEvent(QKeyEvent* e)
{
switch (e->key()) {
case Qt::Key_Q: {
fullscreen = !fullscreen;
if(fullscreen) {
showFullScreen();
}else {
showNormal();
setGeometry(500,500,640,480);
}
updateGL();
break;
}//case Qt::Key_Q
case Qt::Key_Escape: {
close();
}//Qt::Key_Escape
}//switch (e->key())
}           

【領QT開發教程學習資料,點選下方連結莬費領取↓↓,先碼住不迷路~】

點選這裡:Qt資料領取(視訊教程+文檔+代碼+項目實戰)