Qt OpenGL----着色、3D和旋转
2015-05-04 15:45
435 查看
在本文中主要是通过绘制一个三角锥和立方体来介绍openGL中的着色、3D和旋转的应用。废话不多说,直接上代码:
类定义:
实现类:
着色方法比较简单,在顶点函数之前调用 glColor3f(),它的三个参数依次是:红、绿、蓝三种颜色分量,取值范围是[0,1]。数值越大,色彩和饱和度越高。图形每个顶点用饱和度不同的颜色着色,形成渐变效果。
显示列表表示一组存储在一起的OpenGL函数。当调用一个显示列表时,它所存储的函数就会按顺序执行。大多数OpenGL函数可以存储在列表中,通过显示列表可以改进性能。(glNewList()的第二个参数GL_COMPILE说明仅编译显示列表而不立即执行)
其中glRotatef()函数的原型为:
它的作用是绕从原点到点(x,y,z)的向量顺时针旋转angle弧度。
最后一步实现main.cpp:
源码下载地址:http://download.csdn.net/detail/mojianc/8660111
类定义:
#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
相关文章推荐
- OpenGL_Qt学习笔记之_04(3D图形的绘制和旋转)
- Qt_OpenGL:3D旋转自定义换色
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- Qt_OpenGL:3D旋转自定义换色
- OpenGL_Qt学习笔记之_04(3D图形的绘制和旋转)
- OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
- OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
- OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
- OpenGL实现3D模型自由旋转——之代码解析
- Androidb不使用OpenGL实现3D旋转效果
- QT与OpenGL之3D图形绘制
- Qt_OpenGL:3D图形小测
- 【Qt OpenGL】Qt Creator中的3D绘图及动画教程
- 现代OpenGL+Qt学习笔记之六:绘制可旋转、带光照效果的三维物体
- Qt下的OpenGL 编程(4)进军3D世界
- Qt下的OpenGL 编程(4)进军3D世界
- Qt下的OpenGL 编程(4)进军3D世界
- OpenGL3D图形、旋转、纹理、键盘移动、光照、滤波、透明(完整)