qt+opengl显示3D物体

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

运行效果:
qt+opengl显示3D物体_第1张图片
工程的结构如下所示:
qt+opengl显示3D物体_第2张图片

在 .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库的解决方法

你可能感兴趣的:(机器人技术)