OpenGL三维迷宫创建及交互
「实验题目」
了解图形系统的性能, 掌握可交互的OpenGL应用程序的开发设计的方法,掌握系统处理鼠标和键盘事件的编程方法,掌握并学会利用OpenGL开发场景漫游程序的编程方法,掌握并学会利用OpenGL纹理映射的方法。
「题目分析」
看看实现这个题目我们需要怎么入手。
1. 三维迷宫怎么绘制出来?迷宫的结构各种墙体位置怎么储存?
- 要建立一个迷宫的话,最不可缺少的就是墙体了。墙块是六面体,所以我们需要做六面体的绘制;其次你是否需要其他的三维立体元素,比如球体之类的?
- 迷宫的结构可以用一个方阵以0/1 代表 有墙/没墙,这样储存;也可以从一个文件中读入墙体位置信息,解析保存,有很多很多方法选择哪一种?
2. 怎么实现前进后退,视角的转换?
- 关键在于对gluLookAt( )这个函数的参数进行调整
3. 剩下一些细碎的东西
- 碰撞检测怎么去做?有没有
想卷的其他模块?
三维"图元"的绘制
迷宫中最多的几何元素就是作为墙体的六面体了。顾名思义,我们可以通过绘制六个面拼接成六面体。
有趣的是,定义一个六面体我们只需要体对角线上的两个点就足够了。这里并不是使用的这种定义方式绘制的,在光线追踪中实现轴包围盒AABB时可以注意这种简单的定义,不过这种小demo倒是无所谓随便操作。
六面体绘制
//6个面 一个墙块
void drawWallGeneric(GLenum mode,double ax,double ay,double bx,double by,double height,double width)
{
glEnable(mode);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glBindTexture(GL_TEXTURE_2D, texName);
double cx,cy,dx,dy;
cx = ax;
cy = ay + width;
dx = bx;
dy = by + width;
glPushMatrix();
{
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);glVertex3f(ax,ay,0);
glTexCoord2f(0.0, 1.0);glVertex3f(bx,by,0);
glTexCoord2f(1.0, 1.0);glVertex3f(bx,by,height);
glTexCoord2f(1.0, 0.0);glVertex3f(ax,ay,height);
glEnd();
}
glPopMatrix();
glPushMatrix();
{
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);glVertex3f(cx,cy,0);
glTexCoord2f(0.0, 1.0);glVertex3f(dx,dy,0);
glTexCoord2f(1.0, 1.0);glVertex3f(dx,dy,height);
glTexCoord2f(1.0, 0.0);glVertex3f(cx,cy,height);
glEnd();
}
glPopMatrix();
glPushMatrix();
{
glTranslatef(0,0,height);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);glVertex3f(ax,ay,0);
glTexCoord2f(0.0, 1.0);glVertex3f(bx,by,0);
glTexCoord2f(1.0, 1.0);glVertex3f(dx,dy,0);
glTexCoord2f(1.0, 0.0);glVertex3f(cx,cy,0);
glEnd();
}
glPopMatrix();
glPushMatrix();
{
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);glVertex3f(ax,ay,height);
glTexCoord2f(0.0, 1.0);glVertex3f(bx,by,height);
glTexCoord2f(1.0, 1.0);glVertex3f(dx,dy,height);
glTexCoord2f(1.0, 0.0);glVertex3f(cx,cy,height);
glEnd(