文章来源:http://www.cnblogs.com/tornadomeet/archive/2012/08/23/2653305.html

在这一节中主要简单介绍下怎样给平面几何着色,以及怎样让绘制出来的几何图形旋转起来。在上一节OpenGL_Qt学习笔记之_02(绘制简单平面几何图形) 中已经介绍了如何利用opengl画一些简单的图像,那么这一节就在上面的基础上给它着色,且让他旋转。

实验基础

首先来看着色,其实着色在上篇文章中已经用过,使用的是函数glColor3f()。一旦我们使用这个函数着色后且不更改颜色,则后面所绘的图形都是这个颜色了。我们给多边形着色时,表面上看都是给它的顶点着色,其实因为我们在initializeGL()函数中已经设置过glShapeModel(GL_SMOOTH),即颜色阴影是平滑模式。所以当我们给顶点设置后颜色后,其所构成的多边形内部就会按照一定规律自动填充颜色,且是平滑过渡。

下面来看看旋转,首先是要了解opengl的一个三维空间,如下图所示:

  

如果是按照X轴旋转的话,就是图中的指向视点那个轴了,NeHe教程中把沿x轴旋转比作成一台台钜,锯片中心的轴从左至右摆放,尖利的锯齿绕着X轴狂转,看起来要么向上转,要么向下转。把Y轴旋转比喻成巨大的龙卷风过程,龙卷风的中心从地面指向天空,垃圾和碎片围着Y轴从左向右或是从右向左狂转不止。把z轴旋转比喻成从正前方看着一台工作着的风扇。风扇的叶片绕着Z轴顺时针或逆时针狂转。这个比喻很形象。

其实大家凭想象都能想出来是怎么转的,这里不再罗嗦了。Opengl中关于旋转使用的是函数:

  glRotatef( Angle, Xvector, Yvector, Zvector )

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

实验说明

我在给圆着色时,每次给一个顶点赋值一种颜色,因为画圆是用三角形来逼近的,所以有很多顶点,且我这里给的顶点的颜色是随机赋值的,随机函数用的是Qt中自带的qrand(),

qrand()%10表示产生0~9之间的整数,因此(GLfloat)(qrand()%10)/10则表示0.0~0.9之间的小数。

在我这次试验中同样要注意,因为屏幕大小本身就2个单位的长和宽,所以设置旋转的轴时取值要适当,否则很难观察到旋转的效果。

实验结果

着色结果:

  

旋转时截取的一张图效果:

  

旋转的时候为了看到效果,可以不断改变窗口的大小,让GLWidget这个类不断执行paintGL()函数,实现重绘来看旋转效果。

实验主要部分代码及解释(附录有工程code下载链接地址)。

glwidget.cpp:

#include "glwidget.h"
#include "ui_glwidget.h"#include <QtGui>
#include <QtCore>
#include <QtOpenGL>#define GL_PI 3.1415926
#define GL_RADIUX  0.2fGLWidget::GLWidget(QGLWidget *parent) :QGLWidget(parent),ui(new Ui::GLWidget)
{//  setWindowTitle("The Opengl for Qt Framework");ui->setupUi(this);fullscreen = false;triangle_rotate = 0.0;quads_rotate = 0.0;circle_rotate = 0.0;
}//这是对虚函数,这里是重写该函数
void GLWidget::initializeGL()
{setGeometry(300, 150, 500, 500);//设置窗口初始位置和大小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 GLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glClear()函数在这里就是对initializeGL()函数//中设置的颜色和缓存深度等起作用glLoadIdentity();//重置当前的模型观察矩阵,该句执行完后,将焦点移动到了屏幕的中心/*下面几句代码是用来画三角形的,以glBegin()开始,glEnd()结束;glVertex3f为给定一个3维的顶点,坐标值为浮点型*/glTranslatef(-0.3, 0.3, -0.6);glRotatef(triangle_rotate, 0.2, 0.2, 0.0);//设置旋转的角度,这里为了观察,同时沿x轴和y轴做了旋转glBegin(GL_TRIANGLES);//GL_TRIANGLES代表为画三角形glVertex3f(0.0f, 0.2f, 0.0f);//上顶点坐标glColor3f(1.0f, 0.0f, 0.0f);glVertex3f(-0.2f, -0.2f, 0.0f);//左下角坐标glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(0.2f, -0.2f, 0.0f);//右下角坐标glColor3f(0.0f, 0.0f, 1.0f);glEnd();//结束画完triangle_rotate += 0.05;  //为了看到动态效果,这里每次刷新后旋转的角度都加0.05
glLoadIdentity();//重新焦点定位,同样是屏幕的中心glTranslatef(0.3f,0.3f,0.0f); // 向x轴正方向移动0.3个单位glRotatef(quads_rotate, 0.0, 0.2, 0.2);glColor3f(0.0f,1.0f,0.0f);//颜色设置放在这个地方,对下面的顶点设置都是有效的/*下面开始绘制四边形*/glBegin(GL_QUADS);glVertex3f(-0.2f, 0.2f, 0.0f); // 左上顶点glColor3f(1.0f, 0.0f, 0.0f);glVertex3f( 0.2f, 0.2f, 0.0f); // 右上顶点glColor3f(0.0f, 1.0f, 0.0f);glVertex3f( 0.2f, -0.2f, 0.0f); // 右下顶点glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(-0.2f, -0.2f, 0.0f); // 左下顶点glColor3f(1.0f, 0.2f, 0.8f);glEnd(); // 四边形绘制结束quads_rotate += 0.05;glLoadIdentity();glTranslatef(0.0f, -0.3f, 0.0f);glColor3f(0.0f, 0.0f, 1.0f);glRotatef(circle_rotate, 0.2, 0.0, 0.2);/*这里用连续的三角形面积来逼近圆的面积实现圆周的画法*/GLint circle_points = 100, i = 0;glBegin(GL_TRIANGLE_FAN);for(int i = 0; i < circle_points; i++ ){double angle = 2*GL_PI*i/circle_points;//qrand()%10为产生0~10的整数,这里的颜色是随机产生的glColor3f((GLfloat)(qrand()%10)/10, (GLfloat)(qrand()%10)/10, (GLfloat)(qrand()%10)/10);glVertex3f(GL_RADIUX*cos(angle), GL_RADIUX*sin(angle), 0);}glEnd();circle_rotate += 0.05;}//该程序是设置opengl场景透视图,程序中至少被执行一次(程序启动时).
void GLWidget::resizeGL(int width, int height)
{if(0 == height)height = 1;//防止一条边为0glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了glMatrixMode(GL_PROJECTION);//选择投影矩阵glLoadIdentity();//重置选择好的投影矩阵// gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵
    glMatrixMode(GL_MODELVIEW);glLoadIdentity();}
void GLWidget::keyPressEvent(QKeyEvent *e)
{switch(e->key()){//F1键为全屏和普通屏显示切换键case Qt::Key_F1:fullscreen = !fullscreen;if(fullscreen)showFullScreen();else{setGeometry(300, 150, 500, 500);showNormal();}updateGL();break;//Ese为退出程序键case Qt::Key_Escape:close();}
}GLWidget::~GLWidget()
{delete ui;
}

总结:opengl中实现平面图形的着色和旋转,实现起来比较简单,只需要对对应的函数赋即可。

   参考资料:

   http://nehe.gamedev.net/

   http://www.owlei.com/DancingWind/

   http://blog.csdn.net/qp120291570/article/details/7853513

附录:

实验工程code下载。

转载于:https://www.cnblogs.com/SunkingYang/p/11049241.html

OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)相关推荐

  1. OpenGL_Qt学习笔记之_05(纹理映射)(转)

    转自:http://www.cnblogs.com/tornadomeet/archive/2012/08/24/2654719.html 纹理映射基础知识 什么叫纹理映射,一开始我也不明白,感觉这个 ...

  2. OpenGL_Qt学习笔记之_05(纹理映射)

    纹理映射基础知识 什么叫纹理映射,一开始我也不明白,感觉这个词好专业(毕竟没有学过图形学),后面经过网上查找资料和这次实验稍微理解了点.纹理映射简单的讲,就是把一个纹理(其实说白了,纹理可以理解为一幅 ...

  3. OpenGL_Qt学习笔记之_07(闪烁的星星)

    OpenGL_Qt学习笔记之_07(闪烁的星星) 这一小节我们要完成的任务是:将一张背景是黑色,中间是白亮色的星星图片和五颜六色的颜色进行色彩融合,变成一颗彩色的星星.并且让这些星星自转和公转,可以控 ...

  4. OpenGL学习笔记(十)-几何着色器-实例化

    参考网址:LearnOpenGL 中文版 4.7 几何着色器 4.7.1 基本概念 1.顶点和片段着色器之间有一个可选的几何着色器,几何着色器的输入是一个图元(如点或三角形)的一组顶点,顶点发送到下一 ...

  5. 安卓学习笔记38:利用OpenGL ES绘制旋转立方体

    文章目录 零.学习目标 一.绘制图形基本步骤 二.绘制旋转立方体 (一)运行效果 (二)实现步骤 1.创建安卓应用[DrawRotatingCube] 2.建模:立方体类 - Cube 3.渲染:立方 ...

  6. 【OpenGL 学习笔记】第 7 篇:绘制旋转立方体

    目录 1.Z-缓冲 2.GLM库函数 3.PVM矩阵 4.PVM矩阵的使用 5.工程文件结构 1.Z-缓冲 //开启深度测试 glEnable(GL_DEPTH_TEST); 2.GLM库函数 3.P ...

  7. 【机器视觉学习笔记】双线性插值实现图片任意角度旋转(C++)

    目录 原理 源码 RotateImage_BilinearInterpolation 主函数 效果 与最近邻插值比较 原图 最近邻插值效果(局部) 双线性插值效果(局部) 完整源码 平台:Window ...

  8. 渡一教育公开课web前端开发JavaScript精英课学习笔记(三十二)JavaScript旋转方块

    JavaScript旋转方块 <!DOCTYPE html> <html lang="en"><head><meta charset=&q ...

  9. UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power

    UE5 Shader基础学习笔记--13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power Lec13 Deta ...

  10. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

最新文章

  1. 共读计划 | 你有多久没读完一本书了?
  2. java亲密数的解题思路,算法解题思路总结 - jjhgx的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. linux语言windows 语言,作业系统一般用什么编码语言程式设计?如:Windows,Linux,是组合语言吗?还是自己开发的程式码?...
  4. 计算机视觉:图像分类定位(单一目标检测)python实现
  5. YBTOJ洛谷P2387: 魔法森林(LCT)
  6. Subversion服务器搭建 (安装步骤)
  7. 《目标检测》YOLO、SSD简单学习
  8. c#虹软2.0免费人脸识别 实例
  9. 云计算,SDN,虚拟化三者关系
  10. 黑丝YYDS,通过五十行代码分分钟下载上万张黑丝小姐姐纯欲高清图!(宅男福利)
  11. 关于Shell脚本执行python代码,出现No such file or directorython: can't open file的问题
  12. 浅谈逆向——从案例谈OD的使用(OD的使用2)
  13. Java 读取PDF中的表格
  14. Redis过期策略和淘汰策略
  15. Android开发中Post方式上传文件(头像之类的)
  16. 94、基于51单片机的无线调频对讲机系统设计
  17. idea 怎么导入war包,idea怎么打开war包,idea怎么导出一个war包
  18. WK型振弦式应变计混凝土变形监测
  19. 一款QQ盗号木马分析
  20. 计算机集成制造系统 刊物界别,基于多传感器的高速CNC机床集成监控系统设计.pdf...

热门文章

  1. 怎么逼自己 成为一个上进的人
  2. 【深度学习环境配置二】【Pytorch安装详解-内附下载链接】基于win 10+TITAN XP+CUDA11.1+python3.7+vs2019的pytorch安装
  3. 使用心得:[屏幕录制专家]与[Macromedia Captivate]的比拼
  4. 机器学习——算法介绍-4
  5. 桌面上计算机图标怎么改成中文,电脑默认输入法是英文的怎么改成中文啊
  6. 《车载图像采集仿真应用指南》之基于图像采集的座舱测试
  7. m3u8\ts片段文件解密合成转换
  8. 树为什么能长这么高?
  9. Linux 开启443端口
  10. springboot项目启动遇到问题:AopAutoConfiguration matched: - @ConditionalOnProperty (spring.aop.auto=true)