Qt_OpenGL:3D图形小测
2014-12-08 14:33
337 查看
Qt_OpenGL:3D图形小测
//.h
//.cpp
//.main
//运行结果:
//.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(); }
//运行结果:
相关文章推荐
- Qt OpenGL:学习现代3D图形编程之四,透视投影浅析
- Qt OpenGL:学习现代3D图形编程之二,玩转色彩
- Qt OpenGL:学习现代3D图形编程之四,透视投影
- Qt OpenGL:学习现代3D图形编程之一,画一个三角形
- QT与OpenGL之3D图形绘制
- OpenGL_Qt学习笔记之_04(3D图形的绘制和旋转)
- OpenGL_Qt学习笔记之_04(3D图形的绘制和旋转)
- Qt OpenGL:学习现代3D图形编程之三,移动三角形
- 【OpenGL超级宝典第五版】【第一章】3D图形和OpenGL简介 读书笔记
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- 如何设置opengl结合vc开发绚丽的3D图形---操作详解
- NeHe OpenGL教程 第五课 3D图形
- OpenGL3D图形、旋转、纹理、键盘移动、光照、滤波、透明(完整)
- Android OpenGL与3D应用开发之3D图形绘制
- Qt OpenGL----着色、3D和旋转
- OpenGL3D图形绘制
- QT5 OpenGL (四, 绘制立体图形)
- 【Qt OpenGL教程】09:在3D空间中移动位图
- Qt下的OpenGL 编程(4)进军3D世界
- OpenGL 3D图形常用绘制函数