1. 程式人生 > >OpenGL_Qt學習筆記之_02(繪製簡單平面幾何圖形)

OpenGL_Qt學習筆記之_02(繪製簡單平面幾何圖形)

複製程式碼
#include "glwidget.h"
#include "ui_glwidget.h"

#include <QtGui>
#include <QtCore>
#include <QtOpenGL>

#ifndef GL_MULTISAMPLE
#define GL_MULTISAMPLE  0x809D
#endif

#define GL_PI 3.1415926
#define GL_RADIUX  0.2f

GLWidget::GLWidget(QGLWidget *parent) :
    QGLWidget(parent),
    ui(
new Ui::GLWidget) { // setWindowTitle("The Opengl for Qt Framework"); ui->setupUi(this); fullscreen = false; } //這是對虛擬函式,這裡是重寫該函式 void GLWidget::initializeGL() { setGeometry(300, 150, 640, 480);//設定視窗初始位置和大小 glShadeModel(GL_SMOOTH);//設定陰影平滑模式 glClearColor(0.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(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glClear()函式在這裡就是對initializeGL()函式
//中設定的顏色和快取深度等起作用 glLoadIdentity();//重置當前的模型觀察矩陣,該句執行完後,將焦點移動到了螢幕的中心 /*下面幾句程式碼是用來畫三角形的,以glBegin()開始,glEnd()結束;glVertex3f為給定一個3維的頂點,座標值為浮點型*/ // glTranslatef(-1.5f, 0.0f, -6.0f);//首先移動當前焦點位置 glTranslatef(-0.3, 0.3, -0.6); glColor3f(1.0f, 0.0f, 0.0f); // glDisable(GL_TEXTURE_2D); glBegin(GL_TRIANGLES);//GL_TRIANGLES代表為畫三角形 glVertex3f(0.0f, 0.2f, 0.0f);//上頂點座標 glVertex3f(-0.2f, -0.2f, 0.0f);//左下角座標 glVertex3f(0.2f, -0.2f, 0.0f);//右下角座標 glEnd();//結束畫完 glLoadIdentity();//重新焦點定位,同樣是螢幕的中心 glTranslatef(0.3f,0.3f,0.0f); // 向x軸正方向移動0.3個單位 glColor3f(0.0f,1.0f,0.0f);//顏色設定放在這個地方,對下面的頂點設定都是有效的 /*下面開始繪製四邊形*/ glBegin(GL_QUADS); glVertex3f(-0.2f, 0.2f, 0.0f); // 左上頂點 glVertex3f( 0.2f, 0.2f, 0.0f); // 右上頂點 glVertex3f( 0.2f, -0.2f, 0.0f); // 右下頂點 glVertex3f(-0.2f, -0.2f, 0.0f); // 左下頂點 glEnd(); // 四邊形繪製結束 glLoadIdentity(); glTranslatef(0.0f, -0.3f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); /*用連續的點來逼近圓這裡是畫的一個圓周*/ // GLfloat x, y, angle; // glBegin(GL_POINTS); // for(angle = 0; angle <2*GL_PI; angle +=0.001) // { // x = GL_RADIUX*sin(angle); // y = GL_RADIUX*cos(angle); // glVertex3d(x, y, 0.0); // } // glEnd(); // glPopMatrix(); /*這裡用連續的三角形面積來逼近圓的面積實現圓周的畫法*/ GLint circle_points = 100, i = 0; glBegin(GL_TRIANGLE_FAN); for(int i = 0; i < circle_points; i++ ) { double angle = 2*GL_PI*i/circle_points; glVertex3d(0.2*cos(angle), 0.2*sin(angle), 0); } 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); 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() { delete ui; }
複製程式碼