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

来源:互联网 发布:苹果6s淘宝打字输入法 编辑:程序博客网 时间:2024/05/16 04:38

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

类定义:

#ifndef MYGL_H_#define MYGL_H_#include <QtGui>#include <QtOpenGL>class MyGLWidget : public QGLWidget{Q_OBJECTpublic: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();elseshowFullScreen();}

着色方法比较简单,在顶点函数之前调用 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

0 0
原创粉丝点击