Animation and texture mapping

在实验二的基础上,增加Animation 和 texture mapping,实验实现如下:

1. Animation

将旋转,平移的参数设置为变量,每次变化调用glutPostRedisplay();进行重画,实现连续的变化。

void shoulderdisplay(){
	shoulder2 = (shoulder2 + shoulder2f);
	if (shoulder2>80)
		shoulder2f = -shoulder2f;
	if (shoulder2<-60)
		shoulder2f = -shoulder2f;
	elbow = elbow + 0.1;
	shoulder1 = (shoulder1 + shoulder1f);
	if (shoulder1>80)
		shoulder1f = -shoulder1f;
	if (shoulder1<-60)
		shoulder1f = -shoulder1f;
	leg1 = (leg1 + leg1f);
	if (leg1>80)
		leg1f = -leg1f;
	if (leg1<-20)
		leg1f = -leg1f;
	leg2 = (leg2 - leg2f);
	if (leg2>80)
		leg2f = -leg2f;
	if (leg2<-20)
		leg2f = -leg2f;
	glutPostRedisplay();
}
将参数变量进行如上设置,并通过鼠标监听进行启动animation,实现图形关节的转动。

void mouse(int button,int state,int x,int y){
	switch (button){
	case GLUT_LEFT_BUTTON:
		if (state == GLUT_DOWN)
			glutIdleFunc(shoulderdisplay);
		break;
	case GLUT_MIDDLE_BUTTON:
		if (state = GLUT_DOWN)
			glutIdleFunc(NULL);
		break;
	default:
		break;

	}
}
2. texture mapping

OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这个条件,这个纹理图片才是有效的。   一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生成一个纹理贴图:
   glBindTexture(GL_TEXTURE_2D,Texture);
   glTexImage2D(GL_TEXTURE_2D,0,3,Bit.Width,Bit.Height,0,GL_RGB,GL_UNSIGNED_BYTE,Pixels);

glBindTexture函数用于创建和绑定纹理对象,glTexImage2D函数将Pixels数组中的像素值传给当前绑定的纹理对象,于是便创建了纹理。glTexImage函数的参数分别是纹理的类型,纹理的等级,每个像素的字节数,纹理图像的宽度和高度,边框大小,像素数据的格式,像素值的数据类型,像素数据。

试验中我通过makeImage方法制作一张纹理图片:

 void makeImage(void)
 {
	 int i, j, c;
	 for (i = 0; i < imageWidth; i++)
	 {
		 for (j = 0; j <imageHeight; j++)
		 {
			 c = (((i & 0x8) == 0) ^ ((j & 0x8)) == 0) * 255;
			 image[i][j][0] = (GLubyte)c;
			 image[i][j][1] = (GLubyte)c;
			 image[i][j][2] = (GLubyte)c;
			 image[i][j][3] = (GLubyte)255;
		 }
	 }
 }
调用glTexParameter来设置纹理滤镜。如:

   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILETER,MagFilter);//设置放大滤镜
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, MinFilter); //设置缩小滤镜

要使用当前的纹理绘制图元,我们必须在绘制每个顶点之前为该顶点指定纹理坐标。只需调用

 glTexCoord2d(s:Double;t:Double);

试验中我采用二次几何体,可调用gluQuadricTexture(quadratic, GL_TRUE);为所画图元添加纹理。

glPushMatrix();
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, testname);
	glTranslatef(0.0, 0.8, 0.0);//反复调试
	glRotatef(0.0, 0.0, 1.0, 0.0);
	//GLUquadricObj* qObj = gluNewQuadric();
	gluQuadricTexture(quadratic, GL_TRUE);
	gluSphere(quadratic, 0.3f, 20, 20);
glPopMatrix();

实验结果

               


               


                        

                                    (上图四肢和头部为纹理映射)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值