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

在本文中主要是通过绘制一个三角锥和立方体来介绍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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值