NeHe教程Qt实现——lesson11
NeHe 系列教程之十一:飘扬的旗帜
英文教程地址:lesson11
本课实现了类似旗帜飘扬的效果, 其要领就是实时循环改变纹理坐标。本课以第六课的代码为基础。
首先是一些全局变量的定义:
namespace {GLfloat xrot = 0; // X RotationGLfloat yrot = 0; // Y RotationGLfloat zrot = 0; // Z Rotationfloat points[45][45][3]; // The Array For The Points On The Grid Of Our "Wave"int wiggle_count = 0; // Counter Used To Control How Fast Flag WavesGLfloat hold; // Temporarily Holds A Floating Point ValueGLuint texture[1]; // Storage For One Texture ( NEW )
}
加载纹理的过程与第六课类似,略。
然后是初始化过程, 这里重点关注纹理坐标points数据的构造:
void MyGLWidget::initializeGL()
{loadTextures();glEnable(GL_TEXTURE_2D); // Enable Texture Mapping ( NEW )glShadeModel(GL_SMOOTH); // Enables Smooth ShadingglClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black BackgroundglClearDepth(1.0f); // Depth Buffer SetupglEnable(GL_DEPTH_TEST); // Enables Depth TestingglDepthFunc(GL_LEQUAL); // The Type Of Depth Test To DoglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective CalculationsglPolygonMode( GL_BACK, GL_FILL ); // Back Face Is Filled InglPolygonMode( GL_FRONT, GL_LINE ); // Front Face Is Drawn With Lines// Loop Through The X Planefor(int x=0; x<45; x++) {// Loop Through The Y Planefor(int y=0; y<45; y++) {// Apply The Wave To Our Meshpoints[x][y][0] = float((x/5.0f)-4.5f);points[x][y][1] = float((y/5.0f)-4.5f);points[x][y][2] = float(sin((((x/5.0f)*40.0f)/360.0f)*3.141592654*2.0f));}}
}
最后是绘制代码:
void MyGLWidget::paintGL()
{int x , y; // Loop Variablesfloat float_x, float_y, float_xb, float_yb; // Used To Break The Flag Into Tiny QuadsglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth BufferglLoadIdentity(); // Reset The Current Modelview MatrixglTranslatef(0.0f,0.0f,-15.0f); // Move Into The Screen 12 UnitsglRotatef(xrot,1.0f,0.0f,0.0f); // Rotate On The X AxisglRotatef(yrot,0.0f,1.0f,0.0f); // Rotate On The Y AxisglRotatef(zrot,0.0f,0.0f,1.0f); // Rotate On The Z AxisglBindTexture(GL_TEXTURE_2D, texture[0]); // Select Our TextureglBegin(GL_QUADS);for(x = 0; x < 44; x++ ) {for (y = 0; y < 44; y++) {float_x = float(x)/44.0f; // Create A Floating Point X Valuefloat_y = float(y)/44.0f; // Create A Floating Point Y Valuefloat_xb = float(x+1)/44.0f; // Create A Floating Point Y Value+0.0227ffloat_yb = float(y+1)/44.0f; // Create A Floating Point Y Value+0.0227fglTexCoord2f( float_x, float_y); // First Texture Coordinate (Bottom Left)glVertex3f( points[x][y][0], points[x][y][1], points[x][y][2] );glTexCoord2f( float_x, float_yb ); // Second Texture Coordinate (Top Left)glVertex3f( points[x][y+1][0], points[x][y+1][1], points[x][y+1][2] );glTexCoord2f( float_xb, float_yb ); // Third Texture Coordinate (Top Right)glVertex3f( points[x+1][y+1][0], points[x+1][y+1][1], points[x+1][y+1][2] );glTexCoord2f( float_xb, float_y ); // Fourth Texture Coordinate (Bottom Right)glVertex3f( points[x+1][y][0], points[x+1][y][1], points[x+1][y][2] );}}glEnd();if( wiggle_count == 2 ) { // Used To Slow Down The Wave (Every 2nd Frame Only)for( y = 0; y < 45; y++ ) { // Loop Through The Y Planehold=points[0][y][2]; // Store Current Value One Left Side Of Wavefor( x = 0; x < 44; x++) { // Loop Through The X Plane// Current Wave Value Equals Value To The Rightpoints[x][y][2] = points[x+1][y][2];}points[44][y][2]=hold; // Last Value Becomes The Far Left Stored Value}wiggle_count = 0; // Set Counter Back To Zero}wiggle_count++; // Increase The Counterxrot += 0.3f; // X Axis Rotationyrot += 0.2f; // Y Axis Rotationzrot += 0.4f; // Z Axis Rotation
}
运行效果如下所示:
转载于:https://my.oschina.net/fuyajun1983cn/blog/263942
NeHe教程Qt实现——lesson11相关推荐
- NeHe教程Qt实现——lesson01
NeHe 系列教程之一: 创建一个OpenGL 窗口 英文教程地址: lesson01 在Qt的实现中, 我们主要依赖QGLWidget类, 我们主要重载三个重要方法 : void initi ...
- NeHe教程Qt实现——lesson10
NeHe 系列教程之十:在3D空间中漫游 英文教程地址:lesson10 本课演示了从外部文件中加载数据构建3D模型的实例,代码基于第一课. 首先是3D模型的数据结构定义: namespace {bo ...
- NeHe教程Qt实现——lesson07
NeHe 系列教程之七: 光照及纹理过滤 英文教程地址:lesson07 本课将以第一课的代码为基础, 实现光照效果. 首先是对象定义与纹理加载的代码: namespace { bool light; ...
- NeHe教程Qt实现——lesson08
NeHe 系列教程之八: 混合 英文教程地址:lesson08 本课将在第七课的基础上添加颜色混合的代码: namespace { ... bool blend; // Blending OFF/ON ...
- NeHe教程Qt实现——lesson09
NeHe 系列教程之九: 在3D空间中移动位图 英文教程地址:lesson09 本课基于第一课的代码, 利用颜色混合的方法,将一个黑白纹理与随机颜色进行混合,产生绚丽的效果. 首先是定义相关变量和数据 ...
- NeHe教程Qt实现——lesson16
NeHe 系列教程之十四:雾 英文教程地址:lesson16 本课展示产生雾. 相关变量和函数定义: namespace { bool gp; GLuint fogMode[] = { GL_EXP, ...
- NeHe教程Qt实现——lesson06
NeHe 系列教程之六: 纹理映射 英文教程地址:lesson06 本课以第一课的代码为基础,演示了加载纹理的过程. 首先给出的是绘制几何对象和加载纹理坐标的代码 namespace {GLfloat ...
- NeHe教程Qt实现——lesson15
NeHe 系列教程之十四:纹理 轮廓字体 英文教程地址:lesson15 本课展示如何创建和显示纹理轮廓字体, 代码基于第一课. 首先是字体库的创建: namespace {#define USE_D ...
- NeHe教程Qt实现——lesson13
NeHe 系列教程之十三: 位图字体 英文教程地址:lesson13 本课将展示位图字体的创建和显示, 代码基于第一课. 首先是字休库的创建,如下所示: namespace {#define USE_ ...
最新文章
- OKR的实施案例:OKR不需要很复杂
- html css百分比效果,css百分比不起作用是什么原因?
- ProjectEuler 005题
- grep从文件末尾开始找_c++ 开始之旅
- MySQL数据库的总结_MySQL数据库应用总结(三)—MySQL数据库的基本操作
- python斐波那契数列前20项_Python每日一练之实现斐波那契数列
- tomcat linux环境变量,linux系统为什么需要配置tomcat环境变量
- 【OpenCV】OpenCV实战从入门到精通之 -- 指针访问、迭代器iterator、动态地址计算配合at元素
- CCNP-17 OSPF试验13(BSCI)
- 如何快速实现一个抽签小程序
- 微软服务器和onenote,为什么微软推出“阉割版”onenote?一篇文章快速入门onenote uwp...
- QCC300x 芯片ota升级PSKey 操作方法
- Java多线程编程实战指南(核心篇)读书笔记(一)
- Dreamweaver cs6 网页设计教程笔记
- 现代Web发展趋势和前沿技术综述
- win7计算机的ip地址设置,如何将win7ip地址设置成自动获取
- Linux下Tab键补全,报No space left on device错误
- 1.3 数值分析 有效数字
- Java加密算法—凯撒加密实现以及暴力破解
- Go/Goland 开发笔记
热门文章
- linux下环境变量PS1设置
- 2018-01-02 JavaScript实现ZLOGO: 用语法树实现多层循环...
- Confluence 6 可以自定义的元素
- jedis中scan的实现
- shell中几个特殊的符号
- 《JavaScript应用程序设计》一一2.8 闭包
- 使用ganymed-ssh2-build通过ssh获得远程服务器参数
- contains与compareDocumentPosition方法详解
- linux下sudo权限管理
- alpine linux 执行文件崩溃 报错 找不到/lib/x86_64-linux-gnu/libc.so 解决方法