OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库,gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包含了最基本的3D函数,而glu似乎对gl的辅助,如果算数好,不用glu的情况下,也是可以做出同样的效果。glut是基本的窗口界面,是独立于gl和glu的,如果不喜欢用glut可以用MFC和Win32窗口等代替,但是glut是跨平台的,这就保证了我们编出的程序是跨平台的,如果用MFC或者Win32只能在windows操作系统上使用。选择OpenGL的一个很大原因就是因为它的跨平台性,所以我们可以尽量的使用glut库。
实验环境:
ubuntu16.04 opengl freeglut qt5.8
在 .pro文件中添加:
在使用opengl前需要做一些配置。
QT += core gui opengl
LIBS += -lGLU
LIBS += -lglut
头文件中需要添加的:
#include
#include
#include
在main.cpp中需要添加:
#include
#include
#include
#include
#include
glutInit(&argc, argv);
程序中继承了QGLWidget类,对部分函数进行了重写。实现如下代码后,需要在.ui中将openclwiget控件提升为glwidgetcpp。然后在mainwindow.cpp中就可以调用新添加的功能啦。
glwidgetcpp.h
#ifndef GLWIDGETCPP_H
#define GLWIDGETCPP_H
#include
#include
#include
#include
class glwidgetcpp : public QGLWidget
{
Q_OBJECT
public:
explicit glwidgetcpp(QWidget * parent = 0);
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
int R;
double x,y,z;
bool wired;
float ang;
private:
QTimer timer;
};
#endif // GLWIDGETCPP_H
glwidgetcpp.cpp
#include "glwidgetcpp.h"
#include
#include
glwidgetcpp::glwidgetcpp(QWidget * parent):QGLWidget (parent)
{
this->R = 1;
this->wired = false;
this->ang = 0.5;
x = 0;
y = 0;
z = 0;
connect(&timer,SIGNAL(timeout()), this, SLOT(updateGL()));
timer.start(16);
}
void glwidgetcpp::initializeGL(){
glClearColor(0.2,0.2,0.2,1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
}
void glwidgetcpp::paintGL(){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0,5, 0,0,0 ,0,1,0);
glTranslatef(x,y,z);
ang+=0.5;
glRotatef(ang,1,1,1);
glColor3f(1,0,0);
if(wired)
glutWireSphere(R,30,30);
else
glutSolidSphere(R,30,30);
}
void glwidgetcpp::resizeGL(int w, int h){
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(float)w/h,0.01,100.0);
updateGL();
}
参考:
使用Qt+OpenGL创建球体+简单交互
Ubuntu下QtOpenGL无法正常使用GLU库的解决方法