(我们方向课的实验,发出来跟大家交流下)
设计一个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)