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
- Qt OpenGL----着色、3D和旋转
- qt opengl lesson5 绘制3d立体旋转图形
- 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- Qt OpenGL 3D Graphics
- opengl 鼠标3D旋转简单实现
- OpenGL 鼠标3D旋转简单实现
- OpenGL 创建3D魔方 旋转 问题
- opengl 制作 3D 彩色旋转三角形
- opengl 鼠标3D旋转简单实现
- OpenGL学习程序,创建一个3D的三角椎体和正方体并旋转
- 【Qt OpenGL教程】05:3D模型
- opengl es 颜色和着色
- openGL 3D图形和openGL简介
- 【OpenGL】OpenGL 2D平移与旋转
- QT与OpenGL之旋转
- 【Qt OpenGL教程】04:旋转
- lua中字符串匹配笔记
- 解决360 兼容模式下问题。
- android终端模拟器运行命令可以进行adb connect
- 【JNI探索之路系列】之六:动态库的调用过程
- Linux下使Shell 命令脱离终端在后台运行
- Qt OpenGL----着色、3D和旋转
- POJ 2154 Color (polya 欧拉函数)
- 安全行业,或许很难,但是我来了
- PDF文件怎么才能编辑里面的内容
- Android的AlertDialog详解
- 关于按下shift建后单击选取多个文件
- java大写转化小写的同时小写转化成大写的方法
- ASP在访问Sql2005对left join语句的时出现不兼容的问题
- iOS消息推送详解