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相关推荐

  1. NeHe教程Qt实现——lesson01

    NeHe 系列教程之一: 创建一个OpenGL 窗口 英文教程地址: lesson01 在Qt的实现中, 我们主要依赖QGLWidget类, 我们主要重载三个重要方法 :     void initi ...

  2. NeHe教程Qt实现——lesson10

    NeHe 系列教程之十:在3D空间中漫游 英文教程地址:lesson10 本课演示了从外部文件中加载数据构建3D模型的实例,代码基于第一课. 首先是3D模型的数据结构定义: namespace {bo ...

  3. NeHe教程Qt实现——lesson07

    NeHe 系列教程之七: 光照及纹理过滤 英文教程地址:lesson07 本课将以第一课的代码为基础, 实现光照效果. 首先是对象定义与纹理加载的代码: namespace { bool light; ...

  4. NeHe教程Qt实现——lesson08

    NeHe 系列教程之八: 混合 英文教程地址:lesson08 本课将在第七课的基础上添加颜色混合的代码: namespace { ... bool blend; // Blending OFF/ON ...

  5. NeHe教程Qt实现——lesson09

    NeHe 系列教程之九: 在3D空间中移动位图 英文教程地址:lesson09 本课基于第一课的代码, 利用颜色混合的方法,将一个黑白纹理与随机颜色进行混合,产生绚丽的效果. 首先是定义相关变量和数据 ...

  6. NeHe教程Qt实现——lesson16

    NeHe 系列教程之十四:雾 英文教程地址:lesson16 本课展示产生雾. 相关变量和函数定义: namespace { bool gp; GLuint fogMode[] = { GL_EXP, ...

  7. NeHe教程Qt实现——lesson06

    NeHe 系列教程之六: 纹理映射 英文教程地址:lesson06 本课以第一课的代码为基础,演示了加载纹理的过程. 首先给出的是绘制几何对象和加载纹理坐标的代码 namespace {GLfloat ...

  8. NeHe教程Qt实现——lesson15

    NeHe 系列教程之十四:纹理 轮廓字体 英文教程地址:lesson15 本课展示如何创建和显示纹理轮廓字体, 代码基于第一课. 首先是字体库的创建: namespace {#define USE_D ...

  9. NeHe教程Qt实现——lesson13

    NeHe 系列教程之十三: 位图字体 英文教程地址:lesson13 本课将展示位图字体的创建和显示, 代码基于第一课. 首先是字休库的创建,如下所示: namespace {#define USE_ ...

最新文章

  1. OKR的实施案例:OKR不需要很复杂
  2. html css百分比效果,css百分比不起作用是什么原因?
  3. ProjectEuler 005题
  4. grep从文件末尾开始找_c++ 开始之旅
  5. MySQL数据库的总结_MySQL数据库应用总结(三)—MySQL数据库的基本操作
  6. python斐波那契数列前20项_Python每日一练之实现斐波那契数列
  7. tomcat linux环境变量,linux系统为什么需要配置tomcat环境变量
  8. 【OpenCV】OpenCV实战从入门到精通之 -- 指针访问、迭代器iterator、动态地址计算配合at元素
  9. CCNP-17 OSPF试验13(BSCI)
  10. 如何快速实现一个抽签小程序
  11. 微软服务器和onenote,为什么微软推出“阉割版”onenote?一篇文章快速入门onenote uwp...
  12. QCC300x 芯片ota升级PSKey 操作方法
  13. Java多线程编程实战指南(核心篇)读书笔记(一)
  14. Dreamweaver cs6 网页设计教程笔记
  15. 现代Web发展趋势和前沿技术综述
  16. win7计算机的ip地址设置,如何将win7ip地址设置成自动获取
  17. Linux下Tab键补全,报No space left on device错误
  18. 1.3 数值分析 有效数字
  19. Java加密算法—凯撒加密实现以及暴力破解
  20. Go/Goland 开发笔记

热门文章

  1. linux下环境变量PS1设置
  2. 2018-01-02 JavaScript实现ZLOGO: 用语法树实现多层循环...
  3. Confluence 6 可以自定义的元素
  4. jedis中scan的实现
  5. shell中几个特殊的符号
  6. 《JavaScript应用程序设计》一一2.8 闭包
  7. 使用ganymed-ssh2-build通过ssh获得远程服务器参数
  8. contains与compareDocumentPosition方法详解
  9. linux下sudo权限管理
  10. alpine linux 执行文件崩溃 报错 找不到/lib/x86_64-linux-gnu/libc.so 解决方法