`
tiankefeng0520
  • 浏览: 143080 次
  • 性别: 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-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_nehe_android_源码

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

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

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

    飘动的红旗 opengl

    opengl opengl homework

    OPENGL教程

    OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

    Android opengl绘制飘动的国旗效果

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

    MyFlag(OpenGl风中的红旗)

    使用OpenGl编写的风中的红旗。可以实现风中的飞舞。 可以使用键盘控制风的方向和风速。

    Nehe的OpenGL教程电子书

    旗帜效果 (飘动的纹理): 这一章教程由Bosco带给你。他就是那个创造了很酷的小Demo: worthless的家伙。他喜欢每个人对他的Demo的反映,并且决定更进一步,在他的Demo的最后解释他怎么实现这么酷的效果的。这一章...

    OpenGL入门学习.pdf

    一、第一个OPENGL程序...................................................................................................................4 1.1、OPENGL的优点.................................................

    OPenGL编程书籍

    11.旗帜效果 (飘动的纹理): 这一章教程由Bosco带给你。他就是那个创造了很酷的小Demo: worthless的家伙。他喜欢每个人对他的Demo的反映,并且决定更进一步,在他的Demo的最后解释他怎么实现这么酷的效果的。这一章...

    Visual C++结合OpenGL做的一个3D场景,包含地形生成,场景漫游,碰撞检测

    其中包含地形生成,场景漫游,碰撞检测,场景中模拟了河流,跳跃的鱼,喷泉,树木,水草,房屋,塔楼,楼梯,飘动的旗帜等等。第一人称视角,可以跳跃行走碰撞检测,模拟了白天黑夜等等!(Visual C++ with OpenGL to...

    NeHe lesson08.

    飘动的旗帜 显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射...

    NeHe lesson10

    飘动的旗帜 显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射...

    图形学实验包括可运行文件,源代码等

    是图形学OPENGL实验的报告,有多视角看物体,视觉漫游,雾化效果,飘动的旗帜

    NeHe lesson06

    飘动的旗帜 显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射...

    NeHe lesson03.

    飘动的旗帜 显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射...

    NeHe lesson05

    飘动的旗帜 显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射...

Global site tag (gtag.js) - Google Analytics