失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 计算机图形学实验————漫游三维迷宫

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

时间:2023-07-04 04:06:38

相关推荐

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

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

设计一个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)

如果觉得《计算机图形学实验————漫游三维迷宫》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。