(此节内容对应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 Quit if (TextureImage[0]=LoadBMP("Data/Tim.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); // Typical Texture Generation Using Data From The Bitmap glBindTexture(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 Window gluPerspective(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(); }
相关推荐
整个工程文件。别的文章都只是复制的代码,但是整个工程的建立,头文件和pro文件的很多参数都需要设置。很麻烦。所以特意将工程文件分享给大家。
OpenGL是一种强大的图形库,用于在各种操作系统和硬件平台上创建2D和3D图像。它提供了一种编程语言接口,让开发者能够控制图形...这个项目提供了学习和实践OpenGL动画技巧的机会,同时加深了对图形学和物理模拟的理解。
在本项目中,"图形学大作业-opengl实现飘动的旗帜粒子系统.zip"是一个基于OpenGL的编程作业,目标是创建一个逼真的飘动旗帜的粒子系统。OpenGL是一种跨语言、跨平台的图形库,广泛用于渲染2D、3D矢量图形。此项目将...
标题中的“飘动的旗帜”指的是一个使用OpenGL技术制作的3D模拟动态旗帜的程序。OpenGL,全称Open Graphics Library,是一种跨语言、跨平台的应用程序编程接口(API),主要用于渲染2D、3D矢量图形。这个项目可能是...
在"opengles特效之飘扬的旗帜"这个主题中,我们将探讨如何利用OpenGL ES实现逼真的旗帜飘动效果。 在移动设备上创建动态的旗帜效果,首先需要理解基本的图形学概念,包括顶点、纹理、着色器和帧缓冲。顶点是构成...
这个“飘动的红旗 OpenGL”项目可能是一个使用OpenGL来模拟红旗飘动效果的作业或示例。在OpenGL中实现这样的效果,涉及到的关键知识点包括: 1. **OpenGL基础知识**:首先,理解OpenGL的基础架构是至关重要的,包括...
代码是整套的基于MFC的Opengl开发的源码程序
01:OpenGL窗口 02:多边形 03:添加颜色 04:旋转 05:3D空间 06:纹理映射 07:光照和键盘 08:混合 09:移动图像 10:3D世界 11:飘动的旗帜 12:显示列表 13:图像字体 14:图形字体 15:纹理图形字 16:雾 17:...
在学习OpenGL的过程中,还会了解到OpenGL的版本信息,包括如何检查当前系统支持的OpenGL版本,以及如何使用和获取新版本的OpenGL。Khronos Group还会发布一些扩展,它们允许开发者使用一些新的API函数,以达到使用...
"Nehe第11课飘动的旗帜"是学习OpenGL编程的一个经典教程,主要讲解了如何在三维空间中实现纹理映射和混合操作,来创建逼真的飘动旗帜效果。这个教程适合对计算机图形学有一定基础,特别是对OpenGL有一定了解的学习者...
包括:01: Hello OpenGL,02: 多边形,03: 颜色,04: 旋转,05: 3D 空间,06: 纹理映射,07: 光照,08: 混合,09: 移动图像,10: 加载模型,11: 飘动的旗帜,16: 雾!,18: 二次几何体,19: 粒子系统 (GPU),19: ...
- **飘动的旗帜**:教程演示了如何利用纹理映射和混合技术创建动态的飘动旗帜效果,提升了场景的生动性。 - **显示列表**:为了加速OpenGL程序的运行,教程介绍了显示列表的使用方法,通过预编译OpenGL命令,减少了...
在这个主题中,我们将深入探讨如何在Visual C++(简称VC++)环境下进行图形学编程,特别是涉及阴暗实体和飘动的旗帜这两部分。 1. **VC++环境搭建**:Visual C++是微软提供的一款强大的集成开发环境,支持C++语言,...
#### 三十九、体积雾与IPicture图像加载 本章节讲解体积雾技术以及IPicture图像加载方法。 **关键技术**: - **体积雾**:学习如何在OpenGL中实现体积雾效果。 - **IPicture图像加载**:了解IPicture图像文件的...
这是一款Android平台下opengl绘制飘动的国旗效果源码,大家可以下载下来学习学习,希望能给大家带来帮助。 实现步骤 1. 首先确定使用分割法将整张图片分割成若干份,画在一个网格组成的长方形中 2.画出N*N格的...
#### 十三、OpenGL的状态 ##### 13.1、取得OpenGL的当前状态 OpenGL的状态可以通过查询函数如`glGet*`系列函数来获取。 ##### 13.2、设置OpenGL状态 OpenGL的状态可以通过`glEnable()`、`glDisable()`等函数来...
- 创建一个模拟飘动旗帜的动画效果。 - 进一步练习纹理映射和混合技巧。 ##### 关键知识点 - **动态效果**: 实现旗帜随风飘动的效果。 - **动画循环**: 如何循环播放动画。 #### 十三、显示列表 ##### 目标 - 提高...
飘动的旗帜 - **目的**:模拟现实世界的物理效果。 - **重点**:使用纹理映射和混合技术创建动态旗帜。 - **创新**:通过调整参数模拟不同的风力效果。 ##### 12. 显示列表 - **目的**:提高OpenGL程序的运行效率...