计算机图形学之三维迷宫的创建及走迷宫过程中的交互功能的实现

该实验通过OpenGL实现了三维迷宫的创建,并具备交互功能,如视角切换(第一视角、上帝视角)、场景选择(天空、地狱等)、难度调整等。用户可以随机生成新的迷宫,点击迷宫地图实现角色自动行走,旨在提升科研和开发能力。
摘要由CSDN通过智能技术生成

实验要求
了解图形系统的性能, 掌握可交互的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]);
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值