小杂程序(给自己看的)

#include<GL/glut.h>
#include <math.h>
#include "FreeImage.h"
float  angle=0.0;
float  angle1=0.0;
float r=0.0;
float xrot;
float yrot;
float zrot;
int wiggle_count=0;
float hold;
const char BACKWARD_STATE=1;
const char FORWARD_STATE=0;
const char LEFT=0;
const char RIGHT=1;
float points[45][45][3];
char legStates[2];
char armStates[2];
float Armangle[2];
float Legangle[2];
char* bmpfile[1]=//{("Data/Particle.bmp")};  
{  
	"H:\\program\\1\\Data\\2.jpg"  
};  
GLuint texture[1];
GLenum image_format = GL_BGR_EXT;        //format the image is in  
GLint internal_format = GL_RGB;        //format to store the image in  
GLint level = 0;                   //mipmapping level  
GLint border = 0;  
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;  
FIBITMAP *dib(0);  
BYTE* bits(0);  
unsigned char *imageData;  
unsigned int width(0), height(0);  

//加载图片
bool LoadImage(const char *filename)
{
#ifdef FREEIMAGE_LIB  
	FreeImage_Initalise();  
#endif  
	FIBITMAP *dib(0);  

	fif = FreeImage_GetFileType(filename, 0);  
	if(fif == FIF_UNKNOWN)   
		fif = FreeImage_GetFIFFromFilename(filename);  

	if(fif == FIF_UNKNOWN)  
		return false;  


	if(FreeImage_FIFSupportsReading(fif))  
		dib = FreeImage_Load(fif, filename);  

	if(!dib)  
		return false;  
	bool flipResult = FreeImage_FlipVertical(dib);  
	dib = FreeImage_ConvertTo24Bits(dib);  
	imageData = (unsigned char *)FreeImage_GetBits(dib);//获取图像位信息;  
	/*bits = FreeImage_GetBits(dib);*/  

	 width = FreeImage_GetWidth(dib);  
	 height = FreeImage_GetHeight(dib);  
	int p=FreeImage_GetBPP(dib);  

	if((imageData == 0) || (width == 0) || (height == 0))  
		return false;  
}
bool init(void)
{
	
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_SMOOTH);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_TEXTURE_2D);
	//Robot的初始化
	Armangle[LEFT] = 0.0;
	Armangle[RIGHT] = 0.0;
	Legangle[LEFT] = 0.0;
	Legangle[RIGHT] = 0.0;

	armStates[LEFT] = FORWARD_STATE;
	armStates[RIGHT] = BACKWARD_STATE;

	legStates[LEFT] = FORWARD_STATE;
	legStates[RIGHT] = BACKWARD_STATE;
	//飘动图片的初始化
	if(!LoadImage(bmpfile[0]))  
	{  
		return false;  
	}  
	glGenTextures(1,&texture[0]);  
	glBindTexture(GL_TEXTURE_2D,texture[0]);  
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);  
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);  
	glTexImage2D(GL_TEXTURE_2D, level, internal_format, width, height,border, image_format, GL_UNSIGNED_BYTE, imageData);  
	glPolygonMode(GL_BACK,GL_FILL);
	glPolygonMode(GL_FRONT,GL_LINEAR);
	for (int x=0;x<45;x++)
		for(int y=0;y<45;y++)
		{
			points[x][y][0]=float ((x/5.0)-4.5);
			points[x][y][1]=float ((y/5.0)-4.5);
			points[x][y][2]=float(sin((((x/5.0f)*40.0f)/360.0f)*3.141592654*2.0f));

		}
	return true;  
}
void DrawGround()
{
	float fExtent=20;
	float fStep=1.0f;
	float z=-0.0f;
	glBegin(GL_LINES);
	glColor3f(1.0,1.0,1.0);
	for(int i=-fExtent;i<=fExtent;i+=fStep)
	{
		glVertex3f(i,fExtent,z);
		glVertex3f(i,-fExtent,z);

		glVertex3f(fExtent,i,z);
		glVertex3f(-fExtent,i,z);

	}
	glEnd();
}
void Float_Flag()
{
	float float_x,float_y,float_xb,float_yb;
	glTranslatef(0.0f,0.0f,0.0f);				// 移入屏幕12个单位

	glRotatef(xrot,1.0f,0.0f,0.0f);				// 绕 X 轴旋转
	glRotatef(yrot,0.0f,1.0f,0.0f);				// 绕 Y 轴旋转
	glRotatef(zrot,0.0f,0.0f,1.0f);				// 绕 Z 轴旋转
	glEnable(GL_TEXTURE_2D);
	//glGenTextures(1,&texture[0]);
	glBindTexture(GL_TEXTURE_2D, texture[0]);		// 选择纹理
	glBegin(GL_QUADS);	
	// 四边形绘制开始
	for(int  x = 0; x < 44; x++ )				// 沿 X 平面 0-44 循环(45点)
	{
		for( int y = 0; y < 44; y++ )			// 沿 Y 平面 0-44 循环(45点)
		{
			float_x = float(x)/44.0f;		// 生成X浮点值
			float_y = float(y)/44.0f;		// 生成Y浮点值
			float_xb = float(x+1)/44.0f;		// X浮点值+0.0227f
			float_yb = float(y+1)/44.0f;		// Y浮点值+0.0227f
			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();						// 四边形绘制结束

    }
void Airplane()
{
	glPushMatrix();
	glTranslatef(-5,0,0);
	glRotatef(-r,0.0,1.0,0.0);
	glColor3f(1.0,0.0,1.0);
	glScalef(0.1,0.3,0.05);
	glutSolidCube(16);
	glTranslatef(0.0,1.0,0.5);
	glutSolidSphere(1,15,15);
	glPopMatrix();
}
void Sun()
{
	float mat_specular[]={1.0,1.0,1.0,1.0};
	float mat_shininess[]={50.0};
	float light_position[]={10.0,10.0,10.0,0.0};
	float white_light[]={10.0,10.0,10.0,1.0};
	float lmodel_ambient[]={0.1,0.1,0.1,1.0};
	glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
	glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
	glLightfv(GL_LIGHT1,GL_POSITION,light_position);
	glLightfv(GL_LIGHT1,GL_DIFFUSE,white_light);
	glLightfv(GL_LIGHT1,GL_SPECULAR,white_light);
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glPushMatrix();
	glColor3f(1.0,0.0,1.0);
	glTranslated(0.0,0.0,0.0);
	glutSolidSphere(2,40,32);
	glPopMatrix();

	glPushMatrix();
	glColor3f(1.0,0.0,0.0);
	glRotatef(angle,0.0,1.0,0.0);
	glTranslated(5.0,0.0,0.0);
	glutSolidSphere(0.5,40,32);
	glColor3f(1.0,1.0,0.0);
	glRotatef(angle1,0.0,1.0,0.0);
	glTranslated(1.0,0.0,0.0);
	glutSolidSphere(0.1,40,32);
	glPopMatrix();
}
void DrawHead(float x,float y,float z)
{
	glPushMatrix();	
	glTranslatef(x,y,z);
	glColor3f(0.0,1.0,1.0);
	glScalef(2.0,2.0,1.0);
	glutSolidCube(1.0);
	glPopMatrix();
}
void DrawTorso(float x,float y,float z)
{
	glPushMatrix();	
	glTranslatef(x,y,z);
	glColor3f(0.0,0.8,0.6);
	glScalef(3,4,1.0);
	glutSolidCube(1.0);
	glPopMatrix();
}
void DrawArm(float x,float y,float z)
{
	glPushMatrix();
	glColor3f(1.0,0.0,0.0);
	glTranslatef(x,y,z);
	glScalef(1,2.5,1.0);
	glutSolidCube(1.0);
	glPopMatrix();
}
void DrawLeg(float x,float y,float z)
{
	glPushMatrix();
	glColor3f(1.0,0.0,1.0);
	glTranslatef(x,y,z);
	glScalef(0.5,5,1.0);
	glutSolidCube(1.0);
	glPopMatrix();
}
void Robot(float xPos,float yPos,float zPos)
{
glPushMatrix();
	glTranslatef(xPos,yPos,zPos);

	
	//DrawTorso(1.0,-1,0.0);

	glPushMatrix();	
	 // DrawTorso(1.0,-1,0.0);
	  glTranslatef(0.0,-2.5,0.0);
	  glRotatef(Legangle[LEFT],0.0,1.0,0.0);
	  DrawHead(1.0,5.0,0.0);
	  DrawTorso(1.0,2,0.0);
	  DrawLeg(0.0,-3,0);
	glPopMatrix();

	glPushMatrix();	
	  glTranslatef(0.0,-2.5,0.0);
	glRotatef(Legangle[RIGHT],0.0,1.0,0.0);
	  DrawLeg(2.0,-3,0);
	glPopMatrix();
	
	/*glPushMatrix();	
	glTranslatef(-1.0,2,0.0);
	glRotatef(Armangle[LEFT],1.0,0.0,0.0);
	DrawArm(0.0,-3,0);
	glPopMatrix();
	glPopMatrix();

	glPushMatrix();	
	glTranslatef(3.0,1,0.0);
	glRotatef(Armangle[RIGHT],1.0,0.0,0.0);
	DrawArm(0.0,0.0,0);
	glPopMatrix();*/
glPopMatrix();
}
void display()
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	//DrawGround();
	//Airplane();
	//Sun();
	//Robot(0.0,2.0,0.0);
	Float_Flag();
	glutSwapBuffers();
}
void idle()
{
	/*angle+=1;
	if(angle>360)
	{
	angle=0;
	}
	angle1+=2;
	if(angle1>360)
	{
	angle1=0;
	}
	r+=2;
	if(r>360)
	{
	r=0;
	}*/
	float dt=0.1;
	
	for(int side=0;side<2;++side)
	{   //臂摆动
		if(armStates[side]==FORWARD_STATE)
			Armangle[side]+=20*dt;
		else 
			Armangle[side]-=20*dt;

		if(Armangle[side]>=15.0)
			armStates[side]=BACKWARD_STATE;
		else if (armStates[side]<-15.0)
			armStates[side]=FORWARD_STATE;
		//腿摆动
		if(legStates[side]==FORWARD_STATE)
			Legangle[side]+=20*dt;
		else 
			Legangle[side]-=20*dt;

		if(Legangle[side]>=15.0)
			legStates[side]=BACKWARD_STATE;
		else if (legStates[side]<-15.0)
			legStates[side]=FORWARD_STATE;
	}
	//FLAG
	if( wiggle_count == 2 )					// 用来降低波浪速度(每隔2帧一次)
	{
		for( int y = 0; y < 45; y++ )			// 沿Y平面循环
		{
			hold=points[0][y][2];			// 存储当前左侧波浪值
			for( int x = 0; x < 44; x++)		// 沿X平面循环
			{
				// 当前波浪值等于其右侧的波浪值
				points[x][y][2] = points[x+1][y][2];
			}
			points[44][y][2]=hold;			// 刚才的值成为最左侧的波浪值
		}
		wiggle_count = 0;				// 计数器清零
	}
	wiggle_count++;						// 计数器加一
	xrot+=0.3f;						// X 轴旋转
	yrot+=0.2f;						// Y 轴旋转
	zrot+=0.4f;						// Z 轴旋转
	display();
	Sleep(30);
  }
void reshape(int w,int h)
{ 
	glViewport(0,0,(int)w,(int)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	float ratio=w/h;
	if(w<=h)
		glOrtho(-10,10,-10*(float)h/(float)w,10*(float)h/(float)w,-10.0,10.0);
	else
		glOrtho(-10*(float)w/(float)h,10*(float)w/(float)h,-10,10,-10.0,10.0);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(100,100);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutIdleFunc(idle);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值