QT5+OpenGL<一>
来源:互联网 发布:netty java实例 编辑:程序博客网 时间:2024/05/17 04:25
版本:Qt Creator 5.4.0_mingw
概要
最近在学习QT的opengl, 在网上找了相关的学习资料,发现很少,通过查阅相关资料和对网上一些零碎的资料进行了总结,并用QT5 写出了一些简单的DEMO, 最近这段时间将进行持续地更新。
QT5需要添加的模块
opengl是一个模单独的模块,所以在使用时,应该在pro里面添加对应的模块。
QT += opengl
QT += opengl
运行效果图
代码:
头文件openglwidget.h
#include <QWidget>#include <QtOpenGL>class openglwidget : public QGLWidget{ Q_OBJECTpublic: openglwidget(QWidget *parent = 0); ~openglwidget();protected: void initializeGL(); void initWidget(); void paintGL(); void resizeGL(int width, int height);};#endif // OPENGLWIDGET_H
源文件openglwidget.cpp
#include "openglwidget.h"openglwidget::openglwidget(QWidget *parent) : QGLWidget(parent){ initWidget(); initializeGL();}openglwidget::~openglwidget(){}void openglwidget::initializeGL(){ 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 openglwidget::initWidget(){ setGeometry( 400, 200, 640, 480 ); setWindowTitle(tr("opengl demo"));}void openglwidget::paintGL(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef( -1.5, 0.0, -6.0 ); glBegin( GL_QUADS ); glVertex3f( -1.0, 1.0, 0.0 ); glVertex3f( 1.0, 1.0, 0.0 ); glVertex3f( 1.0, -1.0, 0.0 ); glVertex3f( -1.0, -1.0, 0.0 ); glEnd(); glTranslatef( 3.0, 0.0, 0.0 ); glBegin( GL_TRIANGLES ); qDebug() << "this is a paintGL test!"; glVertex3f( 0.0, 1.0, 0.0 ); glVertex3f( -1.0, -1.0, 0.0 ); glVertex3f( 1.0, -1.0, 0.0 ); glEnd();}void openglwidget::resizeGL(int width, int height){ if(0 == height) { height = 1; } glViewport(0, 0, (GLint)width, (GLint)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0); GLdouble aspectRatio = (GLfloat)width/(GLfloat)height; GLdouble zNear = 0.1; GLdouble zFar = 100.0; GLdouble rFov = 45.0 * 3.14159265 / 180.0; glFrustum( -zNear * tan( rFov / 2.0 ) * aspectRatio, zNear * tan( rFov / 2.0 ) * aspectRatio, -zNear * tan( rFov / 2.0 ), zNear * tan( rFov / 2.0 ), zNear, zFar ); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}
主函数main.cpp
#include "openglwidget.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); openglwidget w; w.show(); return a.exec();}
部分函数接口的解释
1.glLoadIdentity();
当您调用glLoadIdentity()之后,您实际上将当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。
2.glBegin(…)
这里是绘制什么图形的接口,比如说绘制三角形可以用glBegin(GL_TRIANGLES), 而多边形使用
glBegin(GL_QUADS) 其它的点线等可以参考下面的。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
这里需要说明的是在绘制的时候,需要以glBegin(…) 以 glEnd() 结束。
3.glVertex3f( x, y, z );
x,y, z 表示在一个三维空间里面的坐标。
4.glViewport( 0, 0, (GLint)width, (GLint)height );
重置当前的视口(Viewport)
5.glMatrixMode( …);
选择矩阵模式, 主要用得多的是投影矩阵 和 模型观察矩阵
- 1
- 2
- 3
- 1
- 2
- 3
6.glLoadIdentity();
重置矩阵,这里主要功能是把坐标移动到原点,好进行后续的操作。
7.gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);
设置投影矩阵
8.glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble zNear,GLdouble zFar);
设置投影矩阵, 需要讲一下的是, gluPerspective 和 glFrustum功能 是一样的, 准确的说, gluPerspective 是glFrustum的封装, 它们的关系我将在另一篇博客中进行讲解。而gluPerspective在一些平台或版本上找不到,这时就应该用glFrustum进行转换。
主要使用方法
void paintGL();
void resizeGL(int width, int height);
这两个函数是父类的虚函数, 我们主要是通过重写这两个函数,来进行对应图片的绘制, 在绘制的过程中调用对应的接口,然后通过相应的坐标计算来实现最后的图片绘制。
阅读全文
0 0
- QT5 OPenGL(一)
- QT5+OpenGL<一>
- QT5 OPENGL问题
- Qt5.1 + vs2012 OpenGL
- 基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)
- QT5 OPenGL(三, 图形旋转)
- QT5 OpenGL(七, 透明度设置)
- QT5.5.1+VS2013+OpenGL+OpenCV
- Qt5.3.2(OpenGL)交叉编译
- QT5.7中的opengl使用方法
- 安装Qt5 (一)
- Qt5 text_Editor(一)
- Qt5中关于OpenGL部分的学习
- Qt5下OpenGL程序的新写法
- Stellarium:Compile with MSVC2012 and Qt5 (OpenGL)
- Qt5下OpenGL程序的新写法
- QT5 OPenGL(二,平面图形上色)
- QT5 OpenGL (四, 绘制立体图形)
- easyui textbox 回显 换行
- Android studio插件GsonFormat 的使用
- 图论基本概念
- (转)Fiddler 抓包工具总结
- 尝试获取锁的方法
- QT5+OpenGL<一>
- leetCode---Invert Binary Tree
- 10个小孩分糖果
- go 为 stucts 排个序
- 算法思想 -- 贪心算法(2) -- 需解决的2个主要问题
- Error type 3
- caffe 学习笔记之caffe.proto注释
- 基于joda time 间隔天数计算
- 通过fcntl设置 非阻塞IO(Linux C)