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

该博客介绍了一个使用OpenGL实现三维迷宫创建及交互的实验,包括三维图元绘制、迷宫结构储存、视角转换、碰撞检测和纹理贴图。通过分析和实现,详细探讨了如何使用OpenGL进行场景漫游和纹理映射,以及如何处理鼠标和键盘事件以实现迷宫中的导航。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值