在实验二的基础上,增加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次方大小,只有满足这个条件,这个纹理图片才是有效的。
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来设置纹理滤镜。如:
要使用当前的纹理绘制图元,我们必须在绘制每个顶点之前为该顶点指定纹理坐标。只需调用
试验中我采用二次几何体,可调用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();
实验结果
(上图四肢和头部为纹理映射)