`
gongzhq
  • 浏览: 22723 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

第四课:旋转

阅读更多


 

 

上一课中我教给您三角形和四边形的着色。这一课我将教您如何将这些彩色对象绕着坐标轴旋转。
其实只需在上节课的代码上增加几行就可以了。
我们将在NeHeWidget类中增加timerEvent成员函数和两个变量来控制这两个对象的旋转。它们是浮点类型的变量,使得我们能够非常精确地旋转对象。浮点数包含小数位置,这意味着我们无需使用1、2、3...的角度。你会发现浮点数是OpenGL编程的基础。新变量中叫做rTri的用来旋转三角形,rQuad 旋转四边形。

 

/*NeHeWidget类
  由nehewidget.h 展开。*/
/*添加的timeEvent和两个变量。timerEvent是定时器,rTri是用于三角形的角度,rQuad是用于四边形的角度。*/
protected:
    void initializeGL();
    void paintGL();
    void resizeGL( int width, int height );
    void keyPressEvent( QKeyEvent *e );
    void timerEvent(QTimerEvent *);
protected:
    bool fullscreen;
    GLfloat rTri;
    GLfloat rQuad; 
};

 

 

/*由nehewidget.cpp 展开。*/
NeHeWidget::NeHeWidget( QWidget* parent, bool fs )
    : QGLWidget( parent )
{
    /*我们需要在构造函数中给rTri和rQuad赋初值,都是0.0。*/
    rTri = 0.0;
    rQuad = 0.0;
    fullscreen = fs;
    setGeometry( 0, 0, 640, 480 );
    setWindowTitle(tr("NeHe's Rotation Tutorial"));

    if ( fullscreen )
        showFullScreen();

     /*5秒后执行timerEvent。*/
    startTimer(5); 
}

void NeHeWidget::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();
    /*上面的绘制三角形的代码没有改变。在屏幕的左面画了一个彩色渐变三角形,并绕着Y轴从左向右旋转。*/

    glLoadIdentity();
     /*我们增加了另一个glLoadIdentity()调用。目的是为了重置模型观察矩阵。如果我们没有重置,直接调用glTranslate的话,会出现意料之外的结果。因为坐标轴已经旋转了,很可能没有朝着您所希望的方向。所以我们本来想要左右移动对象的,就可能变成上下移动了,取决于您将坐标轴旋转了多少角度。试试将glLoadIdentity() 注释掉之后,会出现什么结果。
重置模型观察矩阵之后,X、Y、Z轴都以复位,我们调用glTranslate。您会注意到这次我们只向右移了1.5单位,而不是上节课的3.0单位。因为我们重置场景的时候,焦点又回到了场景的中心(0.0)处。这样就只需向右移1.5单位就够了。 当我们移到新位置后,绕X轴旋转四边形。正方形将上下转动。*/

    glTranslatef(  1.5,  0.0, -6.0 );
    glRotatef( rQuad,  1.0,  0.0,  0.0 );
    /*绕X轴旋转四边形。*/
    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();
    rTri += 0.2;
    rQuad -= 0.15;
    /*我们在构造函数中已经将rTri和rQuad的值设为0.0,在这里我们每绘制完一次图像,就修改一下这两个变量。两个变量的变化会使对象的旋转角度发生变化。
尝试改变下面代码中的+和-,来体会对象旋转的方向是如何改变的。并试着将0.2改成1.0。这个数字越大,物体就转的越快,这个数字越小,物体转的就越慢。*/
} 

 void NeHeWidget::timerEvent(QTimerEvent *)
{
    updateGL();
}

  

 

在这一课中,我试着尽量详细的解释如何让对象绕某个轴转动。改改代码,试着让对象绕着Z轴、X+Y轴或者所有三个轴来转动:)。

  • 大小: 15 KB
分享到:
评论

相关推荐

    GDI+教程第四课画笔类之对齐、旋转及缩放

    本节的内容主要介绍一下画笔的用法。利用画笔的对齐方式绘制图形以及设置旋转、缩放功能的演示。@spctomp。

    电脑入门培训教程.doc

    3、格式菜单栏之"对齐" 2-4、格式菜单栏之"字体,边框,图案"面板 2-5、条件格式和查找 第三课:编辑工作表 3-1、调整行高和列宽 3-2、插入、删除行列及隐藏、显示行列 3-3、移动和复制行列 第四课:工作簿的管理 4-...

    写作魔法42招,“打扮”作文得高分.zip

    04【第四课】雷神之锤mp4 05【第五课】花发夹亮晶晶mp4 06【第六课】旋转魔方mp4 07【第七课】后羿新皮肤mp4 08【第八课】我的世界mp4 09【第九课】冰糖葫芦mp4 10【第十课】时空之旅mp4 11【第十课】魔力新衣mp4 12...

    codility-lesson-solutions:回答Codility的在线课程任务

    第4课:计数元素 青蛙河一号 找到青蛙跳到河对岸的最早时间。 永久性检查 检查数组A是否为置换。 MissingInteger 查找给定序列中不存在的最小正整数。 最大计数器 应用所有交替操作后计算计数器的值:将计数器加...

    Arduino教程从基础到进阶的33堂课 (pdf)

    │ ├── 第4课 PWM 控制 LED 亮度 │ ├── 第5课 电位器连续调节LED亮度与ADC简介 │ ├── 第6课 温控风扇与 PWM 的频率问题 │ ├── 第7课 测量电压与 ADC 精度 │ ├── 第8课 LM35温度计、参考电压...

    3D打印实例教程(3Done)

    5初识3Done.docx 6饼干模具.docx 7创意书签.docx 8小椅子.docx 9花瓶.docx 10小茶杯.docx 11卡通手机架.docx 12立式笔筒.docx 13小印章.docx ...i第四课 制作我的圆珠笔.docx 第五课制作我的钢笔.docx

    codility_solutions

    协调任务的解决方案第1课:迭代-1.二进制间隙第2课:数组-2.阵列的循环旋转3.数组中的奇数次出现第3课:时间复杂度-4.青蛙跳

    易语言-GDI+教程第四课画笔类之对齐、旋转及缩放

    本节的内容主要介绍一下画笔的用法。利用画笔的对齐方式绘制图形以及设置旋转、缩放功能的演示。

    计科考查课-图形学结课作业/大作业

    4. 相对 y=3x 直线的旋转 60°变换 四、 二级子菜单(自由曲线绘制) 1. 四次 Bezier 曲线绘制 2. 三次 B 样条曲线 3. 二次 Bezier 曲线的拼接 五、 二级菜单(图形裁剪和图形填充) 1. 图形裁剪 2. 图形填充

    少儿编程 scratch 008课源代码-绘制正方形

    第八节课《绘制正方形》。实现的效果是——本次作品可以实现通过画笔工具实现作品能够自动的绘制出一个正方形的,帮助孩子理解几何图形中正方形的边长和角度的数值。以及简单图形相关数学知识。本节课的重点在于移动...

    word2000基础教程.

    撤消和恢复第四课 基础排版知识 1.文字的格式 2.段落的格式 3.边框和底纹 4.项目符号和编号 5.制表位第五课 高级排版知识 1.格式刷 2.样式 3.格式和样式的查找替换 4.分栏 5.特殊排版第六课 使用表格 ...

    Scratch儿童编程培训资料-7.pptx

    视频演示: 小猫躲移动挡板 1、任务导航 案例1: Scratch儿童编程培训资料-7全文共17页,当前为第4页。 2、任务分析 小猫躲挡板 小猫和挡板的初始位置在哪里? 挡板从哪里出来?朝什么方向运动?运动的速度多少? ...

    Nehe的OpenGL教程电子书

    旋转: 在这一课里,我将教会你如何旋转三角形和四边形。左图中的三角形沿Y轴旋转,四边形沿着X 轴旋转。 这一章将引入两个变量, rtri 被用来存储三角形的角度, rquad存储四边形的角度。 和容易创建一个多边形组成...

    OPenGL编程书籍

    4.旋转: 在这一课里,我将教会你如何旋转三角形和四边形。左图中的三角形沿Y轴旋转,四边形沿着X轴旋转。 这一章将引入两个变量, rtri 被用来存储三角形的角度, rquad存储四边形的角度。 和容易创建一个多边形组成...

    计算机图形学10章课件26个上机作业代码

    10章全课件 有图形包的TC2编程环境 26个程序代码在TC文件夹source子目录内 第一章 计算机图形学综述....第四章 参数曲线.ppt 第五章 几何变换.ppt 第六章 三维观察变换.ppt 第七章 参数曲面.ppt 第八章 实体的表示.ppt

    计算机动画设计.doc

    第四章 3D Studio MAX菜单与面板详解 教学要求: 1.了解3DS MAX中所有菜单以与各面板的功能与操作. 2.熟练掌握3DS MAX中关于物体的选择与变换、对齐工具、排列工具. 3.熟练掌握调整器的使用、编辑网格功能、克隆的...

    可变电容器的特点及应用概述

    可变电容器又两组互相绝缘的金属片组成电极:其中一组固定不动(定片),另一组安装在旋转轴上,可以旋转(动片)。固体密封单,双连和空气单,双连可变电容器的定片,动片引出端(如下图所示),使用中不可以接错。...

    五笔输入法培训教程.pptx

    微机组成 显示器 键盘 主机 鼠标 光驱 软驱 音箱 返回 五笔输入法培训教程全文共53页,当前为第4页。 开机/关机 开机 顺序:外设(显示器) 主机 电源开关(Power) 复位开关(Reset) 关机 顺序:主机 外设(显示器...

    -Materials-Studio-培训教程.pptx

    -Materials-Studio-培训教程全文共77页,当前为第4页。 二. 打开并且观察3D 文档 目的: 介绍Materials Studio 中文档 documents 的概念模块: Materials Visualizer前提: 已生成一个Project Materials Studio 使用了...

    ROS机器人操作系统讲义-机器人操作系统入门-中国大学MOOC.pdf

    第四章 ROS通信架构(二) Service Srv Parameter server 11.5.4 1.5.5 1.5.6 1.5.7 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.7 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.8 1.8.1 1.8.2 1.8.3 1.8.4 ...

Global site tag (gtag.js) - Google Analytics