终于完成了3D空间寻路的心愿

主要工作有三:

一、数据组织。根据3D模型得到一个PathMesh,这个PathMesh里记录了三角形与边的邻接信息,边与三角形的邻接信息,边的端点,边的方程(用于求解线段最短距离)。从而间接知道边与边的邻接信息。路径点除了首尾,都通过边来计算。这个数据容易得到。

二、路径搜索算法。一开始使用A*算法,路径不是很好。因为评估函数不好写,评估函数只能描述两个点之间的空间距离,但是无法描述上下楼很难到达这样的信息。所以,A*算法总会先走到目标点的楼下,然后在绕道到目标点。后来改用广度优先搜索,效果很好。考虑到3D空间中寻路,实际的节点数目不是很多,准备采用广度优先搜索。A*对我来说,也很容易。

三、路径美化。这个就是一直以来的心病。因为PathMesh可能是各种各样的样子,导致路径可能会非常难看,怎样优化路径使得看上去美,看上去聪明。至于算法,示意图见图:

(怎么传图片?讯问中。。。)

 

     struct  NodeInfo
    
{
        V3Vector3 p;                        
//具体坐标
        SideInfo * s;                        //
        FLOAT t;                            //边上的位置
    }
;

    
void  Mesh::FixPath(UINT nTimes)
    
{
        UINT nCount 
= (UINT)m_Result.size();
        
if(nCount < 3)
            
return ;
        nCount 
-= 2;
        
for(; nTimes > 0--nTimes)
        
{
            
for(UINT i=0; i<nCount; ++i)
            
{
                NodeInfo 
& s = m_Result[i];
                NodeInfo 
& c = m_Result[i+1];
                NodeInfo 
& e = m_Result[i+2];
                SideInfo 
& si = *c.s;

                FLOAT n;
                DistanceSquaredLineLine(si.line,V3Line3(s.p,e.p
-s.p),&n);
                
if(n >= 0.0f && n < 1.0f)
                
{
                    c.p 
= get_side_pos(si,n);
                    c.t 
= n;
                }

            }

        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值