首先给出绘制效果图:
说明:
本系统绘制了一个真实感的三维场景,并实现场景漫游。使用按键↑、↓、←、→或W、S、A、D控制运动方向,PgDn和PgUp可以改变观察者的高度,鼠标控制转向,按键‘F’可以打开和关闭“雾气”,Esc退出程序。
本场景中绘制了墙壁与地面、天空、石柱、箱子、玻璃球、雪人、雾等对象,下面将依次分析它们的设计思路,这里将使用相同绘制技术的对象放到一起说明。
1、 墙壁、地面、箱子
它们的基本操作对四边形的纹理映射,将一幅纹理图的四个顶点坐标分别映射到四边形的四个顶点上即可。OpenGL就自动通过插值填充多边形内部的纹理。由于在OpenGL中纹理坐标是一个点的属性,故需要在绘制点之前指定该点的纹理坐标。另外在绘制四边形时要保证绘制顺序的一致,这里统一采用逆时针顺序绘制。纹理坐标范围在[0,1]之间,坐标超过1则采用重复的方式(OpenGL默认处理方式)。这样可以在映射时按四边形的比例设置纹理坐标,从而防止纹理图过度拉伸造成的变形。一个四边形的纹理映射步骤为:
glBindTexture(GL_TEXTURE_2D,texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(30.0f,0.0f, -170.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(30.0f,0.0f, -150.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(30.0f,20.0f,-150.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(30.0f,20.0f,-170.0f);
glEnd();
实验效果如下: