OpenGL(十二)——Qt OpenGL绕着坐标轴旋转多边形

一、旋转多边形

前两篇介绍了如何绘制多边形,并且给多边形进行上色。本篇介绍如何旋转多边形。

多边形的旋转,在类中增加两个变量来控制这两个对象的旋转。它们是浮点类型的变量,使得我们能够非常精确地旋转对象。
浮点数包含小数位置,这意味着我们无需使用1、2、3...的角度。你会发现浮点数是OpenGL编程的基础。变量rTri的用来旋转三角形,rQuad 旋转四边形。

二、旋转函数

多边形的旋转主要使用的是函数

glRotatef( rTri, 0.0, 1.0, 0.0);

glRotatef函数介绍:

glRotatef( Angle, Xvector, Yvector, Zvector )负责让对象绕某个轴旋转。这个函数有很多用处。 Angle 通常是个变量代表对象转过的角度。
Xvector,Yvector和Zvector三个参数则共同决定旋转轴的方向。比如( 1, 0, 0 )所描述的矢量经过X坐标轴的1个单位处并且方向向右。
( -1, 0, 0 )所描述的矢量经过X坐标轴的1个单位处,但方向向左。

//!D. Michael Traub:提供了对 Xvector , Yvector 和 Zvector 的上述解释。
    //! 为了更好的理解X, Y 和 Z的旋转,我举些例子...
    //! X轴-您正在使用一台台锯。锯片中心的轴从左至右摆放(就像OpenGL中的X轴)。尖利的锯齿绕着X轴狂转,
看起来要么向上转,要么向下转。取决于锯片开始转时的方向。
    //!     这与我们在OpenGL中绕着X轴旋转什么的情形是一样的。(CKer注:这会儿您要把脸蛋凑向显示器的话,
保准被锯开了花。)
    //! Y轴-假设您正处于一个巨大的龙卷风中心,龙卷风的中心从地面指向天空(就像OpenGL中的Y轴)。
垃圾和碎片围着Y轴从左向右或是从右向左狂转不止。
    //!     这与我们在OpenGL中绕着Y轴旋转什么的情形是一样的。
    //! Z轴-您从正前方看着一台风扇。风扇的中心正好朝着您(就像OpenGL中的Z轴)。风扇的叶片绕着Z轴顺时针
或逆时针狂转。这与我们在OpenGL中绕着Z轴旋转什么的情形是一样的。

三、代码

头文件:


#include <QObject>
#include <QWidget>
#include <qgl.h>
#include <QTimer>
/*
*绕着坐标轴 旋转多边形.
*/class NeHe_4_Widget : public QGLWidget
{Q_OBJECT
public:NeHe_4_Widget(QWidget *parent = 0);~NeHe_4_Widget();protected:void initializeGL(); void paintGL();     void resizeGL( int width, int height );
public slots:void slotTimer();private:GLfloat rTri;GLfloat rQuad;QTimer* m_timer;
};

cpp文件

#include "nehe_4_widget.h"
#include <GL/glu.h>/**
*上一课中我教给您三角形和四边形的着色。这一课我将教您如何将这些彩色对象绕着坐标轴旋转。
其实只需在上节课的代码上增加几行就可以了。我们将在NeHeWidget类中增加两个变量来控制这两个对象的旋转。它们是浮点类型的变量,使得我们能够非常精确地旋转对象。
浮点数包含小数位置,这意味着我们无需使用1、2、3...的角度。你会发现浮点数是OpenGL编程的基础。
新变量中叫做rTri的用来旋转三角形,rQuad 旋转四边形
*/NeHe_4_Widget::NeHe_4_Widget(QWidget *parent):QGLWidget(parent)
{setGeometry(0,0, 640, 480);rTri = 1.0;rQuad = 1.0;m_timer = new QTimer(this);m_timer->setInterval(50);connect(m_timer,SIGNAL(timeout()),this,SLOT(slotTimer()));m_timer->start();
}NeHe_4_Widget::~NeHe_4_Widget()
{}void NeHe_4_Widget::initializeGL()
{glShadeModel( GL_SMOOTH );glClearColor( 0.0, 0.0, 0.0, 0.0 );glClearDepth( 1.0 );glEnable( GL_DEPTH_TEST );glDepthFunc( GL_LEQUAL );glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );}void NeHe_4_Widget::resizeGL( int width, int height )
{if ( height == 0 ){height = 1;}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 NeHe_4_Widget::slotTimer()
{rTri += 0.2;rQuad += 0.5;update();
}void NeHe_4_Widget::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);//glRotatef( Angle, Xvector, Yvector, Zvector )负责让对象绕某个轴旋转。这个函数有很多用处。 Angle 通常是个变量代表对象转过的角度。\Xvector,Yvector和Zvector三个参数则共同决定旋转轴的方向。比如( 1, 0, 0 )所描述的矢量经过X坐标轴的1个单位处并且方向向右。\( -1, 0, 0 )所描述的矢量经过X坐标轴的1个单位处,但方向向左。//!D. Michael Traub:提供了对 Xvector , Yvector 和 Zvector 的上述解释。//! 为了更好的理解X, Y 和 Z的旋转,我举些例子...//! X轴-您正在使用一台台锯。锯片中心的轴从左至右摆放(就像OpenGL中的X轴)。尖利的锯齿绕着X轴狂转,看起来要么向上转,要么向下转。取决于锯片开始转时的方向。//!     这与我们在OpenGL中绕着X轴旋转什么的情形是一样的。(CKer注:这会儿您要把脸蛋凑向显示器的话,保准被锯开了花。)//! Y轴-假设您正处于一个巨大的龙卷风中心,龙卷风的中心从地面指向天空(就像OpenGL中的Y轴)。垃圾和碎片围着Y轴从左向右或是从右向左狂转不止。//!     这与我们在OpenGL中绕着Y轴旋转什么的情形是一样的。//! Z轴-您从正前方看着一台风扇。风扇的中心正好朝着您(就像OpenGL中的Z轴)。风扇的叶片绕着Z轴顺时针或逆时针狂转。这与我们在OpenGL中绕着Z轴旋转什么的情形是一样的。//上面的一行代码中,如果rtri等于7,我们将三角形绕着Y轴从左向右旋转7 。您也可以改变参数的值,让三角形绕着X和Y轴同时旋转。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,  0.0 );glColor3f( 0.0, 0.0, 1.0 );glVertex3f(  1.0, -1.0,  0.0 );glEnd();glLoadIdentity();//glTranslatef(  3.0,  0.0,  0.0 );glTranslatef(  1.5,  0.0, -6.0 );glRotatef( rQuad,  1.0,  0.0,  0.0 );glColor3f( 0.5, 0.5, 1.0 );glBegin( GL_QUADS );glVertex3f( -1.0,  1.0,  0.0 );glVertex3f( 1.0,  1.0,  0.0 );glVertex3f( 1.0,  -1.0,  0.0 );glVertex3f( -1.0,  -1.0,  0.0 );glEnd();glTranslatef(  -1.5,  0.0,  0.0 );glColor3f( 1.0, 1.0, 0.0 );glBegin( GL_LINES );glVertex3f(0.0, 1.0, 0.0);glVertex3f(0.0, -1.0, 0.0);glEnd();rTri += 0.2;rQuad -= 0.15;//! 我们在构造函数中已经将rTri和rQuad的值设为0.0,在这里我们每绘制完一次图像,就修改一下这两个变量。两个变量的变化会使对象的旋转角度发生变化.//! 尝试改变下面代码中的+和-,来体会对象旋转的方向是如何改变的。并试着将0.2改成1.0。这个数字越大,物体就转的越快,这个数字越小,物体转的就越慢。}

四、代码运行效果

我们运行一下,看一下运行的效果。

可以看到,通过定时器刷新 rTri和rQuad的值,并update()重绘,可以看到三角形和四边形在旋转,旋转的效果,你可以把代码在Qt中运行一下看看。

上一篇:OpenGL(十一)——Qt OpenGL给多边形上色

下一篇:OpenGL(十三)——Qt OpenGL绘制三维图形

本文原创作者:冯一川(ifeng12358@163.com),未经作者授权同意,请勿转载。

OpenGL(十二)——Qt OpenGL绕着坐标轴旋转多边形相关推荐

  1. Qt OpenGL(二十)——Qt OpenGL 核心模式版本

    Qt OpenGL(二十)--Qt OpenGL 核心模式版本 一.写在前面 在之前的OpenGL教程(1~19)中,采用的方式都是固定渲染管线,也就是OpenGL3.2版本之前的写法,但是OpenG ...

  2. OpenGL十二讲代码

    文章目录 OpenGL十二讲代码-by yjq 参考资料 第一讲 画一个矩形 第二讲 画一个五角星 画一个圆 画一个正弦函数 第三讲 画点 画虚线 多边形 多边形的两面 前后反转 剔除多边形表面 镂空 ...

  3. Qt OpenGL(三十六)——Qt OpenGL 核心模式-绘制雷达坐标系

    提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十六)--Qt OpenGL 核心模式-绘制雷达坐标系 一.场景 ...

  4. Android OpenGL ES 学习(十二) - MediaCodec + OpenGL 解析H264视频+滤镜

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  5. 【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )

    文章目录 一.模型准备 二.光照设置 1.启用光照设置 2.启用光源 3.设置光照参数 4.设置环境光 5.设置反射材质 三.光照法线设置 1.设置光源位置 2.设置法线 3.代码示例及运行效果 四. ...

  6. 【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )

    文章目录 一.设置线宽度 二.绘制单条线段 GL_LINES 三.绘制多条线段 GL_LINES 四.绘制依次连接的点组成的线 GL_LINE_STRIP 五.绘制圈 GL_LINE_LOOP ( 偶 ...

  7. 基础知识(十二)Opengl回顾记录

    研究生搞三维图形,天天用opengl,然而毕业了一段时间后,发现以前使用opengl的一些小细节都忘了,以前都没有记录,突然感到后悔了--这边只能记录一些目前还记得的一些细节了,省的以后,连这些都给忘 ...

  8. 第二十二章 opengl之高级OpenGL(几何着色器)

    OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...

  9. 初学计算机图形学——OpenGL实现二维图形平移,旋转(不使用opengl自带的函数,齐次方程实现)

    要求:1.给定窗口中绘制坐标系 2.给定坐标系内绘制三角形 3.完成平移.旋转等变换后的三角形绘制 4.采用OpenGL绘制 代码: #include<windows.h> #includ ...

最新文章

  1. 比特币vs分布式账本vs以太坊vs区块链
  2. python用Levenshtein计算文本相似度
  3. mysql主从不同步怎么恢复_mysql主从不同步时,怎么恢复
  4. 操作系统五: 非连续内存分配
  5. spring8: di依赖注入--构造注入
  6. OpenStack云计算口袋书-第一章-开始OpenStack之旅(一)
  7. SQL-SQLServer(926)
  8. java jre 中导入导出证书
  9. BoooLee pyretoolkit -- 一个基于python re模块的在线正则表达式测试工具
  10. 【Python CheckiO 题解】Non-unique Elements
  11. 系统权限管理设计 (转)
  12. Exchange Server2010系列之三:Exchange Server部署完成后的配置
  13. 第三章EF的基本使用 EF数据实体模型的更新
  14. IOS开发中实现UITableView按照首字母将集合进行检索分组
  15. Java8新特性(二)——强大的Stream API
  16. php位运算符与逻辑运算_php 或_php 逻辑运算符和
  17. oracle cdr是什么,基础:CDR软件中曲线工具的使用
  18. win7变成xp风格了怎么改回_win7怎么变成xp界面|win7系统变成xp界面主题的方法
  19. 【面试】AI算法工程师---面试题!(第二部分:AI部分)
  20. Openerp对象字段定义详解

热门文章

  1. 在线电子书阅读微信小程序 毕业设计(4)图书详细页-图书目录
  2. WPS打开文档时显示“文档被其他程序占用,是否以只读的方式”打开解决方法
  3. 简易购买电影票系统(Java)
  4. uni-app之video视频组件
  5. QT5.14.1实现界面开场动画
  6. spring基础概述
  7. linux下的“超超超音速”安装谷歌中文输入法
  8. Zabbix Agent 主被动模式 坑与技巧
  9. android auto领动,动力系统非常出色 小试北京现代领动
  10. 钉钉创建单人群、双人群及钉钉自定义机器人的初步使用(附python3代码)