您的位置:首页 > 移动开发

Animation and texture mapping

2014-12-22 23:11 519 查看
在实验二的基础上,增加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();


实验结果







(上图四肢和头部为纹理映射)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐