您的位置:首页 > 编程语言 > Qt开发

Qt OpenGL----着色、3D和旋转

2015-05-04 15:45 435 查看
在本文中主要是通过绘制一个三角锥和立方体来介绍openGL中的着色、3D和旋转的应用。废话不多说,直接上代码:

类定义:


#ifndef MYGL_H_
#define MYGL_H_
#include <QtGui>
#include <QtOpenGL>
class MyGLWidget : public QGLWidget
{
Q_OBJECT

public:
MyGLWidget(QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0);
~MyGLWidget();

protected:
GLfloat rTri;//控制三角锥的旋转轴
GLfloat rQuad;//控制立方体的旋转轴
GLuint list;//存储显示列表
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
void makeList();//生成显示列表
void timerEvent(QTimerEvent *event);
void mouseDoubleClickEvent( QMouseEvent * event );
};
#endif /*MYGL_H_*/



实现类:

#include <QtGui>
#include <QtOpenGL>

#include "mygl.h"
#include<gl/glu.h>

MyGLWidget::MyGLWidget(QWidget * parent, const QGLWidget * shareWidget, Qt::WindowFlags f)
{
rTri = 0.0;
rQuad = 0.0;
setMinimumSize(320,240);
resize(640,480);
setWindowTitle(tr("OpenGL 3D"));
}

MyGLWidget::~MyGLWidget()
{
glDeleteLists(list, 2);
}

void MyGLWidget::initializeGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0, 0.0, 0.0, 0.5);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
makeList();
startTimer(500);
}

void MyGLWidget::paintGL()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity();
glTranslatef( -1.5,  0.0, -6.0 );
glRotatef( rTri,  0.0,  1.0,  0.0 );
glCallList(list);

glLoadIdentity();
glTranslatef(  1.5,  0.0, -7.0 );
glRotatef( rQuad,  1.0,  1.0,  1.0 );
glCallList(list + 1);
}

void MyGLWidget::makeList()
{
list = glGenLists(2);
glNewList(list, GL_COMPILE);
glBegin( GL_TRIANGLES );
glColor3f( 1.0, 0.0, 0.0 );
glVertex3f(  0.0,  1.0,  0.0 );
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( -1.0, -1.0,  1.0 );
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f(  1.0, -1.0,  1.0 );

glColor3f( 1.0, 0.0, 0.0 );
glVertex3f(  0.0,  1.0,  0.0 );
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f(  1.0, -1.0,  1.0 );
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f(  1.0, -1.0, -1.0 );

glColor3f( 1.0, 0.0, 0.0 );
glVertex3f(  0.0,  1.0,  0.0 );
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f(  1.0, -1.0, -1.0 );
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( -1.0, -1.0, -1.0 );

glColor3f( 1.0, 0.0, 0.0 );
glVertex3f(  0.0,  1.0,  0.0 );
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( -1.0, -1.0, -1.0 );
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( -1.0, -1.0,  1.0 );
glEnd();
glEndList();

glNewList(list + 1, GL_COMPILE);
glBegin( GL_QUADS );
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f(  1.0,  1.0, -1.0 );
glVertex3f( -1.0,  1.0, -1.0 );
glVertex3f( -1.0,  1.0,  1.0 );
glVertex3f(  1.0,  1.0,  1.0 );

glColor3f( 1.0, 0.5, 0.0 );
glVertex3f(  1.0, -1.0,  1.0 );
glVertex3f( -1.0, -1.0,  1.0 );
glVertex3f( -1.0, -1.0, -1.0 );
glVertex3f(  1.0, -1.0, -1.0 );

glColor3f( 1.0, 0.0, 0.0 );
glVertex3f(  1.0,  1.0,  1.0 );
glVertex3f( -1.0,  1.0,  1.0 );
glVertex3f( -1.0, -1.0,  1.0 );
glVertex3f(  1.0, -1.0,  1.0 );

glColor3f( 1.0, 1.0, 0.0 );
glVertex3f(  1.0, -1.0, -1.0 );
glVertex3f( -1.0, -1.0, -1.0 );
glVertex3f( -1.0,  1.0, -1.0 );
glVertex3f(  1.0,  1.0, -1.0 );

glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( -1.0,  1.0,  1.0 );
glVertex3f( -1.0,  1.0, -1.0 );
glVertex3f( -1.0, -1.0, -1.0 );
glVertex3f( -1.0, -1.0,  1.0 );

glColor3f( 1.0, 0.0, 1.0 );
glVertex3f(  1.0,  1.0, -1.0 );
glVertex3f(  1.0,  1.0,  1.0 );
glVertex3f(  1.0, -1.0,  1.0 );
glVertex3f(  1.0, -1.0, -1.0 );
glEnd();
glEndList();
}

void MyGLWidget::timerEvent(QTimerEvent *event)
{
rTri += 1;
rQuad -= 0.15;
update();
}

void MyGLWidget::resizeGL(int width, int height)
{
glViewport( 0, 0, (GLint)width, (GLint)height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}

void MyGLWidget::mouseDoubleClickEvent( QMouseEvent * event )
{
if(windowState() &  Qt::WindowFullScreen)
showNormal();
else
showFullScreen();
}


着色方法比较简单,在顶点函数之前调用 glColor3f(),它的三个参数依次是:红、绿、蓝三种颜色分量,取值范围是[0,1]。数值越大,色彩和饱和度越高。图形每个顶点用饱和度不同的颜色着色,形成渐变效果。



显示列表表示一组存储在一起的OpenGL函数。当调用一个显示列表时,它所存储的函数就会按顺序执行。大多数OpenGL函数可以存储在列表中,通过显示列表可以改进性能。(glNewList()的第二个参数GL_COMPILE说明仅编译显示列表而不立即执行)

其中glRotatef()函数的原型为:

<pre name="code" class="cpp">void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)



它的作用是绕从原点到点(x,y,z)的向量顺时针旋转angle弧度。

最后一步实现main.cpp:


#include <QtGui>
#include "mygl.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyGLWidget myglWidget;
myglWidget.show();
return app.exec();
}





源码下载地址:http://download.csdn.net/detail/mojianc/8660111
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: