下载 >  开发技术 >  C++ > 3D迷宫(源代码+演示程序)

3D迷宫(源代码+演示程序) 评分:

前面几日我重新实现了迷宫的自动生成方法,并且添加了迷宫自动寻路方法。有了一个独立于GUI的迷宫库,我开始迫不及待地实现三维迷宫了! 下面是我在开发迷宫程序中遇到的问题。 1、怎样将迷宫类的行和列映射到真实的三维坐标中?迷宫应该用哪个参考系来描述? 其实我在制作的时候为了简化,将二维迷宫的左上角与三维的原点重合,二维迷宫的右对应三维的X轴正方向,迷宫的下对应Z轴的正方向。 2、迷宫的“上、下、左、右”在三维中应该叫做什么? 在确定好迷宫的位置后,我们将迷宫的上对应Z轴的负半轴,下对应Z轴的正半轴,左对应X轴的负半轴,右对应Y轴的正半轴。 3、三维点绘制顺序以及OpenGL裁剪模式造成的一些面不可见问题。 这个问题是我在编写二维迷宫没有想到的。主要是因为二 维迷宫中描述墙是用一条直线,而到了三维则是一个面。由于在OpenGL中有裁剪模式可以选择,我使用了 glFrontFace( GL_CW ); // 顺时针的绘制为正面 glEnable( GL_CULL_FACE ); // 剔除不是正面的面 进行设定,也就是说,所有在摄像机看来是逆时针绘制的图形都无法显示。因此我不得不用同样的顶点绘制两个面。下面是相关的函数: void DrawInnerWall( Point3F& p1, Point3F& p2, Point3F& p3, Point3F& p4 ) { glTexCoord2f( 0.0f, 1.0f ); glVertex3fv( p1 ); glTexCoord2f( 1.0f, 1.0f ); glVertex3fv( p2 ); glTexCoord2f( 1.0f, 0.0f ); glVertex3fv( p3 ); glTexCoord2f( 0.0f, 0.0f ); glVertex3fv( p4 ); } void DrawOuterWall( Point3F& p1, Point3F& p2, Point3F& p3, Point3F& p4 ) { glTexCoord2f( 1.0f, 1.0f ); glVertex3fv( p1 ); glTexCoord2f( 0.0f, 1.0f ); glVertex3fv( p2 ); glTexCoord2f( 0.0f, 0.0f ); glVertex3fv( p3 ); glTexCoord2f( 1.0f, 0.0f ); glVertex3fv( p4 ); } 在编写这些函数的时候尤其注意纹理坐标的绘制顺序。可以在纸上绘制一个草图。下面是我调用的代码: if ( Cell_UpWall( cell ) ) { DrawInnerWall( p8, p7, p3, p4 ); DrawOuterWall( p7, p8, p4, p3 ); } 4、怎样设置阻挡? 设置阻挡的基本原则还是先检测后执行。首先我先尝试着执行走一步,再判断这一步是不是出现了越界问题。如果出现了越界问题,那么不执行这一步,否则执行这一步。为了不让我们无限地靠近墙,我设定了一个gap,即摄像机必须与墙保持gap的距离。 下面是我相关的代码: bool View3D::CanGo( Maze& maze, float step ) { static float gap = m_CellSize.w / 8.0f;// 摄像机与墙最近不能超过的间隔 const Point3F& pos = m_Camera.Pos( ); Point3F tryPos; if ( pos.y > 0 && pos.y < m_CellSize.h )// 在一个墙的高度之内 { m_Camera.TryMoveForward( tryPos, step ); unsigned short row = pos.z / m_CellSize.w + 1, column = pos.x / m_CellSize.w + 1; unsigned long cell = maze.Cell( row, column ); // 根据迷宫小房间的墙来判断是否可行 bool ret = true; if ( Cell_UpWall( cell ) ) ret &= ( tryPos.z - gap > ( row - 1 ) * m_CellSize.w ); if ( Cell_DownWall( cell ) ) ret &= ( tryPos.z + gap < row * m_CellSize.w ); if ( Cell_LeftWall( cell ) ) ret &= ( tryPos.x - gap > ( column - 1 ) * m_CellSize.w ); if ( Cell_RightWall( cell ) ) ret &= ( tryPos.x + gap < column * m_CellSize.w ); return ret; } return true; } 但是这里还是出现了一点小Bug,摄像机在移动至一个墙角时再也无法移动了。我想可能是我设定的gap有问题。暂时我还拿不出什么有效的办法。 5、绘制二维视图的问题。 这其中迷宫绘制的环节与我上次写的代码基本一致。关键在于箭头的绘制。当摄像机移动时,我们需要更新二维视图中箭头的角度。难点在于如何确定这个角度?二维中我们使用的x-y坐标系,三维中我们需要重点关注的是x-z坐标系。注意这一点,摄像机默认是向着(0,0,-1)看的。设需要旋转的角度为rotateAngle1,摄像机的位置位CameraPos,那么有这样的公式: rotateAngle1 = 90° + arctan( CameraPos.z / CameraPos.x ) 又由于glRotate()是沿着逆时针旋转的,所以最终旋转角度 rotateAngle = 360° - ( rotateAngle1 ) = 270° - arctan( CameraPos.z / CameraPos.x ) math.h里面提供了atan2()函数,可以提供在(-π/2, π/2)范围内的角度。把这个问题解决了,那么箭头的绘制以及更新也就变得不那么困难了。
...展开详情收缩
2012-12-22 上传大小:737KB
分享
收藏 (2) 举报

评论 共15条

u010398378 要评价才能重新下载
2018-01-13
回复
gerard_qiu 不能运行...只能看看代码
2016-10-22
回复
ccccchhhhh_____ 对我自己编程还是没有直接的帮助。
2016-09-23
回复
zhango5 用了6分,却下载失败,这是什么鬼啊
2016-07-12
回复
u011015122 代码比较乱,许多类只有头文件,没有对应的实现。很多地方缺少必要的注释,也没有整个工程的说明文件。如果要0分,尚可给中评,要高达6分,只能给差评。 另外,这个工程是qt的工程,用qt creator打开,不要用vs打开。
2016-03-16
回复
wangkpp 没有工程文件- -...不过还是可以借鉴一下的
2015-12-07
回复
u010104066 感觉6分完全不值
2015-06-09
回复
lt853692686 很全的源码,很有用,谢谢分享
2014-12-19
回复
xingji_cdd 看起来像是Qt控制台工程,但是完全没法运行。。还要6分!!
2014-12-04
回复
monkeylzx 谢谢分享,下来看看,没法运行,可以参考一下
2014-02-07
回复
unity的迷宫生成算法
Unity 自动迷宫生成demo

Unity 迷宫插件,通过配置自动化生成迷宫地图,适合探险类游戏的开发

立即下载
C#三大迷宫生成算法
Unity3D之迷宫寻路使用_直接寻路
迷宫代码实现 --- 详细解说每一步
简单的c#迷宫小游戏基本代码
Unity3D之迷宫寻路_A*最短路径寻路
世界编程大赛冠军写的程序(谁能告诉我他是什么原理??)
android 小球快跑源代码 3D物理传感器游戏

android 小球快跑源代码 3D物理传感器游戏

立即下载
迷宫游戏代码下载
基于Unity3D迷宫游戏制作

自己写的一个Unity3D的一个迷宫游戏,希望能给大家借鉴学习

立即下载
一个unity迷宫小游戏

unity 迷宫游戏 有倒计时,主角是螃蟹,可以发射子弹打敌人,一开始是GUI界面选择关卡。

立即下载
UnityShader 实现2D游戏迷雾
Egret 2d 实现黑暗下光照效果
用webgl打造自己的3D迷宫游戏
Java Maze3D迷宫游戏源码

Java Maze3D迷宫游戏源码,浏览器上只要安上JAVA解释器就能运行,三维显示迷宫,点击 "New" 按钮开始迷宫之旅, 找不到出口的时候点击"Solve" 按钮显示红色的出口线路,点击"Clear" 清除解答。按上、下、左、右光标键可以单步找出口。

立即下载
数据结构源码--迷宫
3D迷宫(啊啊啊我要预习)java版
随机生成一个迷宫并探索一条路径的JAVA实现
Android实现迷宫游戏

走迷宫是一款益智类经典小游戏。本软件实现了迷宫的随机生成,用户进入欢迎页面后可以查看游戏说明,也可以直接开始游戏,游戏分为容易和困难两个等级。选择等级进入游戏界面后,用户通过屏幕下方4个方向键控制行走路线,用户将小红点从左上角移动到右下角就视为成功闯关。同时还提供了循环播放背景音乐,左下角的按键可以播放背景音乐,右下角的按键可以暂停背景音乐的播放。

立即下载

热点文章

img

spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip

资源所需积分/C币 当前拥有积分 当前拥有C币
5 0 0
点击完成任务获取下载码
输入下载码
为了良好体验,不建议使用迅雷下载
img

3D迷宫(源代码+演示程序)

会员到期时间: 剩余下载个数: 剩余C币: 剩余积分:0
为了良好体验,不建议使用迅雷下载
VIP下载
您今日下载次数已达上限(为了良好下载体验及使用,每位用户24小时之内最多可下载20个资源)

积分不足!

资源所需积分/C币 当前拥有积分
您可以选择
开通VIP
4000万
程序员的必选
600万
绿色安全资源
现在开通
立省522元
或者
购买C币兑换积分 C币抽奖
img

资源所需积分/C币 当前拥有积分 当前拥有C币
5 4 45
为了良好体验,不建议使用迅雷下载
确认下载
img

资源所需积分/C币 当前拥有积分 当前拥有C币
9 0 0
为了良好体验,不建议使用迅雷下载
VIP和C币套餐优惠
img

资源所需积分/C币 当前拥有积分 当前拥有C币
5 4 45
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
确认下载
下载
您还未下载过该资源
无法举报自己的资源

兑换成功

你当前的下载分为234开始下载资源
你还不是VIP会员
开通VIP会员权限,免积分下载
立即开通

你下载资源过于频繁,请输入验证码

您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:webmaster@csdn.net!

举报

  • 举报人:
  • 被举报人:
  • *类型:
    • *投诉人姓名:
    • *投诉人联系方式:
    • *版权证明:
  • *详细原因: