Qt_OpenGL:3D圖形小測
//.h
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QtOpenGL>
#include <QWidget>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QGLWidget *parent = 0);
~GLWidget();
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
void keyPressEvent(QKeyEvent *e);
bool fullscreen;
private:
float triangle_rotate;
float circle_rotate;
float quads_rotate;
float rotate_angle1;
float rotate_angle2;
};
#endif // GLWIDGET_H
//.cpp
#include "glwidget.h"
#include <QtGui>
#include <QtCore>
#include <QtOpenGL>
GLWidget::GLWidget(QGLWidget *parent) :
QGLWidget(parent)
{
// setCaption("The Opengl for Qt Framework");
fullscreen = false;
rotate_angle1 = 0.0;
rotate_angle2 = 0.0;
}
//這是對虛函數,這裏是重寫該函數
void GLWidget::initializeGL()
{
setGeometry(300, 150, 640, 480);//設置窗口初始位置和大小
glShadeModel(GL_SMOOTH);//設置陰影平滑模式
glClearColor(0.0, 0.0, 0.0, 0);//改變窗口的背景顏色,不過我這裏貌似設置後並沒有什麼效果
glClearDepth(1.0);//設置深度緩存
glEnable(GL_DEPTH_TEST);//允許深度測試
glDepthFunc(GL_LEQUAL);//設置深度測試類型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//進行透視校正
}
void GLWidget::paintGL()
{
//glClear()函數在這裏就是對initializeGL()函數中設置的顏色和緩存深度等起作用
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/*下面開始畫四棱錐*/
glLoadIdentity();//重置當前的模型觀察矩陣
glTranslatef(-0.5, 0.0, -0.5);//將繪製平面移動到屏幕的左半平面和裏面
glRotatef(rotate_angle1, 0.2, 0.2, 0.0);
glBegin(GL_TRIANGLES);
/*前正面的繪製*/
glColor3f(1.0, 0.0, 0.0);//上頂點紅色
glVertex3f(0.0, 0.3, 0.0);
glColor3f(0.0, 0.0, 1.0);//左下點藍色
glVertex3f(-0.3, -0.3, 0.3);
glColor3f(0.0, 1.0, 0.0);//右下角綠色
glVertex3f(0.3, -0.3, 0.3);
/*右側面的繪製*/
glColor3f(1.0, 0.0, 0.0);//上頂點紅色
glVertex3f(0.0, 0.3, 0.0);
glColor3f(0.0, 0.0, 1.0);//左下點藍色
glVertex3f(0.3, -0.3, 0.3);
glColor3f(0.0, 1.0, 0.0);//右下角綠色
glVertex3f(0.3, -0.3, -0.3);
/*後側面的繪製*/
glColor3f(1.0, 0.0, 0.0);//上頂點紅色
glVertex3f(0.0, 0.3, 0.0);
glColor3f(0.0, 0.0, 1.0);//左下點藍色
glVertex3f(0.3, -0.3, -0.3);
glColor3f(0.0, 1.0, 0.0);//右下角綠色
glVertex3f(-0.3, -0.3, -0.3);
/*左側面的繪製*/
glColor3f(1.0, 0.0, 0.0);//上頂點紅色
glVertex3f(0.0, 0.3, 0.0);
glColor3f(0.0, 0.0, 1.0);//左下點藍色
glVertex3f(-0.3, -0.3, -0.3);
glColor3f(0.0, 1.0, 0.0);//右下角綠色
glVertex3f(-0.3, -0.3, 0.3);
rotate_angle1 += 3.0;
glEnd();
/*底面四邊形的繪製,使四棱錐封閉起來*/
glBegin(GL_QUADS);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-0.3, -0.3, 0.3);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.3, -0.3, 0.3);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.3, -0.3, -0.3);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-0.3, -0.3, -0.3);
glEnd();
/*下面開始畫立方體*/
glLoadIdentity();
glTranslated(0.5, 0, 0.5);//將繪製平面移動到屏幕的右半平面和外面
glRotatef(rotate_angle2, -0.2, 0.2, -0.3);
glBegin(GL_QUADS);
//上頂面
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-0.3, 0.3, -0.3);
glVertex3f(-0.3, 0.3, 0.3);
glVertex3f(0.3, 0.3, 0.3);
glVertex3f(0.3, 0.3, -0.3);
//下頂面
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-0.3, -0.3, -0.3);
glVertex3f(-0.3, -0.3, 0.3);
glVertex3f(0.3, -0.3, 0.3);
glVertex3f(0.3, -0.3, -0.3);
//正前面
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-0.3, 0.3, 0.3);
glVertex3f(-0.3, -0.3, 0.3);
glVertex3f(0.3, -0.3, 0.3);
glVertex3f(0.3, 0.3, 0.3);
//右側面
glColor3f(1.0, 1.0, 0.0);
glVertex3f(0.3, 0.3, 0.3);
glVertex3f(0.3, -0.3, 0.3);
glVertex3f(0.3, -0.3, -0.3);
glVertex3f(0.3, 0.3, -0.3);
//背後面
glColor3f(0.0, 1.0, 1.0);
glVertex3f(-0.3, 0.3, -0.3);
glVertex3f(0.3, 0.3, -0.3);
glVertex3f(0.3, -0.3, -0.3);
glVertex3f(-0.3, -0.3, -0.3);
//左側面
glColor3f(1.0, 0.0, 1.0);
glVertex3f(-0.3, 0.3, -0.3);
glVertex3f(-0.3, -0.3, -0.3);
glVertex3f(-0.3, -0.3, 0.3);
glVertex3f(-0.3, 0.3, 0.3);
rotate_angle2 -= 3;
glEnd();
}
//該程序是設置opengl場景透視圖,程序中至少被執行一次(程序啓動時).
void GLWidget::resizeGL(int width, int height)
{
if(0 == height)
height = 1;//防止一條邊爲0
glViewport(0, 0, (GLint)width, (GLint)height);//重置當前視口,本身不是重置窗口的,只不過是這裏被Qt給封裝好了
glMatrixMode(GL_PROJECTION);//選擇投影矩陣
glLoadIdentity();//重置選擇好的投影矩陣
// gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透視投影矩陣
glMatrixMode(GL_MODELVIEW);//以下2句和上面出現的解釋一樣
glLoadIdentity();
}
void GLWidget::keyPressEvent(QKeyEvent *e)
{
switch(e->key())
{
//F1鍵爲全屏和普通屏顯示切換鍵
case Qt::Key_F1:
fullscreen = !fullscreen;
if(fullscreen)
showFullScreen();
else
{
setGeometry(300, 150, 640, 480);
showNormal();
}
updateGL();
break;
//Ese爲退出程序鍵
case Qt::Key_Escape:
close();
}
}
GLWidget::~GLWidget()
{
}
//.main
#include "glwidget.h"
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsItem>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GLWidget w;
w.show();
return a.exec();
}
//運行結果: