游戏开发论坛

 找回密码
 立即注册
搜索
查看: 20615|回复: 9

3D A*寻路算法实现

[复制链接]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2011-10-25 12:02:00 | 显示全部楼层 |阅读模式
作者博客:crown


图1旱桥的寻路(粉红色块为路径)


图2螺旋楼梯的寻路(粉红色块为路径)


  当场景的碰撞使用3D以后相关的寻路也应该具有3D寻路功能,由于引擎中的碰撞格分为多层,所以在开启一个节点的时候就需要将每一层进行判断,判断条件主要是2个a碰撞格不能为红色b高度差不能超过一定的范围,为了寻路更有效率,增加了一个高度方向的启发值,当两个节点在平面方向与目标距离相等,但高度方向有区别那么与目标高度相差较小的节点优先遍历,其它的过程与2D的a*寻路算法没什么区别。我的寻路算法中使用了二叉堆管理Open表,代码如下,供大家参考,SOpenMask是节点的结构定义,AddOpenMask函数功能是将一个节点放入Open表中,GetMinOpenMask函数是从Open表中取出具有最小权值的节点,上图是3d a*寻路算法的结果演示。

struct SOpenMask
{


SOpenMask *pFather;
SOpenMask *pLeft;
SOpenMask *pRight;
};

int CAStarTrace::AddOpenMask( SOpenMask* pOpenMask, SOpenMask* pHead )
{
if( pHead == NULL )
{
  m_pOpenHead = pOpenMask;
  return 0;
}
if( pHead->nDistance <= pOpenMask->nDistance )
{
  if( pHead->pRight == NULL )
  {
   pHead->pRight = pOpenMask;
   pOpenMask->pFather = pHead;
  }
  else
   AddOpenMask( pOpenMask, pHead->pRight );
}
else
{
  if( pHead->pLeft == NULL )
  {
   pHead->pLeft = pOpenMask;
   pOpenMask->pFather = pHead;
  }
  else
   AddOpenMask( pOpenMask, pHead->pLeft );
}
return 0;
}

SOpenMask* CAStarTrace::GetMinOpenMask( SOpenMask* pHead )
{
if( pHead == NULL )
  return NULL;
if( pHead->pLeft == NULL )
{
  SOpenMask * pMinNode = pHead;
  if( pHead->pFather == NULL )
  {
   m_pOpenHead = pHead->pRight;
   if( m_pOpenHead )
    m_pOpenHead->pFather = NULL;
  }
  else
  {
   pHead->pFather->pLeft = pHead->pRight;
   if( pHead->pRight )
    pHead->pRight->pFather = pHead->pFather;
  }
  return pMinNode;
}
else
  return GetMinOpenMask( pHead->pLeft );
}

0

主题

243

帖子

357

积分

中级会员

Rank: 3Rank: 3

积分
357
发表于 2011-10-27 09:57:00 | 显示全部楼层

Re:3D A*寻路算法实现

是否可走的信息完全靠格子?不知道可走信息是怎么生成的?
大场景的话手动编辑工作量不小,靠这么密集的格子来搜路效率也不知道怎样。

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2011-10-30 10:06:00 | 显示全部楼层

Re: Re:3D A*寻路算法实现

DeALLBugs: Re:3D A*寻路算法实现

是否可走的信息完全靠格子?不知道可走信息是怎么生成的?
大场景的话手动编辑工作量不小,靠这么密集的格子来搜路效率也不知道怎样。


有编辑器用刷子刷。你WC3的地图也是这么刷出来的。

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-10-30 20:14:00 | 显示全部楼层

Re:3D A*寻路算法实现

这寻路算法,只能用在客户端吧,服务器这样做应该搞不定吧!

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-10-30 20:16:00 | 显示全部楼层

Re:3D A*寻路算法实现

如果是用格子存地图的话,open表可以做到o(1)的效率,不需要用二叉堆!

0

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2011-11-1 10:00:00 | 显示全部楼层

Re: Re:3D A*寻路算法实现

zjuzhanghui: Re:3D A*寻路算法实现

这寻路算法,只能用在客户端吧,服务器这样做应该搞不定吧!


我觉得这应该只是一个基本单位的搜索。

21

主题

124

帖子

176

积分

注册会员

Rank: 2

积分
176
发表于 2011-11-3 10:42:00 | 显示全部楼层

Re: 3D A*寻路算法实现

[em1] 我最关心的是效率怎么样!!

0

主题

243

帖子

357

积分

中级会员

Rank: 3Rank: 3

积分
357
发表于 2011-11-8 17:48:00 | 显示全部楼层

Re: Re: Re:3D A*寻路算法实现

lingjingqiu: Re: Re:3D A*寻路算法实现



有编辑器用刷子刷。你WC3的地图也是这么刷出来的。


相对于navmesh,看不出有什么优势,格子太小了,效率必然不会太高。
刷格子看起来也更费时费力,WC3的格子可都是2D的,刷起来不会太痛苦。。。

0

主题

1

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2011-11-14 01:24:00 | 显示全部楼层

Re: 3D A*寻路算法实现

3D地图必然格子太多,效率低下,且精度不高对于一些细小的结构不能处理。人工刷格子太累。

3D 一般用自动生成的 NavMesh。

0

主题

51

帖子

51

积分

注册会员

Rank: 2

积分
51
发表于 2012-9-25 22:10:00 | 显示全部楼层

Re:3D A*寻路算法实现

难道也类似于2d格子中的0.,1 实现,但是3d不是用的碰撞吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-27 16:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表