实验要求
了解图形系统的性能, 掌握可交互的OpenGL应用程序的开发设计的方法,掌握系统处理鼠标和键盘事件的编程方法,掌握OpenGL应用程序的拾取机制,掌握并学会利用OpenGL开发场景漫游程序的编程方法,掌握并学会利用OpenGL纹理映射的方法。 在实践开发过程中,培养科研的钻研能力和综合开发能力。
熟练运用OpenGL的相关函数和辅助函数,了解MD2三维模型的文件格式,熟悉并学会读取模型、加载到场景中的方法.
实验结果
初始界面(菜鸟难度,默认场景,上帝视角)
右击弹出框选择
包括
- 视角(第一视角、上帝视角)
- 场景(默认场景、天空场景、地狱场景、海底场景、森林场景)
- 难度(菜鸟难度、新手难度、简单难度、普通难度、困难难度、地狱难度)
- 迷宫随机生成
第一视角
地狱场景
地狱难度
点击迷宫随机生成按钮可以重新生成一个新的迷宫。
点击迷宫中的具体位置可实现人物的自动行走
以下为主要代码,完整代码请下载资源
//将当前位置周围的墙存入到posMaze中
void savePosMaze() {
int maze_posX = (position_z + 5) / wall_size;
int maze_posY = (position_x + 5) / wall_size;
if (maze_posX - 1 >= 0 && maze_posY - 1 >= 0 && maze_posX - 1 < MAZE_SIZE && maze_posY - 1 < MAZE_SIZE)
if (maze[maze_posX - 1][maze_posY - 1] == 1)
posMaze[maze_posX - 1][maze_posY - 1] = 1;
if (maze_posX + 1 >= 0 && maze_posY - 1 >= 0 && maze_posX + 1 < MAZE_SIZE && maze_posY - 1 < MAZE_SIZE)
if (maze[maze_posX + 1][maze_posY - 1] == 1)
posMaze[maze_posX + 1][maze_posY - 1] = 1;
if (maze_posX + 1 >= 0 && maze_posY >= 0 && maze_posX + 1 < MAZE_SIZE && maze_posY < MAZE_SIZE)
if (maze[maze_posX + 1][maze_posY] == 1)
posMaze[maze_posX + 1][maze_posY] = 1;
if (maze_posX + 1 >= 0 && maze_posY + 1 >= 0 && maze_posX + 1 < MAZE_SIZE && maze_posY + 1 < MAZE_SIZE)
if (maze[maze_posX + 1][maze_posY + 1] == 1)
posMaze[maze_posX + 1][maze_posY + 1] = 1;
if (maze_posX >= 0 && maze_posY - 1 >= 0 && maze_posX < MAZE_SIZE && maze_posY - 1 < MAZE_SIZE)
if (maze[maze_posX][maze_posY - 1] == 1)
posMaze[maze_posX][maze_posY - 1] = 1;
if (maze_posX >= 0 && maze_posY + 1 >= 0 && maze_posX < MAZE_SIZE && maze_posY + 1 < MAZE_SIZE)
if (maze[maze_posX][maze_posY + 1] == 1)
posMaze[maze_posX][maze_posY + 1] = 1;
if (maze_posX - 1 >= 0 && maze_posY >= 0 && maze_posX - 1 < MAZE_SIZE && maze_posY < MAZE_SIZE)
if (maze[maze_posX - 1][maze_posY] == 1)
posMaze[maze_posX - 1][maze_posY] = 1;
if (maze_posX - 1 >= 0 && maze_posY + 1 >= 0 && maze_posX - 1 < MAZE_SIZE && maze_posY + 1 < MAZE_SIZE)
if (maze[maze_posX - 1][maze_posY + 1] == 1)
posMaze[maze_posX - 1][maze_posY + 1] = 1;
}
//将视角与当前位置对应
void setLookEye() {
look_x = position_x + distant * cos(angle);
look_z = position_z - distant * sin(angle);
eye_x = position_x - distant * cos(angle);
eye_z = position_z + distant * sin(angle);
}
//画地面
void drawGround() {
glPushMatrix();
// 选择第二个纹理texture[1],进行贴纹理
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
//左上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-wall_size / 2, -wall_size / 2, -wall_size / 2);
//右上
glTexCoord2f(1.0f, 1.0f); glVertex3f(-wall_size / 2, -wall_size / 2, wall_size*MAZE_SIZE - wall_size / 2);
//右下
glTexCoord2f(1.0f, 0.0f); glVertex3f(wall_size*MAZE_SIZE - wall_size / 2, -wall_size / 2, wall_size*MAZE_SIZE - wall_size / 2);
//左下
glTexCoord2f(0.0f, 0.0f); glVertex3f(wall_size*MAZE_SIZE - wall_size / 2, -wall_size / 2, -wall_size / 2);
glEnd();
glPopMatrix();
}
//画墙
void drawWall(float x, float y, float z)
{
wall[0][0] = -x / 2; wall[0][1] = y / 2; wall[0][2] = -z / 2;
wall[1][0] = -x / 2; wall[1][1] = -y / 2; wall[1][2] = -z / 2;
wall[2][0] = x / 2; wall[2][1] = -y / 2; wall[2][2] = -z / 2;
wall[3][0] = x / 2; wall[3][1] = y / 2; wall[3][2] = -z / 2;
wall[4][0] = -x / 2; wall[4][1] = y / 2; wall[4][2] = z / 2;
wall[5][0] = -x / 2; wall[5][1] = -y / 2; wall[5][2] = z / 2;
wall[6][0] = x / 2; wall[6][1] = -y / 2; wall[6][2] = z / 2;
wall[7][0] = x / 2; wall[7][1] = y / 2; wall[7][2] = z / 2;
// 选择第一个纹理texture[0],进行贴纹理
//法向量指向-z方向的正方形
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_POLYGON);
glNormal3f(0.0f, 0.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(wall[0]);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(wall[1]);