1.实验要求:
用OpenGL和C语言编写一个带纹理和材质的一个立方体的交互式程序。
1)要求生成一个在立方体,并在立方体的六个面上并分别实现不同的纹理映射和材质。纹理的类型为BMP图片纹理,材质类型可以自己设计。例如,三个面上实现纹理映射的头像和生活照,另外三个面上实现材质(金属、塑料等)。
2)可以利用鼠标和键盘进行交互,实现该立方体的旋转、平移和缩放。
2.实验效果图如下:
正常情况下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191227125247163.png)
加入材质后
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191227125324326.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI0NDE1NA==,size_16,color_FFFFFF,t_70)
取消纹理后
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191227125426117.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI0NDE1NA==,size_16,color_FFFFFF,t_70)
线框图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191227125512399.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI0NDE1NA==,size_16,color_FFFFFF,t_70)
3.部分核心代码附录如下:(需配置opengl环境)另外,所加入的纹理照片必须为bmp格式,命名分别为1 2 3即可
GLfloat xrot;
GLfloat yrot;
GLfloat zrot;
float tx=0;
float ty=0;
float sf=0;
float M_PI=3.14159265f;
static float c = M_PI/180.0f;
static int du = 90, oldmy = -1, oldmx = -1;
static float r = 1.75f, h = 0.0f;
float cameraDistance;
void Mouse(int button, int state, int x, int y)
{
if (state == GLUT_DOWN)
oldmx = x, oldmy = y;
}
void onMouseMove(int x, int y)
{
du += x - oldmx;
h += (y - oldmy);
oldmx = x, oldmy = y;
glutPostRedisplay();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f+tx,0.0f+ty,-4.0f);
glScalef(1+sf,1+sf,1+sf);
glRotatef(xrot, 1.0f, 0.0f, 0.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
glRotatef(zrot, 0.0f, 0.0f, 1.0f);
glRotatef(30*c*du, 0.0f, 1.0f, 0.0f);
glRotatef(-h, -1.0f, 0.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, tex1);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, tex2);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, tex3);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
glutSwapBuffers();
}
void reshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-5.0, 5.0, -5.0*(GLfloat)h / (GLfloat)w, 5.0*(GLfloat)h / (GLfloat)w, -5.0, 5.0);
else
glOrtho(-5.0*(GLfloat)w / (GLfloat)h, 5.0*(GLfloat)w / (GLfloat)h, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 'd':
xrot += 3.0f;
glutPostRedisplay();
break;
case 's':
yrot += 3.0f;
glutPostRedisplay();
break;
case 'a':
zrot += 3.0f;
glutPostRedisplay();
break;
case '1':
sf+=0.1;
glutPostRedisplay();
break;
case '2':
sf-=0.1;
break;
case '3':
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
break;
case '4':
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
break;
case '5':
glEnable(GL_LIGHTING);
break;
case '6':
glDisable(GL_LIGHTING);
break;
case '8':
glDisable(GL_TEXTURE_2D);
break;
case '7':
glEnable(GL_TEXTURE_2D);
break;
default:
break;
}
glutPostRedisplay();
}
void specialKeyboard(int key,int x,int y)
{
if(key == GLUT_KEY_UP )
ty+=0.1;
if(key == GLUT_KEY_DOWN)
ty-=0.1;
if(key ==GLUT_KEY_LEFT)
tx-=0.1;
if(key==GLUT_KEY_RIGHT)
tx+=0.1;
glutPostRedisplay();
}
4.程序说明
上下左右键以及鼠标可以控制图形移动
按asd可以控制图形旋转
按1可以控制图形放大,2控制图形缩小
3显示线框模型 4显示实体模型
5添加光照 6取消光照
7添加纹理映射 8取消纹理映射
完整代码获取请添加QQ 1173953942
回复 立方体即可