《计算机图形学》这门课的第二个实验,觉得还挺有意思的…
实验要求
设计一个OpenGL程序,创建一个三维迷宫,支持替身通过一定交互手段在迷宫中漫游,基本功能包括:
- 迷宫应当至少包含10 * 10 个Cell,不能过于简单,下图给出一种示例。
- 读取给定的替身模型,加载到场景中。
- 键盘方向键控制替身转向与漫游。
- 有碰撞检测,替身不应当穿墙。
- 支持切换第一视角和第三视角进行观察。
- 迷宫场景中的墙、地面等应贴上纹理。
附加要求(可选择一个):
- 同时加入二维辅助地图,替身在三维迷宫探索的同时,在小地图中显示已经探索的区域;(我选的是这一个,其他的由于最近事情比较多就没有做,以后有机会再补吧…如果有机会的话…=。=)
- 在俯视状态下,可以通过鼠标点选替身需要到达的目的地,通过寻径算法,控制替身自动到达目的地;
- 迷宫地图交互编辑功能,例如,可以设计一个二维地图编辑器,根据用户的绘制,拉伸得到三维迷宫场景;
- 其他相当难度,可以增加迷宫游戏趣味性的功能(需要通过指导老师认可)
实现过程
投影模式采用透视投影,第一、三视角之间的切换只需改变gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);
的参数值即可。
main()
方法:
int main(int argc,char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowPosition(300, 50);
glutInitWindowSize(700, 700);
glutCreateWindow("迷宫");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
init()
方法:
void init(){
glClearColor(0.8, 0.8, 0.8, 1);//用灰色清屏
glEnable(GL_DEPTH_TEST);//开启深度测试
glEnable(GL_TEXTURE_2D);//启用二维纹理
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50, 1, 0.5, 100);/*其实一开始ZNear设的是1~*/
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(lookX, lookY, lookZ, centerX,centerY,centerZ,upX,upY,upZ);
glShadeModel(GL_SMOOTH);