`
tiankefeng0520
  • 浏览: 146741 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习三十九:飘动的旗帜

 
阅读更多

(此节内容对应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();
}

 

分享到:
评论

相关推荐

    【Qt OpenGL教程】11:旗帜效果(飘动的纹理)源码

    整个工程文件。别的文章都只是复制的代码,但是整个工程的建立,头文件和pro文件的很多参数都需要设置。很麻烦。所以特意将工程文件分享给大家。

    OpenGL实现飘动效果

    OpenGL是一种强大的图形库,用于在各种操作系统和硬件平台上创建2D和3D图像。它提供了一种编程语言接口,让开发者能够控制图形...这个项目提供了学习和实践OpenGL动画技巧的机会,同时加深了对图形学和物理模拟的理解。

    图形学大作业-opengl实现飘动的旗帜粒子系统.zip

    在本项目中,"图形学大作业-opengl实现飘动的旗帜粒子系统.zip"是一个基于OpenGL的编程作业,目标是创建一个逼真的飘动旗帜的粒子系统。OpenGL是一种跨语言、跨平台的图形库,广泛用于渲染2D、3D矢量图形。此项目将...

    飘动的旗帜,包括源代码,可直接运行

    标题中的“飘动的旗帜”指的是一个使用OpenGL技术制作的3D模拟动态旗帜的程序。OpenGL,全称Open Graphics Library,是一种跨语言、跨平台的应用程序编程接口(API),主要用于渲染2D、3D矢量图形。这个项目可能是...

    opengles特效之飘扬的旗帜

    在"opengles特效之飘扬的旗帜"这个主题中,我们将探讨如何利用OpenGL ES实现逼真的旗帜飘动效果。 在移动设备上创建动态的旗帜效果,首先需要理解基本的图形学概念,包括顶点、纹理、着色器和帧缓冲。顶点是构成...

    飘动的红旗 opengl

    这个“飘动的红旗 OpenGL”项目可能是一个使用OpenGL来模拟红旗飘动效果的作业或示例。在OpenGL中实现这样的效果,涉及到的关键知识点包括: 1. **OpenGL基础知识**:首先,理解OpenGL的基础架构是至关重要的,包括...

    OpenGL-11飘扬的旗帜

    代码是整套的基于MFC的Opengl开发的源码程序

    学习OpenGL必备教程nehe_opengl_chs.chm & 全部课程的源程序

    01:OpenGL窗口 02:多边形 03:添加颜色 04:旋转 05:3D空间 06:纹理映射 07:光照和键盘 08:混合 09:移动图像 10:3D世界 11:飘动的旗帜 12:显示列表 13:图像字体 14:图形字体 15:纹理图形字 16:雾 17:...

    OPENGL教程

    在学习OpenGL的过程中,还会了解到OpenGL的版本信息,包括如何检查当前系统支持的OpenGL版本,以及如何使用和获取新版本的OpenGL。Khronos Group还会发布一些扩展,它们允许开发者使用一些新的API函数,以达到使用...

    Nehe第11课飘动的旗帜

    "Nehe第11课飘动的旗帜"是学习OpenGL编程的一个经典教程,主要讲解了如何在三维空间中实现纹理映射和混合操作,来创建逼真的飘动旗帜效果。这个教程适合对计算机图形学有一定基础,特别是对OpenGL有一定了解的学习者...

    opengl_nehe_android_源码

    包括:01: Hello OpenGL,02: 多边形,03: 颜色,04: 旋转,05: 3D 空间,06: 纹理映射,07: 光照,08: 混合,09: 移动图像,10: 加载模型,11: 飘动的旗帜,16: 雾!,18: 二次几何体,19: 粒子系统 (GPU),19: ...

    NeHe OpenGL教程

    - **飘动的旗帜**:教程演示了如何利用纹理映射和混合技术创建动态的飘动旗帜效果,提升了场景的生动性。 - **显示列表**:为了加速OpenGL程序的运行,教程介绍了显示列表的使用方法,通过预编译OpenGL命令,减少了...

    基于VC++环境下的图形学编程,阴暗实体,飘动的旗帜

    在这个主题中,我们将深入探讨如何在Visual C++(简称VC++)环境下进行图形学编程,特别是涉及阴暗实体和飘动的旗帜这两部分。 1. **VC++环境搭建**:Visual C++是微软提供的一款强大的集成开发环境,支持C++语言,...

    NeHe OPenGL 英文教程

    #### 三十九、体积雾与IPicture图像加载 本章节讲解体积雾技术以及IPicture图像加载方法。 **关键技术**: - **体积雾**:学习如何在OpenGL中实现体积雾效果。 - **IPicture图像加载**:了解IPicture图像文件的...

    Android opengl绘制飘动的国旗效果

    这是一款Android平台下opengl绘制飘动的国旗效果源码,大家可以下载下来学习学习,希望能给大家带来帮助。 实现步骤 1. 首先确定使用分割法将整张图片分割成若干份,画在一个网格组成的长方形中 2.画出N*N格的...

    OpenGL入门学习.pdf

    #### 十三、OpenGL的状态 ##### 13.1、取得OpenGL的当前状态 OpenGL的状态可以通过查询函数如`glGet*`系列函数来获取。 ##### 13.2、设置OpenGL状态 OpenGL的状态可以通过`glEnable()`、`glDisable()`等函数来...

    OpenGL教程Nehe版-中文版

    - 创建一个模拟飘动旗帜的动画效果。 - 进一步练习纹理映射和混合技巧。 ##### 关键知识点 - **动态效果**: 实现旗帜随风飘动的效果。 - **动画循环**: 如何循环播放动画。 #### 十三、显示列表 ##### 目标 - 提高...

    OpenGL NeHe教程,学习OpenGL的最佳教程

    飘动的旗帜 - **目的**:模拟现实世界的物理效果。 - **重点**:使用纹理映射和混合技术创建动态旗帜。 - **创新**:通过调整参数模拟不同的风力效果。 ##### 12. 显示列表 - **目的**:提高OpenGL程序的运行效率...

Global site tag (gtag.js) - Google Analytics