(此节内容对应NEHE教程第11课)

目前为止我们做的例子都是平面的,这个例子是带有波动效果的,

2维图形包括X,Y两个坐标系。因此看到的是平面的。
3维图形由X,Y,Z三个坐标系构成,当Z坐标不为0时,可以产生3维的效果。一个图片或图形由许多个3维图形构成是,并且Z是变化的 就会产生波动的效果

for(int x=0; x<45; x++){// 沿Y平面循环for(int y=0; y<45; y++){// 向表面添加波浪效果points[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));}}

多边形填充方式,glPolygonMode()

glPolygonMode( GL_BACK, GL_FILL );   // 后表面完全填充
glPolygonMode( GL_FRONT, GL_LINE );   // 前表面使用线条绘制

#include "header.h"float points[45][45][3];
int wiggle_count = 0;      GLfloat xrot;
GLfloat yrot;
GLfloat zrot;
GLfloat hold;       GLuint  texture[1];     AUX_RGBImageRec *LoadBMP(char *Filename)
{FILE *File=NULL;                              if (!Filename)                                  {return NULL;                               }File=fopen(Filename,"r");                       if (File)                                           {fclose(File);                                  return auxDIBImageLoad(Filename);               }return NULL;
}int LoadGLTextures()
{int Status=FALSE;                                 AUX_RGBImageRec *TextureImage[1];                   memset(TextureImage,0,sizeof(void *)*1);           // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quitif (TextureImage[0]=LoadBMP("Data/Tim.bmp")){Status=TRUE;                                   glGenTextures(1, &texture[0]);                  // Typical Texture Generation Using Data From The BitmapglBindTexture(GL_TEXTURE_2D, texture[0]);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);}if (TextureImage[0])                                 {if (TextureImage[0]->data)                          {free(TextureImage[0]->data);                }free(TextureImage[0]);                             }return Status;
}void ReSizeGLScene(GLsizei width, GLsizei height)
{if (height==0)                                       {height=1;                                     }glViewport(0,0,width,height);                      glMatrixMode(GL_PROJECTION);                        glLoadIdentity();                               // Calculate The Aspect Ratio Of The WindowgluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);                         glLoadIdentity();
}int InitGL(void)
{if (!LoadGLTextures())                             {return FALSE;                              }glEnable(GL_TEXTURE_2D);                           glShadeModel(GL_SMOOTH);                            glClearColor(0.0f, 0.0f, 0.0f, 0.5f);               glClearDepth(1.0f);                                 glEnable(GL_DEPTH_TEST);                            glDepthFunc(GL_LEQUAL);                             glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);glPolygonMode( GL_BACK, GL_FILL );                    glPolygonMode( GL_FRONT, GL_LINE );                 for(int x=0; x<45; x++){for(int y=0; y<45; y++){points[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));}}return TRUE;
}void DrawGLScene(void)
{int x, y;float float_x, float_y, float_xb, float_yb;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glLoadIdentity();                                   glTranslatef(0.0f,0.0f,-12.0f);glRotatef(xrot,1.0f,0.0f,0.0f);glRotatef(yrot,0.0f,1.0f,0.0f);  glRotatef(zrot,0.0f,0.0f,1.0f);glBindTexture(GL_TEXTURE_2D, texture[0]);glBegin(GL_QUADS);for( x = 0; x < 44; x++ ){for( y = 0; y < 44; y++ ){float_x = float(x)/44.0f;float_y = float(y)/44.0f;float_xb = float(x+1)/44.0f;float_yb = float(y+1)/44.0f;glTexCoord2f( float_x, float_y);glVertex3f( points[x][y][0], points[x][y][1], points[x][y][2] );glTexCoord2f( float_x, float_yb );glVertex3f( points[x][y+1][0], points[x][y+1][1], points[x][y+1][2] );glTexCoord2f( float_xb, float_yb );glVertex3f( points[x+1][y+1][0], points[x+1][y+1][1], points[x+1][y+1][2] );glTexCoord2f( float_xb, float_y );glVertex3f( points[x+1][y][0], points[x+1][y][1], points[x+1][y][2] );}}glEnd();if( wiggle_count == 2 ){for( y = 0; y < 45; y++ ){hold=points[0][y][2];for( x = 0; x < 44; x++){points[x][y][2] = points[x+1][y][2];}points[44][y][2]=hold;}wiggle_count = 0;}wiggle_count++;glFlush();
}void rotate()
{xrot+=0.3f;yrot+=0.2f;zrot+=0.4f;glutPostRedisplay();
}
void keyboard(unsigned char key,int x,int y)
{switch (key){case 'S':glutIdleFunc(rotate);break;case 'R':glutIdleFunc(NULL);break;}}int main(int argc,char **argv)
{glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(800,600);glutInitWindowPosition(100,100);glutCreateWindow("飘动的旗帜");InitGL();glutDisplayFunc(DrawGLScene);glutKeyboardFunc(keyboard);glutReshapeFunc(ReSizeGLScene);glutMainLoop();
}

OpenGL学习三十九:飘动的旗帜相关推荐

  1. NeHe OpenGL第三十九课:物理模拟

    NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切.   物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇 ...

  2. 推荐系统遇上深度学习(三十九)-推荐系统中召回策略演进!

    推荐系统中的核心是从海量的商品库挑选合适商品最终展示给用户.由于商品库数量巨大,因此常见的推荐系统一般分为两个阶段,即召回阶段和排序阶段.召回阶段主要是从全量的商品库中得到用户可能感兴趣的一小部分候选 ...

  3. Java多线程学习三十九:CAS 有什么缺点?

    CAS 有哪几个主要的缺点. 首先,CAS 最大的缺点就是 ABA 问题. 决定 CAS 是否进行 swap 的判断标准是"当前的值和预期的值是否一致",如果一致,就认为在此期间这 ...

  4. opencv学习(三十九)之反向投影calcBackProject()

    1.概述 反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式,简单来讲,反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征.反向投影在某一位置的值就是原图对 ...

  5. OpenGL学习二十九:模板缓冲区与模板测试

    帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据. 深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度 ...

  6. javaweb学习总结(三十九)——数据库连接池

    javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10 ...

  7. JavaScript学习(三十九)—对象中内容的操作

    JavaScript学习(三十九)-对象中内容的操作 一.对象中内容的操作:增.删.改.查 (一).增:给对象添加属性或者方法 1)方式1:对象名称.属性名=属性值: 2)方式2:对象名称['属性名' ...

  8. Slicer学习笔记(三十九)slicer中Markups模块

    Slicer学习笔记(三十九)slicer中Markups模块 1.概念 1.1.Markups模块简介 1.2.应用方向 1.3.界面面板 1.Markups List 2.Buttons And ...

  9. 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)——数据库连接池 一、应用程序直接获取数据库连接的缺点   用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对 ...

最新文章

  1. 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
  2. MVC 扩展方法特点
  3. java关机命令收集cmd关机命令
  4. php 邮件类库,[3.3]-扩展类库:基于PHPMailer的邮件发送 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...
  5. php中颜色的索引值,PHP imagecolorsforindex - 取得某索引的颜色 - 有码中国
  6. Sublime Text 3中配置Python3的开发环境
  7. 数据之路 - 数据可视化 - Tableau工具
  8. 8.SOA架构:服务和微服务分析及设计--- Web服务及REST服务的服务API与契约版本控制
  9. HTML5方式使用freeswitch——VERTO模块
  10. JSP九大内置对象详解
  11. 关于在VMware上装lFEDORA系统
  12. YUV format online tool
  13. (精品)java宠物医院管理系统+论文+答辩ppt+部署视频+效果图效果视频
  14. 25款实用的桌面版博客编辑器
  15. 利用POI将PPT转换为图片
  16. VMware vSphere7 with Tanzu 安装方案
  17. 云端服务器怎么修改密码,云端服务器怎么设置登录密码
  18. vue3.0 + JsBarcode 循环生成多个条形码(setup语法糖)
  19. 2021-6-8-今日收获
  20. CSDN文章如何迁移至微信公众号

热门文章

  1. Ubuntu桌面消失后重装你桌面系统教程
  2. XMU2018摸底测试 星际战争I(Easy)
  3. Heckman两步法 | 样本选择模型 处理效应模型
  4. Win10中实时网速显示
  5. 为什么Go语言在中国格外的火
  6. 8.3列表/菜单/文本域标记
  7. kubeadmin安装高可用k8s集群
  8. ubuntu卷组安装
  9. 干支纪年法简便算法_初中阶段常用的四种历史纪年法
  10. C++ STL(第十三篇:RB-tree)