计算机图形学实验————漫游三维迷宫

(我们方向课的实验,发出来跟大家交流下)设计一个OpenGL程序,创建一个三维迷宫,支持替身通过一定交互手段在迷宫中漫游。 基本功能包括:  1、 迷宫应当至少包含10 * 10 个Cell,不能过于简单,下图给出一种示例。  2、 读取给定的替身模型,加载到场景中。  3、 键盘方向键控制替身转向与漫游。  4、 有碰撞检测,替身不应当穿墙。  5、 支持切换第一视角
摘要由CSDN通过智能技术生成

(我们方向课的实验,发出来跟大家交流下)

设计一个OpenGL程序,创建一个三维迷宫,支持替身通过一定交互手段在迷宫中漫游。

基本功能包括: 

1、 迷宫应当至少包含10 * 10 个Cell,不能过于简单,下图给出一种示例。 

2、 读取给定的替身模型,加载到场景中。 

3、 键盘方向键控制替身转向与漫游。 

4、 有碰撞检测,替身不应当穿墙。 

5、 支持切换第一视角和第三视角进行观察。 

6、 迷宫场景中的墙、地面等应贴上纹理。 

扩展功能包括(至少选择一个): 

1. 同时加入二维辅助地图,替身在三维迷宫探索的同时,在小地图中显示已经探索的区域;(本文实际选择)

2. 在俯视状态下,可以通过鼠标点选替身需要到达的目的地,通过寻径算法,控制替身自 动到达目的地; 

3. 迷宫地图交互编辑功能,例如,可以设计一个二维地图编辑器,根据用户的绘制,拉伸 得到三维迷宫场景; 

4. 其他相当难度,可以增加迷宫游戏趣味性的功能(需要通过指导老师认可) 

完成一份实验报告,说明你所实现的一个扩展功能。

下面放一下主要代码

main.cpp

#include <windows.h>  
#include <GL/glu.h>  
#include <GL/gl.h>  
#include <GL/glut.h>  
#include <math.h>   
#include <stdio.h>  
#include<iostream>
#include <ctime>
#include <cstdlib>
#include "MD2Model.h"

using namespace std;
float Cx = 0;
float Cy = 0;
float Cz = 0; //球的初始位置

int isWall[20][20];

int x1 = Cx;
int Y1 = 0;
int z1 = Cz;

int x2 = Cx;
int y2 = 0;
int z2 = 100;

int x3 = 0;
int y3 = 1;
int z3 = 0;//改变视角后的参数

int hit = 0;
int direction = 0;
void GL_display();



GLuint texWall;

static GLint imagewidth;
static GLint imageheight;
static GLint pixellength;
static GLubyte* pixeldata;


void loadTexture(char* filename){
	FILE* pfile = fopen(filename, "rb");
	if (pfile == 0){
		cout << "can not open" << filename << endl;
	}
	//读取图像大小
	fseek(pfile, 0x0012, SEEK_SET);
	fread(&imagewidth, sizeof(imagewidth), 1, pfile);
	fread(&imageheight, sizeof(imageheight), 1, pfile);
	//计算像素数据长度
	pixellength = imagewidth * 3;
	while (pixellength % 4 != 0)pixellength++;
	pixellength *= imageheight;
	//读取像素数据
	pixeldata = (GLubyte*)malloc(pixellength);

	if (pixeldata == 0) exit(0);
	fseek(pfile, 54, SEEK_SET);
	fread(pixeldata, pixellength, 1, pfile);

	glGenTextures(1, &texWall);
	glBindTexture(GL_TEXTURE_2D, texWall);

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);


	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imagewidth, imageheight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixeldata);
	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}

CMD2Model Ogro;
//模型对象 
//从模型文件装入模型数据  
void drawsolider(float x, float y, float z){
	glPushMatrix();
	glTranslatef(x, y, z);
	glRotatef(90,1, 0, 0);
	Ogro.loadModel("models/tris.md2");
	//装入模型纹理  
	Ogro.loadSkin("wall.bmp");
	//设置模型动作  
	Ogro.setAnim(0);
	//设置模型比例  
	Ogro.scaleModel(0.25);
	//绘制模型  
	Ogro.drawModel(0.0);
	glPopMatrix();
}

void drawWall(int x, int y, int z){
	glPushMatrix();
	//画立方体的6个面    
	glBindTexture(GL_TEXTURE_2D, texWall);
	glBegin(GL_QUADS);
	glNormal3f(0.0F, 0.0F, 1.0F);
	glTexCoord2f(0.0, 0.0);
	glVertex3f(5 + x, 5 + y, 5 + z);
	glTexCoord2f(0.0, 1.0);
	glVertex3f(-5 + x, 5 + y, 5 + z);
	glTexCoord2f(1.0, 1.0);
	glVertex3f(-5 + x, -5 + y, 5 + z);
	glTexCoord2f(1.0, 0.0);
	glVertex3f(5 + x, -5 + y, 5 + z);
	glEnd();
	//1----------------------------    
	glBegin(GL_QUADS);
	glNormal3f(0.0F, 0.0F, -1.0F);
	glTexCoord2f(0.0, 0.0);
	glVertex3f(-5 + x, -5 + y, -5 + z);
	glTexCoord2f(0.0, 1.0);
	glVertex3f(-5 + x, 5 + y, -5 + z);
	glTexCoord2f(1.0, 1.0);
	glVertex3f(5 + x, 5 + y, -5 + z);
	glTexCoord2f(1.0, 0.0);
	glVertex3f(5 + x, -5 + y, -5 + z);
	glEnd();
	//2----------------------------    
	glBegin(GL_QUADS);
	glNormal3f(0.0F, 1.0F, 0.0F);
	glTexCoord2f(0.0, 0.0);
	glVertex3f(5 + x, 5 + y, 5 + z);
	glTexCoord2f(0.0, 1.0);
	glVertex3f(5 + x, 5 + y, -5 + z);
	glTexCoord2f(1.0, 1.0);
	glVertex3f(-5 + x, 5 + y, -5 + z);
	glTexCoord2f(1.0, 0.0);
	glVertex3f(-5 + x, 5 + y, 5 + z);
	glEnd();
	//3----------------------------    
	glBegin(GL_QUADS);
	glNormal3f(0.0F, -1.0F, 0.0F);
	glTexCoord2f(0.0, 0.0);
	glVertex3f(-5 + x, -5 + y, -5 + z);
	glTexCoord2f(0.0, 1.0);
	glVertex3f(5 + x, -5 + y, -5 + z);
	glTexCoord2f(1.0, 1.0);
	glVertex3f(5 + x, -5 + y, 5 + z);
	glTexCoord2f(1.0, 0.0);
	glVertex3f(-5 + x, -5 + y, 5 + z);
	glEnd();
	//4----------------------------    
	glBegin(GL_QUADS);
	glNormal3f(1.0F, 0.0F, 0.0F);
	glTexCoord2f(0.0, 0.0);
	glVertex3f(5 + x, 5 + y, 5 + z);
	glTexCoord2f(0.0, 1.0);
	glVertex3f(5 + x, -5 + y, 5 + z);
	glTexCoord2f(1.0, 1.0);
	glVertex3f(5 + x, -5 + y, -5 + z);
	glTexCoord2f(1.0, 0.0);
	glVertex3f(5 + x, 5 + y, -5 + z);
	glEnd();
	//5----------------------------    
	glBegin(GL_QUADS);
	glNormal3f(-1.0F, 0.0F, 0.0F);
	glTexCoord2f(0.0, 0.0);
	glVertex3f(-5 + x, -5 + y, -5 + z);
	glTexCoord2f(0.0, 1.0);
	glVertex3f(-5 + x, -5 + y, 5 + z);
	glTexCoord2f(1.0, 1.0);
	glVertex3f(-5 + x, 5 + y, 5 + z);
	glTexCoord2f(1.0, 0.0);
	glVertex3f(-5 + x, 5 + y, -5 + z);
	glEnd();
	//6----------------------------*/    

	glPopMatrix();

}

void drawInsideWall(int x, int y, int z){
	glPushMatrix();
	glTranslatef(-100.0f, 0, -100.0f);


	for (int i = 20; i < x; i += 10){
		for (int j = 0; j < 10; j += 10){
			for (int l = 0; l < 10; l += 10){
				drawWall(i, j, l);
				isWall[i / 10][l / 10] = 1;


			}
		}
	}

	for (int i = 0; i < 10; i += 10){
		for (int j = 0; j < 10; j += 10){
			for (int l = 0; l < z; l += 10){
				drawWall(i, j, l);
				isWall[i / 10][l / 10] = 1;

			}
		}
	}

	for (int i = 190; i < x; i += 10)
  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值